You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
7.6 KiB
167 lines
7.6 KiB
# -*- coding: utf-8 -*-
|
|
from django import forms
|
|
from django.conf import settings
|
|
from django.contrib.auth.models import User
|
|
from django.contrib.auth import authenticate
|
|
|
|
from project.commons.forms import set_field_error
|
|
from project.customer import consts as customer_consts
|
|
|
|
|
|
PASSWORD_MIN_LEN = getattr(settings, 'PASSWORD_MIN_LEN ', 7)
|
|
|
|
PROFILE_CHOICES = (
|
|
(customer_consts.IP_PROFILE, u'Индивидуальный предприниматель (ИП)'),
|
|
(customer_consts.ORG_PROFILE, u'Организация (ООО, ЗАО, ОАО, НКО и т.п.)'),
|
|
)
|
|
|
|
|
|
class RegistrationForm(forms.Form):
|
|
"""Форма регистрации нового пользователя."""
|
|
email = forms.EmailField(label=u'E-mail', max_length=75, error_messages={'invalid': u'Неверный формат e-mail.',},
|
|
help_text=u'На него будет выслано письмо с подтверждением.')
|
|
|
|
password1 = forms.CharField(label=u'Пароль', min_length=PASSWORD_MIN_LEN, widget=forms.PasswordInput,
|
|
error_messages={'min_length': u'Не менее %s символов.' % PASSWORD_MIN_LEN,},
|
|
help_text=u'Не менее %s символов.' % PASSWORD_MIN_LEN)
|
|
|
|
password2 = forms.CharField(label=u'Повтор пароля', widget=forms.PasswordInput)
|
|
|
|
profile_type = forms.ChoiceField(label=u'Тип регистрации', choices=PROFILE_CHOICES, widget=forms.RadioSelect,
|
|
error_messages={'required': u'Нужно указать форму собственности вашего бизнеса.',})
|
|
|
|
def clean_email(self):
|
|
"""Проверить не занят ли email."""
|
|
email = self.cleaned_data['email']
|
|
try:
|
|
User.objects.get(email__iexact = email)
|
|
except User.DoesNotExist:
|
|
return email
|
|
raise forms.ValidationError(u'Такой e-mail уже зарегистрирован.')
|
|
|
|
def clean(self):
|
|
super(RegistrationForm, self).clean()
|
|
password1 = self.cleaned_data.get('password1')
|
|
password2 = self.cleaned_data.get('password2')
|
|
# проверить чтобы оба пароля совпадали
|
|
if password1 and password2:
|
|
if password1 != password2:
|
|
set_field_error(self, 'password2', u'Пароли не совпадают.')
|
|
return self.cleaned_data
|
|
|
|
|
|
class ResetPasswordForm(forms.Form):
|
|
"""Форма восстановления пароля."""
|
|
email = forms.EmailField(label=u'Ваш e-mail', max_length=75,
|
|
error_messages={'invalid': u'Неверный формат e-mail.', 'required': u'Введите свой e-mail.',})
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(ResetPasswordForm, self).__init__(*args, **kwargs)
|
|
self.user_cache = None # кешировать юзера в форме, чтобы повторно не ходить в базу из вьюхи
|
|
|
|
def clean_email(self):
|
|
"""Проверить зарегистрирован ли email."""
|
|
email = self.cleaned_data['email']
|
|
try:
|
|
User.objects.get(email__iexact = email)
|
|
return email
|
|
except User.DoesNotExist:
|
|
raise forms.ValidationError(u'Такой e-mail не зарегистрирован.')
|
|
|
|
def clean(self):
|
|
super(ResetPasswordForm, self).clean()
|
|
email = self.cleaned_data.get('email')
|
|
if email:
|
|
self.user_cache = User.objects.get(email__iexact = email)
|
|
if self.user_cache:
|
|
if not self.user_cache.is_active:
|
|
raise forms.ValidationError(u'Пользователь заблокирован.')
|
|
return self.cleaned_data
|
|
|
|
def get_user(self):
|
|
return self.user_cache
|
|
|
|
|
|
class ChangePasswordForm(forms.Form):
|
|
"""Форма изменения пароля."""
|
|
old_password = forms.CharField(label=u'Ваш пароль', widget=forms.PasswordInput)
|
|
|
|
password1 = forms.CharField(label=u'Новый пароль', min_length=PASSWORD_MIN_LEN, widget=forms.PasswordInput,
|
|
error_messages={'min_length': u'Не менее %s символов.' % PASSWORD_MIN_LEN,},
|
|
help_text=u'Не менее %s символов.' % PASSWORD_MIN_LEN)
|
|
|
|
password2 = forms.CharField(label=u'Повторите', widget=forms.PasswordInput)
|
|
|
|
def __init__(self, user, *args, **kwargs):
|
|
super(ChangePasswordForm, self).__init__(*args, **kwargs)
|
|
self._user = user
|
|
|
|
def clean_old_password(self):
|
|
"""Проверить старый пароль."""
|
|
old_password = self.cleaned_data.get('old_password')
|
|
if old_password and not self._user.check_password(old_password):
|
|
raise forms.ValidationError(u'Неверный пароль.')
|
|
return old_password
|
|
|
|
def clean(self):
|
|
super(ChangePasswordForm, self).clean()
|
|
password1 = self.cleaned_data.get('password1')
|
|
password2 = self.cleaned_data.get('password2')
|
|
# проверить чтобы оба новых пароля совпадали
|
|
if password1 and password2:
|
|
if password1 != password2:
|
|
set_field_error(self, 'password2', u'Пароли не совпадают.')
|
|
return self.cleaned_data
|
|
|
|
|
|
class ChangeEmailForm(forms.Form):
|
|
"""Форма изменения e-mail."""
|
|
password = forms.CharField(label=u'Ваш пароль', widget=forms.PasswordInput)
|
|
|
|
email = forms.EmailField(label=u'Новый e-mail', max_length=75,
|
|
error_messages={'invalid': u'Неверный формат e-mail.', 'required': u'Введите свой e-mail.',})
|
|
|
|
def __init__(self, user, *args, **kwargs):
|
|
super(ChangeEmailForm, self).__init__(*args, **kwargs)
|
|
self._user = user
|
|
|
|
def clean_password(self):
|
|
"""Проверить пароль."""
|
|
password = self.cleaned_data.get('password')
|
|
if password and not self._user.check_password(password):
|
|
raise forms.ValidationError(u'Неверный пароль.')
|
|
return password
|
|
|
|
|
|
class LoginForm(forms.Form):
|
|
"""Форма логина."""
|
|
email = forms.EmailField(label=u'E-mail', max_length=75)
|
|
password = forms.CharField(label=u'Пароль', widget=forms.PasswordInput)
|
|
|
|
# TODO капча на случай если пароль не ввели правильно с первого раза
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(LoginForm, self).__init__(*args, **kwargs)
|
|
self.user_cache = None # кешировать юзера в форме, чтобы повторно не лазить в базу из вьюхи
|
|
|
|
def clean(self):
|
|
super(LoginForm, self).clean()
|
|
email = self.cleaned_data.get('email')
|
|
password = self.cleaned_data.get('password')
|
|
if email and password:
|
|
try:
|
|
username = User.objects.get(email__iexact = email).username
|
|
self.user_cache = authenticate(username = username, password = password)
|
|
if self.user_cache:
|
|
if not self.user_cache.is_active:
|
|
set_field_error(self, 'email', u'Пользователь заблокирован.')
|
|
if not self.user_cache.profile.active:
|
|
set_field_error(self, 'email', u'E-mail не подтверждён.')
|
|
else:
|
|
set_field_error(self, 'password', u'Неверное сочетание e-mail / пароль.')
|
|
except User.DoesNotExist:
|
|
set_field_error(self, 'email', u'Такой e-mail не зарегистрирован.')
|
|
return self.cleaned_data
|
|
|
|
def get_user(self):
|
|
return self.user_cache
|
|
|