check email toxic domain at model-level

This commit is contained in:
imperosol committed 2026-10-31 18:50:04 +01:00
1 parent 4f989d82bb
commit e980c4d727
7 files changed
+31 -9

No files matched your search

+2 -2
View File
@@ -2,7 +2,7 @@ from django import forms
from django.core.validators import EmailValidator from django.core.validators import EmailValidator
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from antispam.models import ToxicDomain from antispam.models.models import ToxicDomain
class AntiSpamEmailValidator(EmailValidator): class AntiSpamEmailValidator(EmailValidator):
@@ -17,6 +17,6 @@ validate_antispam_email = AntiSpamEmailValidator()
class AntiSpamEmailField(forms.EmailField): class AntiSpamEmailField(forms.EmailField):
"""An email field that email addresses with a known toxic domain.""" """An email field that forbids email addresses with a known toxic domain."""
default_validators = [validate_antispam_email] default_validators = [validate_antispam_email]
+4
View File
@@ -0,0 +1,4 @@
from antispam.models.fields import AntiSpamEmailField
from antispam.models.models import ToxicDomain
__all__ = ["AntiSpamEmailField", "ToxicDomain"]
+21
View File
@@ -0,0 +1,21 @@
from django.conf import settings
from django.db import models
from antispam import forms
class AntiSpamEmailField(models.EmailField):
"""An email field that forbids email addresses with a known toxic domain."""
default_validators = [forms.validate_antispam_email]
if settings.TESTING:
from model_bakery import baker
baker.generators.add(
AntiSpamEmailField, lambda: baker.random_gen.gen_email(max_length=100)
)
else: # pragma: no cover
# baker is only used in tests, so we don't need coverage for this part
pass
File renamed without changes.
View File
Whitespace-only changes.
+3 -2
View File
@@ -55,6 +55,7 @@ from django.utils.translation import gettext_lazy as _
from phonenumber_field.modelfields import PhoneNumberField from phonenumber_field.modelfields import PhoneNumberField
from PIL import Image, ImageOps from PIL import Image, ImageOps
from antispam.models import AntiSpamEmailField
from core.utils import get_last_promo from core.utils import get_last_promo
if TYPE_CHECKING: if TYPE_CHECKING:
@@ -158,7 +159,7 @@ class User(AbstractUser):
first_name = models.CharField(_("first name"), max_length=64) first_name = models.CharField(_("first name"), max_length=64)
last_name = models.CharField(_("last name"), max_length=64) last_name = models.CharField(_("last name"), max_length=64)
email = models.EmailField(_("email address"), unique=True) email = AntiSpamEmailField(_("email address"), unique=True)
date_of_birth = models.DateField(_("date of birth"), blank=True, null=True) date_of_birth = models.DateField(_("date of birth"), blank=True, null=True)
nick_name = models.CharField(_("nick name"), max_length=64, null=True, blank=True) nick_name = models.CharField(_("nick name"), max_length=64, null=True, blank=True)
last_update = models.DateTimeField(_("last update"), auto_now=True) last_update = models.DateTimeField(_("last update"), auto_now=True)
@@ -267,7 +268,7 @@ class User(AbstractUser):
forum_signature = models.TextField( forum_signature = models.TextField(
_("forum signature"), max_length=256, blank=True, default="" _("forum signature"), max_length=256, blank=True, default=""
) )
second_email = models.EmailField(_("second email address"), null=True, blank=True) second_email = AntiSpamEmailField(_("second email address"), null=True, blank=True)
phone = PhoneNumberField(_("phone"), null=True, blank=True) phone = PhoneNumberField(_("phone"), null=True, blank=True)
parent_phone = PhoneNumberField(_("parent phone"), null=True, blank=True) parent_phone = PhoneNumberField(_("parent phone"), null=True, blank=True)
address = models.CharField(_("address"), max_length=128, blank=True, default="") address = models.CharField(_("address"), max_length=128, blank=True, default="")
+1 -5
View File
@@ -48,7 +48,6 @@ from django.utils.translation import gettext_lazy as _
from phonenumber_field.widgets import RegionalPhoneNumberWidget from phonenumber_field.widgets import RegionalPhoneNumberWidget
from PIL import Image from PIL import Image
from antispam.forms import AntiSpamEmailField
from core.models import Gift, Group, Page, PageRev, Preferences, SithFile, User from core.models import Gift, Group, Page, PageRev, Preferences, SithFile, User
from core.utils import resize_image from core.utils import resize_image
from core.views.widgets.ajax_select import ( from core.views.widgets.ajax_select import (
@@ -185,10 +184,7 @@ class RegisteringForm(UserCreationForm):
class Meta: class Meta:
model = User model = User
fields = ("first_name", "last_name", "email", "cgu_approved_at") fields = ("first_name", "last_name", "email", "cgu_approved_at")
field_classes = { field_classes = {"cgu_approved_at": CGUApprovalField}
"email": AntiSpamEmailField,
"cgu_approved_at": CGUApprovalField,
}
class CGUApprovalForm(forms.ModelForm): class CGUApprovalForm(forms.ModelForm):