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
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1import uuid
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 _
10class EmailChange(models.Model):
11 created_at = models.DateTimeField(_("created at"), default=timezone.now)
13 member = models.ForeignKey(
14 "members.Member",
15 on_delete=models.CASCADE,
16 verbose_name=_("member"),
17 )
19 email = models.EmailField(_("email"), max_length=254)
21 verify_key = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
22 confirm_key = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
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 )
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 )
40 @property
41 def completed(self):
42 return self.verified and self.confirmed
44 def clean(self):
45 super().clean()
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 )
57 if self.email == self.member.email:
58 raise ValidationError({"email": _("Please enter a new email address.")})