Source code for shuup.front.apps.auth.views

from django import forms
from django.conf import settings
from django.contrib.auth import get_user_model, login, logout
from django.contrib.auth.forms import SetPasswordForm
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.views import REDIRECT_FIELD_NAME
from django.db.transaction import atomic
from django.http import HttpResponseRedirect
from django.utils.http import is_safe_url, urlsafe_base64_decode
from django.utils.translation import gettext_lazy as _
from django.views.generic import FormView, TemplateView

from shuup.core.utils.forms import RecoverPasswordForm
from shuup.utils.django_compat import is_authenticated, reverse_lazy
from shuup.utils.excs import Problem
from shuup.utils.importing import cached_load


[docs] class LoginView(FormView): template_name = "shuup/user/login.jinja" form_class = cached_load("SHUUP_AUTH_LOGIN_FORM_SPEC")
[docs] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context[REDIRECT_FIELD_NAME] = self.request.GET.get(REDIRECT_FIELD_NAME) return context
[docs] def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs["request"] = self.request return kwargs
[docs] def get_form(self, form_class=None, id_prefix="auth"): if form_class is None: form_class = self.get_form_class() kwargs = self.get_form_kwargs() kwargs["auto_id"] = f"id_{id_prefix}_for_%s" form = form_class(**kwargs) form.fields[REDIRECT_FIELD_NAME] = forms.CharField( widget=forms.HiddenInput, required=False, initial=self.request.GET.get(REDIRECT_FIELD_NAME), ) return form
[docs] def form_valid(self, form): user = form.get_user() if user is not None: login(self.request, user) return super().form_valid(form)
[docs] def get_success_url(self): url = self.request.POST.get(REDIRECT_FIELD_NAME) if url and is_safe_url(url, self.request.get_host()): return url return settings.LOGIN_REDIRECT_URL
[docs] class LogoutView(TemplateView): template_name = "shuup/user/logout.jinja"
[docs] def dispatch(self, request, *args, **kwargs): if is_authenticated(request.user): logout(request) return super().dispatch(request, *args, **kwargs)
[docs] class RecoverPasswordView(FormView): template_name = "shuup/user/recover_password.jinja" form_class = RecoverPasswordForm success_url = reverse_lazy("shuup:recover_password_sent")
[docs] def form_valid(self, form): """ :type form: RecoverPasswordForm """ form.save(request=self.request) return HttpResponseRedirect(self.get_success_url())
[docs] class RecoverPasswordConfirmView(FormView): template_name = "shuup/user/recover_password_confirm.jinja" form_class = SetPasswordForm token_generator = default_token_generator success_url = reverse_lazy("shuup:recover_password_complete")
[docs] def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs["user"] = self.get_target_user() return kwargs
[docs] def get_target_user(self): uidb64 = self.kwargs["uidb64"] user_model = get_user_model() try: uid = urlsafe_base64_decode(uidb64) user = user_model._default_manager.get(pk=uid) except (TypeError, ValueError, OverflowError, user_model.DoesNotExist): user = None return user
[docs] def dispatch(self, request, *args, **kwargs): user = self.get_target_user() token = self.kwargs["token"] valid = user is not None and self.token_generator.check_token(user, token) if not valid: raise Problem(_("Error! This recovery link is invalid.")) return super().dispatch(request, *args, **kwargs)
[docs] @atomic def form_valid(self, form): """ :type form: SetPasswordForm """ form.save() form.user.backend = "django.contrib.auth.backends.ModelBackend" login(self.request, form.user) return HttpResponseRedirect(self.get_success_url())
[docs] class RecoverPasswordSentView(TemplateView): template_name = "shuup/user/recover_password_sent.jinja"
[docs] class RecoverPasswordCompleteView(TemplateView): template_name = "shuup/user/recover_password_complete.jinja"