Coverage for website/members/models/email_change.py: 68.97%

25 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1import uuid 

2 

3from django.conf import settings 

4from django.core.exceptions import ValidationError 

5from django.db import models 

6from django.utils import timezone 

7from django.utils.translation import gettext_lazy as _ 

8 

9 

10class EmailChange(models.Model): 

11 created_at = models.DateTimeField(_("created at"), default=timezone.now) 

12 

13 member = models.ForeignKey( 

14 "members.Member", 

15 on_delete=models.CASCADE, 

16 verbose_name=_("member"), 

17 ) 

18 

19 email = models.EmailField(_("email"), max_length=254) 

20 

21 verify_key = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) 

22 confirm_key = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) 

23 

24 verified = models.BooleanField( 

25 _("verified"), default=False, help_text=_("the new email address is valid") 

26 ) 

27 confirmed = models.BooleanField( 

28 _("confirmed"), default=False, help_text=_("the old email address was checked") 

29 ) 

30 

31 def __str__(self): 

32 return _( 

33 "Email change request for {} to {} " 

34 "created at {} " 

35 "(confirmed: {}, verified: {})." 

36 ).format( 

37 self.member, self.email, self.created_at, self.confirmed, self.verified 

38 ) 

39 

40 @property 

41 def completed(self): 

42 return self.verified and self.confirmed 

43 

44 def clean(self): 

45 super().clean() 

46 

47 if any(domain in self.email for domain in settings.EMAIL_DOMAIN_BLACKLIST): 

48 raise ValidationError( 

49 { 

50 "email": _( 

51 "You cannot use an email address " 

52 "from this domain for your account." 

53 ) 

54 } 

55 ) 

56 

57 if self.email == self.member.email: 

58 raise ValidationError({"email": _("Please enter a new email address.")})