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
« 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.
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"""
10import hashlib
11from django.db import models
12from users.models import ClientProfile
14class Ticket(models.Model):
15 """
16 Modèle représentant un ticket pour un événement sportif.
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é.
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 ]
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)
47 def save(self, *args, **kwargs):
48 """
49 Sauvegarde le ticket et génère une clé unique incluant l'ID.
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)
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)
64 def __str__(self):
65 """
66 Représentation textuelle du ticket.
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}"
73 class Meta:
74 """
75 Métadonnées du modèle Ticket.
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']