Coverage for sm/views_profile.py: 100%

32 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-10-24 19:06 +0000

1from django import forms 

2from django.contrib import messages 

3from django.contrib.auth.mixins import LoginRequiredMixin 

4from django.contrib.auth.models import User 

5from django.utils.translation import gettext as _ 

6from django.views.generic.edit import FormView 

7from typing import Any 

8 

9 

10class UserProfileForm(forms.ModelForm): 

11 class Meta: 

12 model = User 

13 fields = ["first_name", "last_name", "email"] 

14 

15 def clean_email(self) -> str: 

16 email = self.cleaned_data["email"].strip().lower() 

17 if User.objects.filter(email=email).exclude(pk=self.instance.pk).exists(): 

18 raise forms.ValidationError(_("A user with this email already exists.")) 

19 return email 

20 

21 

22class ProfileView(LoginRequiredMixin, FormView): 

23 template_name = "account/profile.html" 

24 form_class = UserProfileForm 

25 

26 def get_initial(self) -> dict: 

27 user = self.request.user 

28 return { 

29 "first_name": user.first_name, 

30 "last_name": user.last_name, 

31 "email": user.email, 

32 } 

33 

34 def get_form_kwargs(self) -> dict: 

35 kwargs = super().get_form_kwargs() 

36 kwargs["instance"] = self.request.user 

37 return kwargs 

38 

39 def form_valid(self, form: Any) -> Any: 

40 form.save() 

41 messages.success(self.request, _("Your profile has been updated.")) 

42 return super().form_valid(form) 

43 

44 def get_success_url(self) -> str: 

45 return "/account/profile/"