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 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'