Coverage for api\serializers\epreuve.py: 94%
18 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 sérialiseur pour le modèle Epreuve.
4Ce module définit la sérialisation/désérialisation des données des épreuves
5sportives pour l'API REST, incluant la validation des doublons.
6"""
8from rest_framework import serializers
9from api.models import Epreuve, Discipline, Evenement
10from api.serializers.discipline import DisciplineSerializer
11from api.serializers.nested_serializer import NestedEvenementSerializer
14class EpreuveSerializer(serializers.ModelSerializer):
15 """
16 Sérialiseur pour le modèle Epreuve.
18 Gère la sérialisation des épreuves avec leurs relations aux disciplines et événements.
19 Inclut une validation pour éviter les doublons d'épreuves dans une même discipline.
21 Attributes:
22 discipline (DisciplineSerializer): Données complètes de la discipline (lecture seule)
23 discipline_id (PrimaryKeyRelatedField): ID de la discipline pour l'écriture
24 evenement (NestedEvenementSerializer): Données de l'événement associé (lecture seule)
25 evenement_id (PrimaryKeyRelatedField): ID de l'événement pour l'écriture (optionnel)
26 """
27 discipline = DisciplineSerializer(read_only=True)
28 discipline_id = serializers.PrimaryKeyRelatedField(
29 queryset=Discipline.objects.all(),
30 write_only=True,
31 source='discipline',
32 )
33 evenement = NestedEvenementSerializer(read_only=True)
34 evenement_id = serializers.PrimaryKeyRelatedField(
35 queryset=Evenement.objects.all(),
36 write_only=True,
37 source='evenement',
38 required=False,
39 allow_null=True,
40 )
42 def validate(self, data):
43 """
44 Valide les données de l'épreuve pour éviter les doublons.
46 Vérifie qu'aucune épreuve avec le même libellé n'existe déjà
47 pour la même discipline.
49 :param data: Données à valider
50 :type data: dict
51 :return: Données validées
52 :rtype: dict
53 :raises serializers.ValidationError: Si une épreuve similaire existe déjà
54 """
55 discipline = data.get('discipline') or self.instance.discipline
56 libelle = data.get('libelle') or self.instance.libelle
58 if Epreuve.objects.exclude(pk=self.instance.pk if self.instance else None).filter(
59 libelle=libelle,
60 discipline=discipline
61 ).exists():
62 raise serializers.ValidationError(
63 "Une épreuve avec ce libellé existe déjà pour cette discipline."
64 )
65 return data
67 class Meta:
68 """
69 Configuration du sérialiseur.
71 Attributes:
72 model (Model): Modèle Django associé au sérialiseur
73 fields (list): Champs inclus dans la sérialisation
74 """
75 model = Epreuve
76 fields = ['id',
77 'libelle',
78 'discipline',
79 'evenement',
80 'discipline_id',
81 'evenement_id',
82 'genre',
83 'tour']