from rest_framework import serializers from ..models import CustomUser, SousVivier, FormationEmploi from ..utils.permissions import KEY_READ, KEY_WRITE from .pcp_fe_groupe import PcpFeGroupeSerializer CTX_KEY_SOUS_VIVIERS_SUPER = 'sous_viviers_super' CTX_KEY_SOUS_VIVIERS = 'sous_viviers' CTX_KEY_FORMATION_EMPLOIS = 'formation_emplois' CTX_KEY_PCP_FE_GROUPE = 'fe_groupe' CTX_KEY_PROFILES = 'profiles' class _SousVivierUserSerializer(serializers.ModelSerializer): """ Classe de représentation d'un sous-vivier de l'utilisateur """ class Meta: model = SousVivier exclude = ('gestionnaires',) def to_representation(self, instance): res = super().to_representation(instance) ids_super = self.context.get(CTX_KEY_SOUS_VIVIERS_SUPER) if ids_super and instance.pk in ids_super: res['admin'] = True return res class _FormationEmploiUserSerializer(serializers.ModelSerializer): """ Classe de représentation d'un sous-vivier de l'utilisateur """ class Meta: model = FormationEmploi fields = [FormationEmploi.Cols.PK, FormationEmploi.Cols.LIBELLE, 'fe_mere_credo', 'fe_mere_la', 'gestionnaire_id'] gestionnaire_id = serializers.ReadOnlyField() def to_representation(self, instance): res = super().to_representation(instance) return res class UserInfoSerializer(serializers.ModelSerializer): """ Gère la forme publique de l'utilisateur connecté. """ class Meta: model = CustomUser fields = ['id', 'username', 'first_name', 'last_name', 'email', 'grade', 'administre'] administre = serializers.ReadOnlyField(source='administre_id') def to_representation(self, instance): res = super().to_representation(instance) svs_super = self.context.get(CTX_KEY_SOUS_VIVIERS_SUPER) or () svs = self.context.get(CTX_KEY_SOUS_VIVIERS) or () fes = self.context.get(CTX_KEY_FORMATION_EMPLOIS) or () all_svs = set(list(svs) + list(svs_super)) all_fes = set(list(fes)) svs_ids_specific_super = {sv.pk for sv in svs_super if sv not in svs} res['sous_viviers'] = _SousVivierUserSerializer(all_svs, many=True, context={ CTX_KEY_SOUS_VIVIERS_SUPER: svs_ids_specific_super }).data res['formation_emplois'] = _FormationEmploiUserSerializer(all_fes, many=True).data res['fe_groupe'] = PcpFeGroupeSerializer(self.context.get(CTX_KEY_PCP_FE_GROUPE) or ()).data profiles = self.context.get(CTX_KEY_PROFILES) or {} res['profils'] = {'lecture': profiles.get(KEY_READ) or (), 'ecriture': profiles.get(KEY_WRITE) or ()} return res