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.
208 lines
9.6 KiB
208 lines
9.6 KiB
# -*- coding: utf-8 -*-
|
|
from django import forms
|
|
from django.conf import settings
|
|
from django.contrib.auth import authenticate
|
|
|
|
from project.commons.forms import set_field_error
|
|
from project.customer import consts as customer_consts
|
|
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
|
|
|
|
from models import DokUser
|
|
|
|
|
|
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:
|
|
DokUser.objects.get(email__iexact = email)
|
|
except DokUser.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:
|
|
DokUser.objects.get(email__iexact = email)
|
|
return email
|
|
except DokUser.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 = DokUser.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
|
|
|
|
def clean_email(self):
|
|
"""Проверить не зарегистрирован ли email."""
|
|
email = self.cleaned_data['email']
|
|
try:
|
|
DokUser.objects.get(email__iexact = email)
|
|
raise forms.ValidationError(u'Такой e-mail уже зарегистрирован.')
|
|
except DokUser.DoesNotExist:
|
|
return email
|
|
|
|
|
|
class LoginForm(forms.Form):
|
|
"""Форма логина."""
|
|
email = forms.EmailField(label=u'E-mail', max_length=75)
|
|
password = forms.CharField(label=u'Пароль', widget=forms.PasswordInput)
|
|
reset_old_login = forms.BooleanField(label='Сбросить старый вход', required=False)
|
|
|
|
# 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')
|
|
reset_old_login = self.cleaned_data.get('reset_old_login')
|
|
if email and password:
|
|
try:
|
|
username = DokUser.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.confirmed:
|
|
set_field_error(self, 'email', u'Для подтверждения адреса электронной почты перейдите по адресу, указанному в письме. Если вы не получили письмо с активацией, попробуйте зарегистрироваться ещё раз или укажите другой адрес электронной почты.')
|
|
if self.user_cache.profile.user_session_key and not reset_old_login:
|
|
set_field_error(self, 'email', u'Пользователь уже вошёл в систему. Установите флаг "Сбросить старый вход", чтобы войти.')
|
|
else:
|
|
set_field_error(self, 'password', u'Неверное сочетание e-mail / пароль.')
|
|
except DokUser.DoesNotExist:
|
|
set_field_error(self, 'email', u'Такой e-mail не зарегистрирован.')
|
|
return self.cleaned_data
|
|
|
|
def get_user(self):
|
|
return self.user_cache
|
|
|
|
|
|
|
|
class CustomUserCreationForm(UserCreationForm):
|
|
"""
|
|
A form that creates a user, with no privileges, from the given email and
|
|
password.
|
|
"""
|
|
def clean_username(self):
|
|
# Since User.username is unique, this check is redundant,
|
|
# but it sets a nicer error message than the ORM. See #13147.
|
|
username = self.cleaned_data["username"]
|
|
try:
|
|
DokUser._default_manager.get(username=username)
|
|
except DokUser.DoesNotExist:
|
|
return username
|
|
raise forms.ValidationError(self.error_messages['duplicate_username'])
|
|
|
|
class Meta:
|
|
model = DokUser
|
|
fields = ("username", "email",)
|
|
|
|
class CustomUserChangeForm(UserChangeForm):
|
|
class Meta:
|
|
model = DokUser
|
|
|
|
|