feat: Refactoring de la fonction de création de profil sur guardian côté

FRONT
This commit is contained in:
N3WT DE COMPET
2025-03-11 21:58:09 +01:00
parent 023b46e16e
commit 753a8d647e
18 changed files with 326 additions and 386 deletions

View File

@ -2,8 +2,8 @@ from rest_framework import serializers
from .models import RegistrationFileGroup, RegistrationForm, Student, Guardian, Sibling, Language, RegistrationTemplateMaster, RegistrationTemplate
from School.models import SchoolClass, Fee, Discount, FeeType
from School.serializers import FeeSerializer, DiscountSerializer
from Auth.models import ProfileRole
from Auth.serializers import ProfileSerializer
from Auth.models import ProfileRole, Profile
from Auth.serializers import ProfileSerializer, ProfileRoleSerializer
from GestionMessagerie.models import Messagerie
from GestionNotification.models import Notification
from N3wtSchool import settings
@ -24,9 +24,14 @@ class RegistrationTemplateSerializer(serializers.ModelSerializer):
fields = '__all__'
class GuardianSimpleSerializer(serializers.ModelSerializer):
associated_profile_email = serializers.SerializerMethodField()
class Meta:
model = Guardian
fields = ['id', 'email']
fields = ['id', 'associated_profile_email']
def get_associated_profile_email(self, obj):
return obj.profile_role.profile.email
class RegistrationFormSimpleSerializer(serializers.ModelSerializer):
guardians = GuardianSimpleSerializer(many=True, source='student.guardians')
@ -68,7 +73,7 @@ class SiblingSerializer(serializers.ModelSerializer):
class GuardianSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
profile_role = serializers.PrimaryKeyRelatedField(queryset=ProfileRole.objects.all(), required=True)
profile_role = ProfileRoleSerializer()
associated_profile_email = serializers.SerializerMethodField()
class Meta:
@ -78,13 +83,11 @@ class GuardianSerializer(serializers.ModelSerializer):
def get_associated_profile_email(self, obj):
return obj.profile_role.profile.email
class StudentSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
guardians = GuardianSerializer(many=True, required=False)
siblings = SiblingSerializer(many=True, required=False)
languages = LanguageSerializer(many=True, required=False)
spoken_languages = LanguageSerializer(many=True, required=False)
associated_class_id = serializers.PrimaryKeyRelatedField(queryset=SchoolClass.objects.all(), source='associated_class', required=False, write_only=False, read_only=False)
age = serializers.SerializerMethodField()
formatted_birth_date = serializers.SerializerMethodField()
@ -95,30 +98,19 @@ class StudentSerializer(serializers.ModelSerializer):
model = Student
fields = '__all__'
def get_or_create_packages(self, guardians_data):
def create_or_update_guardians(self, guardians_data):
guardians_ids = []
for guardian_data in guardians_data:
guardian_instance, created = Guardian.objects.get_or_create(
id=guardian_data.get('id'),
defaults=guardian_data
)
guardians_ids.append(guardian_instance.id)
return guardians_ids
profile_role_data = guardian_data.pop('profile_role')
establishment_id = profile_role_data.pop('establishment').id
profile_role_data['establishment'] = establishment_id
def create(self, validated_data):
guardians_data = validated_data.pop('guardians', [])
siblings_data = validated_data.pop('siblings', [])
languages_data = validated_data.pop('spoken_languages', [])
student = Student.objects.create(**validated_data)
student.guardians.set(self.get_or_create_packages(guardians_data))
student.siblings.set(self.get_or_create_packages(siblings_data))
student.spoken_languages.set(self.get_or_create_packages(languages_data))
profile_role_serializer = ProfileRoleSerializer(data=profile_role_data)
profile_role_serializer.is_valid(raise_exception=True)
profile_role = profile_role_serializer.save()
return student
guardian_data['profile_role'] = profile_role
def create_or_update_packages(self, guardians_data):
guardians_ids = []
for guardian_data in guardians_data:
guardian_instance, created = Guardian.objects.update_or_create(
id=guardian_data.get('id'),
defaults=guardian_data
@ -126,16 +118,47 @@ class StudentSerializer(serializers.ModelSerializer):
guardians_ids.append(guardian_instance.id)
return guardians_ids
def create_or_update_siblings(self, siblings_data):
siblings_ids = []
for sibling_data in siblings_data:
sibling_instance, created = Sibling.objects.update_or_create(
id=sibling_data.get('id'),
defaults=sibling_data
)
siblings_ids.append(sibling_instance.id)
return siblings_ids
def create_or_update_languages(self, languages_data):
languages_ids = []
for language_data in languages_data:
language_instance, created = Language.objects.update_or_create(
id=language_data.get('id'),
defaults=language_data
)
languages_ids.append(language_instance.id)
return languages_ids
def create(self, validated_data):
guardians_data = validated_data.pop('guardians', [])
siblings_data = validated_data.pop('siblings', [])
languages_data = validated_data.pop('lanspoken_languagesguages', [])
student = Student.objects.create(**validated_data)
student.guardians.set(self.create_or_update_guardians(guardians_data))
student.siblings.set(self.create_or_update_siblings(siblings_data))
student.spoken_languages.set(self.create_or_update_languages(languages_data))
return student
def update(self, instance, validated_data):
guardians_data = validated_data.pop('guardians', [])
siblings_data = validated_data.pop('siblings', [])
languages_data = validated_data.pop('spoken_languages', [])
if guardians_data:
instance.guardians.set(self.create_or_update_packages(guardians_data))
instance.guardians.set(self.create_or_update_guardians(guardians_data))
if siblings_data:
instance.siblings.set(self.create_or_update_packages(siblings_data))
instance.siblings.set(self.create_or_update_siblings(siblings_data))
if languages_data:
instance.spoken_languages.set(self.create_or_update_packages(languages_data))
instance.spoken_languages.set(self.create_or_update_languages(languages_data))
for field in self.fields:
try: