Coverage for benefits / core / admin / views.py: 100%
26 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-22 19:08 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-22 19:08 +0000
1from urllib.parse import quote
3from django.contrib.auth.views import PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView
4from django.contrib import messages
5from django.urls import reverse_lazy
7from benefits.core.admin.forms import BenefitsPasswordResetForm, BenefitsSetPasswordForm
8from benefits.core.mixins import RecaptchaEnabledMixin
11class BenefitsPasswordResetView(RecaptchaEnabledMixin, PasswordResetView):
12 """Subclass of stock PasswordResetView to enable reCAPTCHA and pass email to done view"""
14 form_class = BenefitsPasswordResetForm
15 email_template_name = "registration/password_reset_email.txt"
16 html_email_template_name = "registration/password_reset_email.html"
18 def form_valid(self, form):
19 email = form.cleaned_data["email"]
20 # encode special characters in email address so it's safe for use in a URL
21 url_encoded_email = quote(email)
23 self.success_url = f"{reverse_lazy("password_reset_done")}?email={url_encoded_email}"
24 return super().form_valid(form)
27class BenefitsPasswordResetDoneView(PasswordResetDoneView):
28 """Subclass of stock PasswordResetDoneView to receive email param and add to template context"""
30 def get_context_data(self, **kwargs):
31 context = super().get_context_data(**kwargs)
32 context["email"] = self.request.GET.get("email")
33 return context
36class BenefitsPasswordResetConfirmView(RecaptchaEnabledMixin, PasswordResetConfirmView):
37 """Subclass of stock PasswordResetConfirmView to enable reCAPTCHA and change redirect destination"""
39 form_class = BenefitsSetPasswordForm
40 success_url = reverse_lazy("admin:login")
42 def form_valid(self, form):
43 messages.success(self.request, "Your password has been reset. Please log in.")
44 return super().form_valid(form)