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.
 
 
 
 

298 lines
11 KiB

import logging
from captcha.fields import CaptchaField
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, Div, Submit, HTML
from django import forms
from django.conf import settings
from django.contrib.auth import get_user_model, password_validation
from django.core.exceptions import ObjectDoesNotExist
from django.forms import inlineformset_factory
from django.urls import reverse, reverse_lazy
from django.utils.translation import ugettext_lazy as _
from registration.forms import RegistrationFormUniqueEmail
from django.contrib.auth.forms import (
AuthenticationForm as AuthenticationFormBase,
PasswordResetForm as PasswordResetFormBase,
PasswordChangeForm as PasswordChangeFormBase
)
from core.models import STATUS_ACTIVE
from .models import User, Profile, Company
logger = logging.getLogger(__name__)
# class PickUpPointsForm(layout.ModelForm):
# class Meta:'
# model = PickUpRequest
# fields = ('requisites',)
class RegistrationForm(RegistrationFormUniqueEmail):
email = forms.EmailField(label=_("E-mail"), widget=forms.EmailInput(attrs={'class': 'reg__text'}))
password1 = forms.CharField(
label=_('Пароль'),
strip=False,
widget=forms.PasswordInput(attrs={'class': 'reg__text-label'}),
help_text=password_validation.password_validators_help_text_html(),
)
password2 = forms.CharField(
label=_('Подтверждение пароля'),
widget=forms.PasswordInput(attrs={'class': 'reg__text-label'}),
strip=False,
help_text=_('Для потверждения пароля введите его еще раз'),
)
first_name = forms.CharField(label=_("Имя"), max_length=255, widget=forms.TextInput(attrs={'class': 'reg__text'}))
last_name = forms.CharField(label=_("Фамилия"), max_length=255,
widget=forms.TextInput(attrs={'class': 'reg__text'}))
patronymic = forms.CharField(label=_("Отчество"), max_length=255,
widget=forms.TextInput(attrs={'class': 'reg__text'}))
agreement = forms.BooleanField()
captcha = CaptchaField(required=not settings.DEBUG)
title = _('Регистрация')
def save(self, commit=True):
user = super().save(commit)
profile = Profile.objects.filter(user=user).first()
if profile:
profile.first_name = self.cleaned_data.get('first_name')
profile.last_name = self.cleaned_data.get('last_name')
profile.patronymic = self.cleaned_data.get('patronymic')
profile.save()
else:
logger.error(
msg="User {user_email} missing profile object".format({'user_email': user.email})
)
return user
class Meta:
model = User
fields = ('username',)
labels = {
'username': _('Логин'),
}
help_texts = {
'username': _('Не менее 5х символов'),
}
widgets = {
'username': forms.TextInput(attrs={'class': 'reg__text-label'}),
}
class RegistrationCompanyForm(forms.ModelForm):
is_individual = forms.BooleanField(label=_('Я физическое лицо'), required=False)
def save(self, user, commit=True):
self.instance.user = user
return super().save(commit)
class Meta:
model = Company
fields = ('company_name', 'address', 'inn', 'ogrn')
labels = {
'company_name': _('Наименование'),
'inn': _('ИНН'),
'ogrn': _('ОГРН'),
'address': _('Юридический адрес')
}
widgets = {
'company_name': forms.TextInput(attrs={'class': 'reg__text'}),
'inn': forms.TextInput(attrs={'class': 'reg__text'}),
'ogrn': forms.TextInput(attrs={'class': 'reg__text'}),
'address': forms.Textarea(attrs={'class': 'reg__text', 'rows': 5, 'cols': 40})
}
class AuthenticationForm(AuthenticationFormBase):
username = forms.CharField(max_length=255, widget=forms.TextInput(attrs={
'class': 'reg__text',
'style': 'text-align:center',
'placeholder': _('Логин')
}))
password = forms.CharField(max_length=255, widget=forms.PasswordInput(attrs={
'class': 'reg__text',
'style': 'text-align:center',
'placeholder': _('Пароль')
}))
field_template = 'bootstrap/forms/authentication.html'
title = _('Вход')
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.layout = Layout(
Field('username', template=self.field_template),
Field('password', template=self.field_template),
Div(
HTML('<a class="header__link" href="{}">{}</a>'.format(
reverse_lazy('accounts_ext:reset_password'),
_('Забыли пароль ?'))
),
css_class="text-right"
),
Div(
Div(
Submit('submit', _('Войти'), css_class='btn-danger'),
css_class='col-lg-12 text-center'
),
css_class='row'
),
)
super().__init__(*args, **kwargs)
class PasswordResetRequestForm(PasswordResetFormBase):
field_template = 'bootstrap/forms/authentication.html'
email_slug = 'reset_password'
title = _('Сброс пароля')
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_action = reverse_lazy('accounts_ext:reset_password')
self.helper.layout = Layout(
Field('email', css_class='reg__text', template=self.field_template, placeholder="example@email.com"),
Div(
Div(
Submit('submit', _('Сбросить'), css_class='btn-danger'),
css_class='col-lg-12 text-center'
),
css_class="row"
),
)
super().__init__(*args, **kwargs)
def get_users(self, email):
active_users = get_user_model()._default_manager.filter(**{
'%s__iexact' % get_user_model().get_email_field_name(): email,
'status': STATUS_ACTIVE,
})
return (u for u in active_users if u.has_usable_password())
def send_mail(self, subject_template_name, email_template_name, context, from_email, to_email,
html_email_template_name=None):
try:
# mail_template = MailTemplate.objects.filter(slug=self.email_slug).first()
kwargs = {
'subject': subject_template_name,
# 'message': get_template(html_email_template_name).templatetags.source
}
if not kwargs:
kwargs = {
'slug': self.email_slug,
'name': email_template_name,
'num_of_retries': 3,
'is_html': True
}
# MailTemplate.objects.create(**kwargs)
else:
pass
# mail_template.subject = kwargs.get('subject', mail_template.subject)
# mail_template.message = kwargs.get('message', mail_template.message)
# mail_template.save()
user = User.active.filter(email__iexact=to_email).first()
first_name = user.profile.first_name or ""
last_name = user.profile.last_name or ""
full_name = first_name + ' ' + last_name
if len(full_name.strip()) != 0:
context.update({'username': full_name})
# send_db_mail(
# self.email_slug,
# to_email,
# subject_template_name,
# context,
# from_email=from_email,
# retry=True,
# retry_delay=300,
# max_retries=3,
# send_at_date=datetime.now(),
# use_celery=celery_supported()
# )
except ObjectDoesNotExist as e:
logger.critical(e)
def clean(self):
return super().clean()
class PasswordResetForm(PasswordChangeFormBase):
field_template = 'bootstrap/field.html'
field_order = ['new_password1', 'new_password2']
title = _('Сброс пароля')
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
self.helper = FormHelper()
self.helper.form_action = self.request.path
self.helper.layout = Layout(
Field('new_password1', template=self.field_template),
Field('new_password2', template=self.field_template),
Div(
Div(
Submit('submit', _('Сброс'), css_class='btn-danger'),
css_class='col-lg-12 text-center'
),
css_class="row"
),
)
super().__init__(kwargs.pop('user'), *args, **kwargs)
self.fields['new_password1'].help_text = self.fields['new_password1'].help_text.replace('<ul>',
'<ul class="required-list">')
def is_valid(self):
valid = super().is_valid()
if not valid:
if 'old_password' in self.errors:
self.errors.pop('old_password')
valid = super().is_valid()
return valid
class ProfileForm(forms.Form):
email = forms.CharField(required=False)
field_template = 'bootstrap/field_admin.html'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_action = reverse('accounts_ext:update')
self.helper.form_class = 'formajax form-replace-block'
self.helper.layout = Layout(
Div(
Field('email', template=self.field_template),
Field('first_name', template=self.field_template),
Field('last_name', template=self.field_template),
Field('patronymic', template=self.field_template),
Field('birthday', template=self.field_template),
Field('company_name', template=self.field_template),
Field('inn', template=self.field_template),
Field('ogrn', template=self.field_template),
Field('legal_address', template=self.field_template),
css_class="setProfile"
),
Div(
Submit('submit', _('Save'), css_class='button button--bigOrange'),
css_class="settings-button"
),
)
self.initial['email'] = self.instance.user.email
self.fields['email'].widget.attrs['readonly'] = True
self.fields['birthday'].widget.attrs['class'] = 'date inputText'
def clean_email(self):
instance = getattr(self, 'instance', None)
if instance and instance.pk:
return instance.user.email
else:
return self.cleaned_data['email']
class Meta:
model = Profile
exclude = ('user', 'create_at', 'updated_at', 'status',)