Coverage for authentication\validators\emailValidator.py: 82%
17 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 15:18 +0200
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 15:18 +0200
1"""
2Validateur personnalisé pour les adresses email.
4Ce module fournit un validateur qui vérifie le format de l'email,
5rejette les emails jetables et s'assure que l'adresse n'est pas déjà utilisée
6dans le système.
8:module: users.validators.email
9"""
11import re
12from django.core.exceptions import ValidationError
13from django.utils.translation import gettext_lazy as _
14from users.models.base_user import User # adapte ce chemin selon ton projet
16class EmailValidator:
17 """
18 Validateur personnalisé pour les adresses email.
20 Vérifie :
21 - le format de l'email,
22 - l'absence de domaines d'emails jetables,
23 - l'unicité de l'email dans la base de données.
25 :ivar forbidden_domains: Liste des domaines d'emails jetables interdits
26 :type forbidden_domains: list
27 """
29 def __init__(self, forbidden_domains=None):
30 """
31 Initialise le validateur avec une liste de domaines interdits.
33 :param forbidden_domains: Domaines d'emails jetables à interdire
34 :type forbidden_domains: list, optional
35 """
36 self.forbidden_domains = forbidden_domains or [
37 'tempmail.com',
38 'mailinator.com',
39 'yopmail.com',
40 '10minutemail.com',
41 ]
43 def __call__(self, value):
44 """
45 Valide l'adresse email selon plusieurs critères.
47 :param value: L'adresse email à valider
48 :type value: str
49 :raises ValidationError: Si l'email est invalide, jetable ou déjà utilisé
50 """
51 # Vérification du format
52 if not re.match(r'^[\w\.-]+@[\w\.-]+\.\w+$', value):
53 raise ValidationError(_("Adresse e-mail invalide."))
55 # Vérification des domaines interdits
56 domain = value.split('@')[-1].lower()
57 if domain in self.forbidden_domains:
58 raise ValidationError(_("Les adresses e-mail jetables ne sont pas autorisées."))
60 # Vérification de l'unicité
61 if User.objects.filter(email__iexact=value).exists():
62 raise ValidationError(_("Un utilisateur avec cet e-mail existe déjà."))
64 def get_help_text(self):
65 """
66 Retourne le texte d'aide pour ce validateur.
68 :return: Message d'aide expliquant les règles de validation
69 :rtype: str
70 """
71 return _(
72 "Utilisez une adresse e-mail valide, non temporaire, et qui n'est pas déjà enregistrée."
73 )