Coverage for users\models\client.py: 95%
20 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"""
2Modèle de profil client.
4Ce module définit le profil client qui étend les informations de base
5de l'utilisateur avec des données spécifiques aux clients.
6"""
8import hashlib
9from django.db import models
10from .base_user import User
13class ClientProfile(models.Model):
14 """
15 Profil client lié à un utilisateur.
17 Étend les informations de base d'un utilisateur avec des données
18 spécifiques aux clients : nom, prénom, téléphone et clé chiffrée
19 générée automatiquement pour la sécurité.
21 :ivar user: Relation one-to-one avec l'utilisateur de base
22 :vartype user: User
23 :ivar nom: Nom de famille du client
24 :vartype nom: str
25 :ivar prenom: Prénom du client
26 :vartype prenom: str
27 :ivar telephone: Numéro de téléphone du client
28 :vartype telephone: str
29 :ivar cle_chiffree: Clé chiffrée générée automatiquement
30 :vartype cle_chiffree: str
31 """
33 user = models.OneToOneField(
34 User,
35 on_delete=models.CASCADE,
36 related_name='client_profile',
37 help_text="Utilisateur associé à ce profil client"
38 )
39 nom = models.CharField(max_length=100, help_text="Nom de famille du client")
40 prenom = models.CharField(max_length=100, help_text="Prénom du client")
41 telephone = models.CharField(max_length=20, help_text="Numéro de téléphone")
42 cle_chiffree = models.CharField(
43 max_length=255,
44 help_text="Clé chiffrée générée automatiquement"
45 )
47 def save(self, *args, **kwargs):
48 """
49 Sauvegarde le profil client avec génération automatique de la clé chiffrée.
51 Génère automatiquement une clé chiffrée basée sur l'email et le nom
52 si elle n'existe pas déjà.
54 :param args: Arguments positionnels pour la méthode save
55 :param kwargs: Arguments nommés pour la méthode save
56 """
57 if not self.cle_chiffree:
58 raw_key = f"{self.user.email}-{self.nom}"
59 self.cle_chiffree = hashlib.sha256(raw_key.encode('utf-8')).hexdigest()
60 super().save(*args, **kwargs)
62 def __str__(self) -> str:
63 """
64 Représentation textuelle du profil client.
66 :return: Nom complet du client (nom + prénom)
67 :rtype: str
68 """
69 return f"{self.nom} {self.prenom}"
71 class Meta:
72 """
73 Métadonnées du modèle ClientProfile.
75 :cvar verbose_name: Nom lisible au singulier
76 :vartype verbose_name: str
77 :cvar verbose_name_plural: Nom lisible au pluriel
78 :vartype verbose_name_plural: str
79 :cvar ordering: Ordre par défaut (nom, prénom)
80 :vartype ordering: list
81 """
82 verbose_name = "Profil Client"
83 verbose_name_plural = "Profils Clients"
84 ordering = ['nom', 'prenom']