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

1""" 

2Modèle de profil client. 

3 

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""" 

7 

8import hashlib 

9from django.db import models 

10from .base_user import User 

11 

12 

13class ClientProfile(models.Model): 

14 """ 

15 Profil client lié à un utilisateur. 

16 

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é. 

20 

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 """ 

32 

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 ) 

46 

47 def save(self, *args, **kwargs): 

48 """ 

49 Sauvegarde le profil client avec génération automatique de la clé chiffrée. 

50 

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à. 

53 

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) 

61 

62 def __str__(self) -> str: 

63 """ 

64 Représentation textuelle du profil client. 

65 

66 :return: Nom complet du client (nom + prénom) 

67 :rtype: str 

68 """ 

69 return f"{self.nom} {self.prenom}" 

70 

71 class Meta: 

72 """ 

73 Métadonnées du modèle ClientProfile. 

74 

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']