Advertisement
Guest User

Untitled

a guest
Jun 26th, 2016
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 21.41 KB | None | 0 0
  1. МОДЕЛИ
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Core
  5. from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
  6. from django.template.loader import render_to_string
  7. from django.core.mail import EmailMultiAlternatives
  8. from django.utils.translation import ugettext as _
  9. from django.utils import timezone, six
  10. from django.conf import settings
  11. from django.db import models
  12. import datetime
  13. import hashlib
  14. import random
  15.  
  16. # Project
  17. from .managers import CustomUserManager
  18.  
  19.  
  20. class AbstractCustomUser(AbstractBaseUser, PermissionsMixin):
  21.     """
  22.    User fields
  23.    """
  24.     email = models.EmailField(_(u'Email'), max_length=255, unique=True)
  25.     phone = models.CharField(_(u'Телефон'), max_length=20)
  26.     city = models.CharField(_(u'Город'), max_length=30)
  27.     street = models.CharField(_(u'Улица'), max_length=30)
  28.     house = models.CharField(_(u'Дом'), max_length=30)
  29.     flat = models.CharField(_(u'Квартира'), max_length=30, null=True, blank=True)
  30.     note = models.CharField(_(u'Описание'), max_length=255, null=True, blank=True)
  31.     votes = models.IntegerField(_(u'Количество голосов'), default=0)
  32.     likes = models.IntegerField(_(u'Количество лайков'), default=0)
  33.     dislikes = models.IntegerField(_(u'Количество дизлайков'), default=0)
  34.  
  35.     """
  36.    Customer fields
  37.    """
  38.     first_name = models.CharField(_(u'Имя'), max_length=30, null=True, blank=True)
  39.     last_name = models.CharField(_(u'Фамилия'), max_length=30, null=True, blank=True)
  40.  
  41.     """
  42.    Manufacturer fields
  43.    """
  44.     TYPE = (
  45.         ('1', u"ИП"),
  46.         ('2', u"ООО"),
  47.         ('3', u"Физическое лицо"),
  48.     )
  49.  
  50.     company_name = models.CharField(_(u'Название организации'), max_length=50, null=True, blank=True)
  51.     company_type = models.CharField(_(u'Тип организации'), max_length=1, null=True, blank=True, choices=TYPE)
  52.     company_logotype = models.ImageField(_(u'Логотип организации'), null=True, blank=True)
  53.  
  54.     """
  55.    System fields
  56.    """
  57.     ACTIVATED = u"ALREADY_ACTIVATED"
  58.     RESETED = u"ALREADY_RESETED"
  59.     activation_key = models.CharField(_(u'Ключ активании'), max_length=40)
  60.     reset_password_key = models.CharField(_(u'Ключ сброса пароля'), max_length=40, null=True)
  61.     date_joined = models.DateTimeField(_(u'Дата регистрации'), default=timezone.now)
  62.     is_active = models.BooleanField(_(u'Активный'), default=False)
  63.     is_customer = models.BooleanField(_(u'Покупатель'), default=False)
  64.     is_manufacturer = models.BooleanField(_(u'Продавец'), default=False)
  65.  
  66.     USERNAME_FIELD = 'email'
  67.  
  68.     REQUIRED_FIELDS = ['first_name', 'last_name', 'phone']
  69.  
  70.     objects = CustomUserManager()
  71.  
  72.     class Meta:
  73.         verbose_name = _(u'Пользователь')
  74.         verbose_name_plural = _(u'Пользователи')
  75.         abstract = True
  76.  
  77.     def make_key(self):
  78.         salt = hashlib.sha1(six.text_type(random.random())
  79.                             .encode('ascii')).hexdigest()[:5]
  80.         salt = salt.encode('ascii')
  81.         user_pk = str(self.pk)
  82.         if isinstance(user_pk, six.text_type):
  83.             user_pk = user_pk.encode('utf-8')
  84.         return hashlib.sha1(salt+user_pk).hexdigest()
  85.  
  86.     def make_activation_key(self):
  87.         self.activation_key = self.make_key()
  88.         self.save()
  89.  
  90.     def make_reset_password_key(self):
  91.         self.reset_password_key = self.make_key()
  92.         self.save()
  93.  
  94.     def activation_key_expired(self):
  95.         expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS)
  96.         return (self.activation_key == self.ACTIVATED or
  97.                 (self.date_joined + expiration_date <= timezone.now()))
  98.  
  99.     def send_activation_email(self, password=None):
  100.         ctx = {
  101.             'activation_key': self.activation_key,
  102.             'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
  103.         }
  104.  
  105.         if password is not None:
  106.             ctx.update({'login': self.email, 'password': password})
  107.  
  108.         subject = _(u'Активация аккаунта в BakeStreet')
  109.         message_txt = render_to_string('profiles/activation_email.txt', ctx)
  110.         message_html = render_to_string('profiles/activation_email.html', ctx)
  111.         self.send_email(subject, message_txt, message_html)
  112.  
  113.     def send_reset_password_email(self):
  114.         ctx = {
  115.             'login': self.email,
  116.             'reset_password_key': self.reset_password_key,
  117.         }
  118.  
  119.         subject = u'Сброс пароля в BakeStreet'
  120.         message_txt = render_to_string('profiles/reset_password_email.txt', ctx)
  121.         message_html = render_to_string('profiles/reset_password_email.html', ctx)
  122.         self.send_email(subject, message_txt, message_html)
  123.  
  124.     def send_email(self, subject, message_txt, message_html):
  125.         email_message = EmailMultiAlternatives(subject, message_txt,
  126.                                                settings.EMAIL_HOST_USER, [self.email])
  127.         email_message.attach_alternative(message_html, 'text/html')
  128.         email_message.send()
  129.  
  130.     def make_password_reseted(self):
  131.         self.reset_password_key = self.RESETED
  132.  
  133.     def get_full_name(self):
  134.         return u'{} {}'.format(self.last_name, self.first_name)
  135.  
  136.     def get_short_name(self):
  137.         return self.first_name
  138.  
  139.     @property
  140.     def address(self):
  141.         if self.city and self.street and self.house and self.flat:
  142.             return u'{}, {}, {}, {}'.format(self.city, self.street, self.house, self.flat)
  143.         elif self.city and self.street and self.house:
  144.             return u'{}, {}, {}'.format(self.city, self.street, self.house)
  145.         return u''
  146.  
  147.     @property
  148.     def percent_likes(self):
  149.         if self.votes > 0:
  150.             return u'{0:.0%}'.format(self.likes/self.votes)
  151.         return u'{0:.0%}'.format(0)
  152.  
  153.     @property
  154.     def percent_dislikes(self):
  155.         if self.votes > 0:
  156.             return u'{0:.0%}'.format(self.dislikes/self.votes)
  157.         return u'{0:.0%}'.format(0)
  158.  
  159.     @property
  160.     def is_staff(self):
  161.         return self.is_superuser
  162.  
  163.     @property
  164.     def is_activated(self):
  165.         return self.activation_key == self.ACTIVATED
  166.  
  167.     def __str__(self):
  168.         return self.email
  169.  
  170.  
  171. class User(AbstractCustomUser):
  172.     class Meta(AbstractCustomUser.Meta):
  173.         swappable = "AUTH_USER_MODEL"
  174.  
  175.  
  176.  
  177. ФОРМЫ
  178. # -*- coding: utf-8 -*-
  179.  
  180. # Core
  181. from django import forms
  182.  
  183. # Project
  184. from .models import User
  185.  
  186.  
  187. class CustomerForm(forms.ModelForm):
  188.     class Meta:
  189.         model = User
  190.         fields = ['email', 'first_name', 'last_name', 'phone',
  191.                   'city', 'street', 'house', 'flat']
  192.  
  193.     def __init__(self, *args, **kwargs):
  194.         super(CustomerForm, self).__init__(*args, **kwargs)
  195.         self.fields['first_name'].required = True
  196.         self.fields['last_name'].required = True
  197.  
  198.  
  199. class ManufacturerForm(forms.ModelForm):
  200.     class Meta:
  201.         model = User
  202.         fields = ['company_name', 'company_type', 'company_logotype', 'phone',
  203.                   'city', 'street', 'house', 'note', 'email']
  204.  
  205.     def __init__(self, *args, **kwargs):
  206.         super(ManufacturerForm, self).__init__(*args, **kwargs)
  207.         self.fields['company_name'].required = True
  208.         self.fields['company_type'].required = True
  209.         self.fields['company_logotype'].required = True
  210.  
  211.  
  212.  
  213. ВЬЮХИ
  214. # -*- coding: utf-8 -*-
  215.  
  216. # Core
  217. from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm
  218. from django.views.generic import CreateView, UpdateView, FormView, View, DetailView
  219. from django.shortcuts import redirect, render, get_object_or_404, Http404
  220. from django.contrib.auth import login, logout, update_session_auth_hash
  221. from django.contrib.auth.decorators import login_required
  222. from django.utils.translation import ugettext as _
  223. from django.core.urlresolvers import reverse_lazy
  224. from django.contrib import messages
  225. import re
  226.  
  227. # Project
  228. from .forms import CustomerForm, ManufacturerForm
  229. from utils.paginator import get_page_object
  230. from categories.models import Category
  231. from products.models import Product
  232. from .models import User
  233.  
  234. # Django-braces
  235. from braces.views import JSONResponseMixin, AjaxResponseMixin, LoginRequiredMixin
  236.  
  237.  
  238. def activation_view(request, activation_key):
  239.     activated_user = User.objects.activate_user(activation_key)
  240.     if activated_user:
  241.         if activated_user.is_manufacturer:
  242.             messages.success(request, _(u'Ваша аккаунт подтвержден!'
  243.                                         u'Ожидайте подтвержения администрацией сайта'))
  244.         else:
  245.             messages.success(request, _(u'Ваш аккаунт активирован!'))
  246.         return redirect('signin')
  247.     else:
  248.         raise Http404
  249.  
  250.  
  251. class SignInView(FormView):
  252.     form_class = AuthenticationForm
  253.     template_name = 'profiles/signin_form.html'
  254.     success_url = 'index'
  255.  
  256.     def dispatch(self, *args, **kwargs):
  257.         if self.request.user.is_authenticated():
  258.             return redirect('index')
  259.         return super(SignInView, self).dispatch(*args, **kwargs)
  260.  
  261.     def form_valid(self, form):
  262.         next_url = self.request.GET.get('next', None)
  263.         print(next_url)
  264.         if next_url is not None:
  265.             self.success_url = next_url
  266.         user = form.get_user()
  267.         login(self.request, user)
  268.         return redirect(self.success_url)
  269.  
  270.  
  271. class SignInAjaxView(JSONResponseMixin, AjaxResponseMixin, View):
  272.     def post_ajax(self, request, *args, **kwargs):
  273.         form = AuthenticationForm(data=request.POST)
  274.         if form.is_valid():
  275.             user = form.get_user()
  276.             login(self.request, user)
  277.             return self.render_json_response({}, status=200)
  278.         else:
  279.             return self.render_json_response({'msg': _(u'Неправильный email или пароль')}, status=400)
  280.  
  281.  
  282. def signout(request):
  283.     logout(request)
  284.     response = redirect('index')
  285.     """
  286.    response.delete_cookie('cart_count')
  287.    response.delete_cookie('cart_total')
  288.    """
  289.     return response
  290.  
  291.  
  292. class ChangePasswordView(LoginRequiredMixin, View):
  293.     form_class = PasswordChangeForm
  294.     success_url = 'profiles:profile'
  295.     login_url = 'signin'
  296.     template_name = 'profiles/password_change_form.html'
  297.  
  298.     def get(self, request):
  299.         form = self.form_class(user=request.user)
  300.         return render(request, self.template_name, {'form': form})
  301.  
  302.     def post(self, request):
  303.         form = self.form_class(user=request.user, data=request.POST)
  304.         if form.is_valid():
  305.             form.save()
  306.             update_session_auth_hash(request, form.user)
  307.             messages.success(request, _(u'Ваш пароль изменен!'))
  308.             return redirect(self.success_url)
  309.         return render(request, self.template_name, {'form': form})
  310.  
  311.  
  312. class ResetPasswordView(FormView):
  313.     form_class = PasswordResetForm
  314.     success_url = 'index'
  315.     template_name = 'profiles/password_reset_form.html'
  316.  
  317.     def form_valid(self, form):
  318.         email = form.cleaned_data['email']
  319.         User.objects.reset_password(email)
  320.         messages.success(self.request, _(u'Инструкции по сбросу пароля отправлены на Вашу почту!'))
  321.         return redirect(self.success_url)
  322.  
  323.  
  324. class SetPasswordView(View):
  325.     form_class = SetPasswordForm
  326.     success_url = 'index'
  327.     template_name = 'profiles/set_new_password_form.html'
  328.     user = None
  329.  
  330.     def get(self, request, reset_key):
  331.         self.user = get_object_or_404(User, reset_password_key=reset_key)
  332.         form = self.form_class(user=self.user)
  333.         return render(request, self.template_name, {'form': form})
  334.  
  335.     def post(self, request, reset_key):
  336.         form = self.form_class(user=self.user, data=request.POST)
  337.         if form.is_valid():
  338.             user = form.save(commit=False)
  339.             user.make_password_reseted()
  340.             form.save()
  341.         messages.success(request, _(u'Ваш пароль изменен!'))
  342.         return redirect(self.success_url)
  343.  
  344.     def dispatch(self, *args, **kwargs):
  345.         self.user = User.objects.check_reset_password_key(self.kwargs['reset_key'])
  346.         if self.user:
  347.             return super(SetPasswordView, self).dispatch(*args, **kwargs)
  348.         raise Http404
  349.  
  350.  
  351. class SignUpMixin(CreateView):
  352.     success_url = 'index'
  353.     success_message = _(u'Спасибо за регистрацию! '
  354.                         u'Письмо с активацией аккаунта отправлено на ваш телефон')
  355.  
  356.  
  357. class CustomerSignUpView(SignUpMixin):
  358.     form_class = CustomerForm
  359.     template_name = 'profiles/customer_signup_form.html'
  360.  
  361.     def form_valid(self, form):
  362.         User.objects.create_customer(**form.cleaned_data)
  363.         messages.success(self.request, self.success_message)
  364.         return redirect(self.success_url)
  365.  
  366.  
  367. class ManufacturerSignUpView(SignUpMixin):
  368.     form_class = ManufacturerForm
  369.     template_name = 'profiles/manufacturer_signup_form.html'
  370.  
  371.     def form_valid(self, form):
  372.         User.objects.create_manufacturer(**form.cleaned_data)
  373.         messages.success(self.request, self.success_message)
  374.         return redirect(self.success_url)
  375.  
  376.  
  377. @login_required(login_url='signin')
  378. def profile_update(request):
  379.     user = request.user
  380.     if user.is_customer:
  381.         return CustomerUpdateView.as_view()(request)
  382.     if user.is_manufacturer:
  383.         return ManufacturerUpdateView.as_view()(request)
  384.  
  385.  
  386. class UpdateMixin(LoginRequiredMixin, UpdateView):
  387.     login_url = 'signin'
  388.     success_url = reverse_lazy('profiles:profile')
  389.     success_message = _(u'Информация изменена!')
  390.  
  391.     def get_object(self, queryset=None):
  392.         return self.request.user
  393.  
  394.     def form_valid(self, form):
  395.         messages.success(self.request, self.success_message)
  396.         return super(UpdateMixin, self).form_valid(form)
  397.  
  398.  
  399. class CustomerUpdateView(UpdateMixin):
  400.     form_class = CustomerForm
  401.     template_name = 'profiles/customer_update_form.html'
  402.  
  403.  
  404. class ManufacturerUpdateView(UpdateMixin):
  405.     form_class = ManufacturerForm
  406.     template_name = 'profiles/manufacturer_update_form.html'
  407.  
  408.  
  409. @login_required(login_url='signin')
  410. def profile_view(request):
  411.     user = request.user
  412.     if user.is_customer:
  413.         return CustomerView.as_view()(request)
  414.     if user.is_manufacturer:
  415.         return ManufacturerView.as_view()(request)
  416.  
  417.  
  418. class DetailMixin(LoginRequiredMixin, DetailView):
  419.     model = User
  420.     login_url = 'signin'
  421.  
  422.     def get_object(self, queryset=None):
  423.         return self.request.user
  424.  
  425.  
  426. class CustomerView(DetailMixin):
  427.     context_object_name = 'customer'
  428.     template_name = 'profiles/customer_detail.html'
  429.  
  430.  
  431. class ManufacturerView(DetailMixin):
  432.     context_object_name = 'manufacturer'
  433.     template_name = 'profiles/manufacturer_detail.html'
  434.  
  435.  
  436. class ManufacturerDetailView(DetailView):
  437.     model = User
  438.     context_object_name = 'manufacturer'
  439.     template_name = 'profiles/manufacturer_detail_for_customers.html'
  440.  
  441.     def get_object(self, queryset=None):
  442.         manufacturer = get_object_or_404(User, pk=self.kwargs['pk'])
  443.         if manufacturer.is_manufacturer and not manufacturer.is_superuser:
  444.             return manufacturer
  445.         raise Http404
  446.  
  447.  
  448. def manufacturer_list_view(request):
  449.     categories = Category.objects.all()
  450.     manufacturers = User.objects.filter(is_manufacturer=True).filter(is_active=True).filter(is_superuser=False)
  451.     param_categories = request.GET.getlist('category')
  452.     url = request.build_absolute_uri()
  453.     if param_categories:
  454.         products = Product.objects.filter(category__eng_name__in=param_categories).filter(is_published=True)
  455.         manufacturers = manufacturers.select_related().filter(product__in=products).distinct()
  456.         url = re.sub(r"(&page=)(\d+)", '', url)
  457.     manufacturers = get_page_object(request, manufacturers, 10)
  458.     return render(request, 'manufacturers.html', {'url': url,
  459.                                                   'params': param_categories,
  460.                                                   'categories': categories,
  461.                                                   'manufacturers': manufacturers})
  462.  
  463.  
  464.  
  465. МЕНЕДЖЕРЫ
  466. # -*- coding: utf-8 -*-
  467.  
  468. # Core
  469. from django.contrib.auth.models import BaseUserManager
  470. from django.utils.translation import ugettext as _
  471. from django.utils import timezone
  472. import re
  473.  
  474.  
  475. class CustomUserManager(BaseUserManager):
  476.     use_in_migrations = True
  477.  
  478.     def _create_user(self, email, password=None, first_name=None,
  479.                      last_name=None, company_name=None,
  480.                      company_type=None, is_customer=False,
  481.                      is_manufacturer=False, is_superuser=False,
  482.                      is_active=False, send_email=True, **extra_fields):
  483.  
  484.         now = timezone.now()
  485.  
  486.         if not email:
  487.             raise ValueError(_(u'Введите email!'))
  488.         email = self.normalize_email(email)
  489.  
  490.         user = self.model(email=email, first_name=first_name,
  491.                           last_name=last_name, company_name=company_name,
  492.                           company_type=company_type, is_customer=is_customer,
  493.                           is_manufacturer=is_manufacturer, is_superuser=is_superuser,
  494.                           is_active=is_active, date_joined=now, **extra_fields)
  495.  
  496.         if password is None:
  497.             password = self.make_random_password()
  498.  
  499.         user.set_password(password)
  500.         user.save(using=self._db)
  501.  
  502.         user.make_activation_key()
  503.  
  504.         if is_superuser:
  505.             user.activation_key = self.model.ACTIVATED
  506.             user.save()
  507.  
  508.         if send_email:
  509.             user.send_activation_email(password)
  510.  
  511.         return user
  512.  
  513.     def create_customer(self, email, first_name, last_name, **extra_fields):
  514.         return self._create_user(email=email, first_name=first_name,
  515.                                  last_name=last_name, is_customer=True,
  516.                                  **extra_fields)
  517.  
  518.     def create_manufacturer(self, email, company_name, company_type, **extra_fields):
  519.         return self._create_user(email=email, company_name=company_name,
  520.                                  company_type=company_type, is_manufacturer=True,
  521.                                  **extra_fields)
  522.  
  523.     def create_superuser(self, email, password, **extra_fields):
  524.         return self._create_user(email=email, password=password, is_customer=True,
  525.                                  is_manufacturer=True, is_superuser=True,
  526.                                  is_active=True, send_email=False, **extra_fields)
  527.  
  528.     def activate_user(self, activation_key):
  529.         SHA1_RE = re.compile('^[a-f0-9]{40}$')
  530.         if SHA1_RE.search(activation_key):
  531.             try:
  532.                 user = self.get(activation_key=activation_key)
  533.             except self.model.DoesNotExist:
  534.                 return False
  535.             if not user.activation_key_expired():
  536.                 if not user.is_manufacturer:
  537.                     user.is_active = True
  538.                 user.activation_key = self.model.ACTIVATED
  539.                 user.save()
  540.                 return user
  541.         return False
  542.  
  543.     def delete_expired_users(self):
  544.         for user in self.all():
  545.             if user.activation_key_expired():
  546.                 if not user.is_active:
  547.                     user.delete()
  548.  
  549.     def reset_password(self, email):
  550.         try:
  551.             user = self.get(email=email)
  552.         except self.model.DoesNotExist:
  553.             return False
  554.         user.make_reset_password_key()
  555.         user.send_reset_password_email()
  556.         return user
  557.  
  558.     def check_reset_password_key(self, reset_password_key):
  559.         SHA1_RE = re.compile('^[a-f0-9]{40}$')
  560.         if SHA1_RE.search(reset_password_key):
  561.             try:
  562.                 user = self.get(reset_password_key=reset_password_key)
  563.                 return user
  564.             except self.model.DoesNotExist:
  565.                 return False
  566.         return False
  567.  
  568.  
  569.  
  570. УРЛЫ
  571. # -*- coding: utf-8 -*-
  572.  
  573. # Core
  574. from django.conf.urls import url
  575.  
  576. # Project
  577. from .views import ChangePasswordView, ResetPasswordView, SetPasswordView, profile_update
  578. from .views import SignInAjaxView, profile_view, activation_view
  579. from portfolio.views import OwnerPortfolioListView
  580. from products.views import OwnerProductListView
  581. from reviews.views import ReviewsView
  582.  
  583. urlpatterns = [
  584.  
  585.     url(r'^$',
  586.         profile_view,
  587.         name='profile'),
  588.  
  589.     url(r'^ajaxsignin/$',
  590.         SignInAjaxView.as_view(),
  591.         name='ajax_signin'),
  592.  
  593.     url(r'^update/$',
  594.         profile_update,
  595.         name='update'),
  596.  
  597.     url(r'^rating/$',
  598.         ReviewsView.as_view(),
  599.         name='reviews'),
  600.  
  601.     url(r'^products/$',
  602.         OwnerProductListView.as_view(),
  603.         name='products'),
  604.  
  605.     url(r'^portfolio/$',
  606.         OwnerPortfolioListView.as_view(),
  607.         name='portfolio'),
  608.  
  609.     url(r'^activate/(?P<activation_key>\w+)/$',
  610.         activation_view,
  611.         name='activate'),
  612.  
  613.     url(r'^change_password/$',
  614.         ChangePasswordView.as_view(),
  615.         name='change_password'),
  616.  
  617.     url('^reset_password/$',
  618.         ResetPasswordView.as_view(),
  619.         name='reset_password'),
  620.  
  621.     url('^reset_password/(?P<reset_key>\w+)/$',
  622.         SetPasswordView.as_view(),
  623.         name='reset_password'),
  624.  
  625. ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement