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.
203 lines
7.6 KiB
203 lines
7.6 KiB
import logging
|
|
from django.conf import settings
|
|
from django.contrib.auth.views import (
|
|
LoginView as LoginViewBase,
|
|
LogoutView,
|
|
PasswordResetView as PasswordResetViewBase,
|
|
PasswordResetDoneView as PasswordResetDoneViewBase,
|
|
PasswordResetConfirmView as PasswordResetConfirmViewBase,
|
|
PasswordResetCompleteView as PasswordResetCompleteViewBase,
|
|
PasswordChangeView as PasswordChangeViewBase,
|
|
PasswordChangeDoneView as PasswordChangeDoneViewBase
|
|
)
|
|
from django.views.generic import TemplateView
|
|
|
|
from registration.backends.default.views import (
|
|
RegistrationView as RegistrationViewBase,
|
|
ResendActivationView as ResendActivationViewBase
|
|
)
|
|
from django.contrib.messages.views import SuccessMessageMixin
|
|
from django.http import JsonResponse
|
|
from django.shortcuts import redirect, resolve_url
|
|
from django.urls import reverse, reverse_lazy
|
|
from django.utils.http import is_safe_url
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from core.views import ProtectedView
|
|
from .forms import (
|
|
PasswordResetRequestForm, PasswordResetForm, RegistrationCompanyForm,
|
|
AuthenticationForm,
|
|
RegistrationForm)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
# Create your views here.
|
|
|
|
class LoginView(LoginViewBase):
|
|
redirect_field_name = 'next'
|
|
form_class = AuthenticationForm
|
|
redirect_authenticated_user = True
|
|
template_name = 'accounts_ext/authentication.html'
|
|
|
|
def dispatch(self, request, *args, **kwargs):
|
|
if self.request.user.is_authenticated:
|
|
redirect_to = self.request.POST.get(
|
|
self.redirect_field_name,
|
|
self.request.GET.get(self.redirect_field_name, '')
|
|
)
|
|
if not is_safe_url(url=redirect_to, host=self.request.get_host()):
|
|
redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
|
|
if redirect_to == self.request.path:
|
|
raise ValueError(
|
|
"Redirection loop for authenticated user detected. Check that "
|
|
"your LOGIN_REDIRECT_URL doesn't point to a login page."
|
|
)
|
|
return redirect(redirect_to)
|
|
return super().dispatch(request, *args, **kwargs)
|
|
|
|
def render_done(self, form, **kwargs):
|
|
"""
|
|
This method gets called when all forms passed. The method should also
|
|
re-validate all steps to prevent manipulation. If any form don't
|
|
validate, `render_revalidation_failure` should get called.
|
|
If everything is fine call `done`.
|
|
"""
|
|
final_form_list = []
|
|
# walk through the form list and try to validate the data again.
|
|
for form_key in self.get_form_list():
|
|
form_obj = self.get_form(step=form_key,
|
|
data=self.storage.get_step_data(form_key),
|
|
files=self.storage.get_step_files(
|
|
form_key))
|
|
form_obj.exclude_second_captcha_validation = True
|
|
if not (form_key in self.idempotent_dict or form_obj.is_valid()):
|
|
return self.render_revalidation_failure(form_key, form_obj,
|
|
**kwargs)
|
|
final_form_list.append(form_obj)
|
|
|
|
# render the done view and reset the wizard before returning the
|
|
# response. This is needed to prevent from rendering done with the
|
|
# same data twice.
|
|
done_response = self.done(final_form_list, **kwargs)
|
|
self.storage.reset()
|
|
return done_response
|
|
|
|
def get_user(self):
|
|
"""
|
|
Returns the user authenticated by the AuthenticationForm. Returns False
|
|
if not a valid user; see also issue #65.
|
|
"""
|
|
if not self.user_cache:
|
|
form_obj = self.get_form(step='auth',
|
|
data=self.storage.get_step_data('auth'))
|
|
form_obj.exclude_second_captcha_validation = True
|
|
self.user_cache = form_obj.is_valid() and form_obj.user_cache
|
|
return self.user_cache
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['title'] = AuthenticationForm.title
|
|
return context
|
|
|
|
class ResetPasswordView(PasswordResetViewBase):
|
|
form_class = PasswordResetRequestForm
|
|
template_name = 'accounts_ext/reset_password.html'
|
|
email_template_name = 'Reset password email'
|
|
html_email_template_name = 'emails/reset_password_email.html'
|
|
success_url = reverse_lazy('accounts_ext:reset_password_done')
|
|
from_email = settings.DEFAULT_FROM_EMAIL
|
|
subject_template_name = _('Сброс пароля')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['title'] = PasswordResetForm.title
|
|
return context
|
|
|
|
|
|
class ResetPasswordDoneView(PasswordResetDoneViewBase):
|
|
template_name = 'accounts_ext/reset_password_done.html'
|
|
|
|
|
|
class ResetPasswordConfirmView(PasswordResetConfirmViewBase):
|
|
form_class = PasswordResetForm
|
|
template_name = 'accounts_ext/reset_password_confirm.html'
|
|
success_url = reverse_lazy('accounts_ext:reset_password_complete')
|
|
|
|
def get_form_kwargs(self):
|
|
kwargs = super().get_form_kwargs()
|
|
kwargs['request'] = self.request
|
|
return kwargs
|
|
|
|
|
|
class ResetPasswordCompleteView(PasswordResetCompleteViewBase):
|
|
template_name = 'accounts_ext/reset_password_complete.html'
|
|
title = _('Password reset complete')
|
|
|
|
|
|
class RegistrationView(RegistrationViewBase):
|
|
http_method_names = ['get', 'post']
|
|
template_name = 'registration/registration.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
if self.request.POST:
|
|
context['company_form'] = RegistrationCompanyForm(self.request.POST)
|
|
else:
|
|
context['company_form'] = RegistrationCompanyForm()
|
|
context['title'] = RegistrationForm.title
|
|
return context
|
|
|
|
def form_valid(self, form):
|
|
context = self.get_context_data()
|
|
company_form = context.get('company_form')
|
|
try:
|
|
user = form.save()
|
|
if company_form.is_valid():
|
|
company_form.save(user=user)
|
|
else:
|
|
logger.error("User {email} company has invalid data during registration")
|
|
except Exception as e:
|
|
logger.error(e)
|
|
return self.form_invalid(form=form)
|
|
return super().form_valid(form)
|
|
|
|
|
|
class RegistrationDoneView(TemplateView):
|
|
template_name = 'registration/registration_done.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['title'] = _('Отправка письма активации')
|
|
return context
|
|
|
|
|
|
class ResendActivationView(ResendActivationViewBase):
|
|
template_name = 'registration/resend_activation.tml'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['title'] = _('Отправка письма активации')
|
|
return context
|
|
|
|
|
|
class ChangePasswordForm(PasswordChangeViewBase):
|
|
template_name = 'accounts_ext/password_reset_change.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['title'] = _('Введение нового пароля')
|
|
return context
|
|
|
|
|
|
class ChangePasswordDoneForm(PasswordChangeDoneViewBase):
|
|
template_name = 'accounts_ext/password_reset_change_done.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['title'] = _('Сброс пароля')
|
|
return context
|
|
|
|
|
|
class ProfileView(ProtectedView):
|
|
template_name = 'accounts_ext/index.html'
|
|
|