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.
 
 
 
 

160 lines
5.8 KiB

import logging
from django.conf import settings
from django.contrib.auth.forms import SetPasswordForm
from django.contrib.auth.views import (
LoginView as LoginViewBase,
LogoutView,
PasswordResetView as PasswordResetViewBase,
PasswordResetDoneView as PasswordResetDoneViewBase,
PasswordResetConfirmView as PasswordResetConfirmViewBase,
PasswordResetCompleteView as PasswordResetCompleteViewBase,
)
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.shortcuts import redirect, resolve_url
from django.urls import reverse_lazy
from django.utils.http import is_safe_url, urlencode
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 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'
html_email_template_name = 'emails/password_reset_email.html'
success_url = reverse_lazy('accounts_ext:reset_password_done')
from_email = settings.DEFAULT_FROM_EMAIL
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 = SetPasswordForm
template_name = 'accounts_ext/reset_password_change.html'
success_url = reverse_lazy('accounts_ext:reset_password_complete')
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):
new_user = self.register(form)
context = self.get_context_data()
company_form = context.get('company_form')
try:
if company_form.is_valid():
company_form.save(user=new_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)
# success_url may be a simple string, or a tuple providing the
# full argument set for redirect(). Attempting to unpack it
# tells us which one it is.
success_url = self.get_success_url(new_user)
try:
to, args, kwargs = success_url
except ValueError:
return redirect(success_url)
else:
return redirect(to, *args, **kwargs)
def get_success_url(self, user):
url = reverse_lazy('accounts_ext:register_done')
return "{}?{}".format(url, urlencode({'email': user.email}))
class RegistrationDoneView(TemplateView):
template_name = 'registration/registration_done.html'
def dispatch(self, request, *args, **kwargs):
if reverse_lazy('accounts_ext:register').__str__() in request.META.get('HTTP_REFERER', ''):
return super().dispatch(request, *args, **kwargs)
return redirect(settings.LOGIN_REDIRECT_URL)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = _('Отправка письма активации')
context['email'] = self.request.GET.get('email')
context['email_domain'] = "http://" + self.request.GET.get('email').split('@')[-1]
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 ProfileView(ProtectedView):
template_name = 'accounts_ext/index.html'