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.
162 lines
5.9 KiB
162 lines
5.9 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,
|
|
)
|
|
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 django.views.generic import TemplateView
|
|
from registration.backends.default.views import (
|
|
RegistrationView as RegistrationViewBase,
|
|
ResendActivationView as ResendActivationViewBase
|
|
)
|
|
|
|
from core.views import ProtectedTemplateView
|
|
from .forms import (
|
|
PasswordResetRequestForm, SetPasswordForm, 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/html/password_reset_email.html'
|
|
success_url = reverse_lazy('accounts_ext:reset_password_done')
|
|
from_email = settings.DEFAULT_FROM_EMAIL
|
|
title = PasswordResetRequestForm.title
|
|
|
|
|
|
class ResetPasswordDoneView(PasswordResetDoneViewBase):
|
|
template_name = 'accounts_ext/reset_password_done.html'
|
|
title = _('Ссылка на сброс пароля отправленна')
|
|
|
|
|
|
class ResetPasswordConfirmView(PasswordResetConfirmViewBase):
|
|
form_class = SetPasswordForm
|
|
template_name = 'accounts_ext/reset_password_change.html'
|
|
success_url = reverse_lazy('accounts_ext:reset_password_complete')
|
|
title = SetPasswordForm.title
|
|
|
|
|
|
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'
|
|
company_form = None
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['company_form'] = self.company_form
|
|
context['title'] = RegistrationForm.title
|
|
return context
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
self.company_form = RegistrationCompanyForm(self.request.POST)
|
|
return super().post(request, *args, **kwargs)
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
self.company_form = RegistrationCompanyForm()
|
|
return super().get(request, *args, **kwargs)
|
|
|
|
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 ProfileTemplateView(ProtectedTemplateView):
|
|
template_name = 'accounts_ext/index.html'
|
|
|