Coverage for api\models\ticket.py: 68%

22 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-13 15:18 +0200

1""" 

2Module contenant le modèle Ticket pour la gestion des billets. 

3 

4Ce module définit la structure de données pour les tickets achetés 

5par les clients pour les événements des Jeux Olympiques. 

6Chaque ticket est associé à un client, un événement et une offre spécifique, 

7et possède une clé unique générée automatiquement. 

8""" 

9 

10import hashlib 

11from django.db import models 

12from users.models import ClientProfile 

13 

14class Ticket(models.Model): 

15 """ 

16 Modèle représentant un ticket pour un événement sportif. 

17 

18 Un ticket est associé à un client, un événement et une offre spécifique. 

19 Chaque ticket possède un statut et une clé unique générée automatiquement 

20 pour garantir l'unicité. 

21 

22 :ivar client: Le client possédant le ticket 

23 :type client: ClientProfile 

24 :ivar evenement: L'événement associé au ticket 

25 :type evenement: Evenement 

26 :ivar offre: L'offre choisie pour ce ticket 

27 :type offre: Offre 

28 :ivar date_achat: Date et heure d'achat du ticket 

29 :type date_achat: datetime 

30 :ivar statut: Statut du ticket ('valide' ou 'invalide') 

31 :type statut: str 

32 :ivar key: Clé unique générée pour le ticket 

33 :type key: str 

34 """ 

35 STATUT_CHOICES = [ 

36 ('valide', 'Valide'), 

37 ('invalide', 'Invalide') 

38 ] 

39 

40 client = models.ForeignKey(ClientProfile, on_delete=models.CASCADE) 

41 evenement = models.ForeignKey('Evenement', on_delete=models.CASCADE) 

42 offre = models.ForeignKey('Offre', on_delete=models.CASCADE) 

43 date_achat = models.DateTimeField(auto_now_add=True) 

44 statut = models.CharField(max_length=10, choices=STATUT_CHOICES, default='valide') 

45 key = models.CharField(max_length=255, unique=True) 

46 

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

48 """ 

49 Sauvegarde le ticket et génère une clé unique incluant l'ID. 

50 

51 La clé est calculée après la première insertion pour inclure self.id, 

52 garantissant l'unicité absolue. La clé est un hash SHA-256 basé sur 

53 le client, la date d'achat et l'identifiant du ticket. 

54 """ 

55 # Sauvegarde initiale pour générer l'ID si nécessaire 

56 if not self.id: 

57 super().save(*args, **kwargs) 

58 

59 if not self.key: 

60 raw_key = f"{self.client.cle_chiffree}-{self.date_achat}-{self.id}" 

61 self.key = hashlib.sha256(raw_key.encode('utf-8')).hexdigest() 

62 super().save(*args, **kwargs) 

63 

64 def __str__(self): 

65 """ 

66 Représentation textuelle du ticket. 

67 

68 :return: Chaîne décrivant le ticket avec son ID, l'événement et le nom du client 

69 :rtype: str 

70 """ 

71 return f"Ticket {self.id} - {self.evenement} - {self.client.nom}" 

72 

73 class Meta: 

74 """ 

75 Métadonnées du modèle Ticket. 

76 

77 :cvar ordering: Ordre par défaut des tickets, triés par date d'achat décroissante 

78 :type ordering: list 

79 """ 

80 ordering = ['-date_achat']