# -*- 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'Пользователь заблокирован.') 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