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

1""" 

2Module contenant le sérialiseur pour le modèle Epreuve. 

3 

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

7 

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 

12 

13 

14class EpreuveSerializer(serializers.ModelSerializer): 

15 """ 

16 Sérialiseur pour le modèle Epreuve. 

17 

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. 

20 

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 ) 

41 

42 def validate(self, data): 

43 """ 

44 Valide les données de l'épreuve pour éviter les doublons. 

45 

46 Vérifie qu'aucune épreuve avec le même libellé n'existe déjà 

47 pour la même discipline. 

48 

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 

57 

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 

66 

67 class Meta: 

68 """ 

69 Configuration du sérialiseur. 

70 

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