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
« 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
10class UserProfileForm(forms.ModelForm):
11 class Meta:
12 model = User
13 fields = ["first_name", "last_name", "email"]
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
22class ProfileView(LoginRequiredMixin, FormView):
23 template_name = "account/profile.html"
24 form_class = UserProfileForm
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 }
34 def get_form_kwargs(self) -> dict:
35 kwargs = super().get_form_kwargs()
36 kwargs["instance"] = self.request.user
37 return kwargs
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)
44 def get_success_url(self) -> str:
45 return "/account/profile/"