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

1from urllib.parse import quote 

2 

3from django.contrib.auth.views import PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView 

4from django.contrib import messages 

5from django.urls import reverse_lazy 

6 

7from benefits.core.admin.forms import BenefitsPasswordResetForm, BenefitsSetPasswordForm 

8from benefits.core.mixins import RecaptchaEnabledMixin 

9 

10 

11class BenefitsPasswordResetView(RecaptchaEnabledMixin, PasswordResetView): 

12 """Subclass of stock PasswordResetView to enable reCAPTCHA and pass email to done view""" 

13 

14 form_class = BenefitsPasswordResetForm 

15 email_template_name = "registration/password_reset_email.txt" 

16 html_email_template_name = "registration/password_reset_email.html" 

17 

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) 

22 

23 self.success_url = f"{reverse_lazy("password_reset_done")}?email={url_encoded_email}" 

24 return super().form_valid(form) 

25 

26 

27class BenefitsPasswordResetDoneView(PasswordResetDoneView): 

28 """Subclass of stock PasswordResetDoneView to receive email param and add to template context""" 

29 

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 

34 

35 

36class BenefitsPasswordResetConfirmView(RecaptchaEnabledMixin, PasswordResetConfirmView): 

37 """Subclass of stock PasswordResetConfirmView to enable reCAPTCHA and change redirect destination""" 

38 

39 form_class = BenefitsSetPasswordForm 

40 success_url = reverse_lazy("admin:login") 

41 

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)