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.
 
 
 
 

214 lines
9.9 KiB

# -*- coding: utf-8 -*-
from django import forms
from django.conf import settings
from django.contrib.auth import authenticate
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from captcha.fields import CaptchaField
from commons.forms import set_field_error
from customer import consts as customer_consts
from myauth.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=u'Сбросить старый вход', 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 CaptchedLoginForm(LoginForm):
captcha = CaptchaField(label=u'Введите код с картинки')
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
fields = '__all__'