feat: Gestion des profils ADMIN/ECOLE (création des enseignants)

This commit is contained in:
N3WT DE COMPET
2025-03-22 17:20:49 +01:00
parent c9350a796b
commit e0bfd3e115
9 changed files with 249 additions and 134 deletions

View File

@ -68,6 +68,7 @@ class ProfileSerializer(serializers.ModelSerializer):
return ret
class ProfileRoleSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
profile = serializers.PrimaryKeyRelatedField(queryset=Profile.objects.all(), required=False)
profile_data = ProfileSerializer(write_only=True, required=False)
associated_profile_email = serializers.SerializerMethodField()

View File

@ -32,7 +32,7 @@ class Teacher(models.Model):
last_name = models.CharField(max_length=100)
first_name = models.CharField(max_length=100)
specialities = models.ManyToManyField(Speciality, blank=True)
profile_role = models.OneToOneField(ProfileRole, on_delete=models.CASCADE, related_name='teacher_profile', null=True, blank=True)
profile_role = models.OneToOneField(ProfileRole, on_delete=models.CASCADE, related_name='teacher_profile', blank=True)
updated_date = models.DateTimeField(auto_now=True)
def __str__(self):

View File

@ -33,72 +33,85 @@ class TeacherSerializer(serializers.ModelSerializer):
specialities = serializers.PrimaryKeyRelatedField(queryset=Speciality.objects.all(), many=True, required=False)
specialities_details = serializers.SerializerMethodField()
updated_date_formatted = serializers.SerializerMethodField()
role_type_display = serializers.SerializerMethodField()
role_type = serializers.IntegerField(write_only=True)
associated_profile_email = serializers.EmailField(write_only=True)
role_type = serializers.SerializerMethodField()
profile_role = serializers.PrimaryKeyRelatedField(queryset=ProfileRole.objects.all(), required=False)
associated_profile_email_display = serializers.SerializerMethodField()
profile_role_data = ProfileRoleSerializer(write_only=True, required=False)
associated_profile_email = serializers.SerializerMethodField()
class Meta:
model = Teacher
fields = '__all__'
def create_or_update_profile_role(self, profile, associated_profile_email, establishment_id, role_type):
# Mettre à jour l'email du profil si nécessaire
if profile.email != associated_profile_email:
profile.email = associated_profile_email
profile.username = associated_profile_email
profile.save()
def create_or_update_teacher(self, teacher_data):
profile_role_data = teacher_data.pop('profile_role_data', None)
profile_role = teacher_data.pop('profile_role', None)
profile_role, created = ProfileRole.objects.update_or_create(
profile=profile,
establishment_id=establishment_id,
defaults={'role_type': role_type, 'is_active': True}
)
# Gestion du ProfileRole
if profile_role_data:
# Vérifiez si 'profile' est un objet ou une clé primaire
if isinstance(profile_role_data.get('profile'), Profile):
profile_role_data['profile'] = profile_role_data['profile'].id
establishment_id = profile_role_data.pop('establishment').id
profile_role_data['establishment'] = establishment_id
if not created:
profile_role.role_type = role_type
profile_role.establishment_id = establishment_id
profile_role.save()
# Vérifiez si un ID est fourni pour une mise à jour
profile_role_id = profile_role_data.get('id')
if profile_role_id:
# Mettre à jour un ProfileRole existant
try:
profile_role_instance = ProfileRole.objects.get(id=profile_role_id)
profile_role_serializer = ProfileRoleSerializer(profile_role_instance, data=profile_role_data)
profile_role_serializer.is_valid(raise_exception=True)
profile_role = profile_role_serializer.save()
except ProfileRole.DoesNotExist:
raise serializers.ValidationError({"profile_role_data": f"ProfileRole with id {profile_role_id} does not exist."})
else:
# Créer un nouveau ProfileRole
profile_role_serializer = ProfileRoleSerializer(data=profile_role_data)
profile_role_serializer.is_valid(raise_exception=True)
profile_role = profile_role_serializer.save()
elif profile_role:
# Récupérer un ProfileRole existant
profile_role = ProfileRole.objects.get(id=profile_role.id)
return profile_role
if profile_role:
teacher_data['profile_role'] = profile_role
# Vérifier si un Teacher existe déjà pour ce profile_role
teacher_instance = Teacher.objects.filter(profile_role=profile_role).first()
if teacher_instance:
# Mettre à jour les champs existants
for key, value in teacher_data.items():
setattr(teacher_instance, key, value)
teacher_instance.save()
created = False
else:
# Créer un nouveau Teacher
teacher_instance = Teacher.objects.create(**teacher_data)
created = True
return teacher_instance
def create(self, validated_data):
specialities_data = validated_data.pop('specialities', None)
associated_profile_email = validated_data.pop('associated_profile_email')
establishment_id = validated_data.get('establishment')
role_type = validated_data.pop('role_type')
specialities_data = validated_data.pop('specialities', [])
teacher_instance = self.create_or_update_teacher(validated_data)
profile, created = Profile.objects.get_or_create(
email=associated_profile_email,
defaults={'username': associated_profile_email}
)
profile_role = self.create_or_update_profile_role(profile, associated_profile_email, establishment_id, role_type)
teacher = Teacher.objects.create(profile_role=profile_role, **validated_data)
# Associer les spécialités
if specialities_data:
teacher.specialities.set(specialities_data)
teacher.save()
return teacher
teacher_instance.specialities.set(specialities_data)
return teacher_instance
def update(self, instance, validated_data):
specialities_data = validated_data.pop('specialities', [])
associated_profile_email = validated_data.pop('associated_profile_email', instance.profile_role.profile.email)
establishment_id = validated_data.get('establishment', instance.profile_role.establishment.id)
role_type = validated_data.get('role_type', instance.profile_role.role_type)
teacher_instance = self.create_or_update_teacher(validated_data)
profile = instance.profile_role.profile
profile_role = self.create_or_update_profile_role(profile, associated_profile_email, establishment_id, role_type)
instance.profile_role = profile_role
instance.last_name = validated_data.get('last_name', instance.last_name)
instance.first_name = validated_data.get('first_name', instance.first_name)
instance.save()
# Mettre à jour les spécialités
if specialities_data:
instance.specialities.set(specialities_data)
return instance
teacher_instance.specialities.set(specialities_data)
return teacher_instance
def get_updated_date_formatted(self, obj):
utc_time = timezone.localtime(obj.updated_date) # Convert to local time
@ -114,14 +127,11 @@ class TeacherSerializer(serializers.ModelSerializer):
return obj.profile_role.profile.email
return None
def get_role_type_display(self, obj):
def get_role_type(self, obj):
if obj.profile_role:
return obj.profile_role.role_type
return None
def get_associated_profile_email_display(self, obj):
return self.get_associated_profile_email(obj)
class PlanningSerializer(serializers.ModelSerializer):
class Meta:
model = Planning

View File

@ -116,7 +116,7 @@ class TeacherDetailView(APIView):
return JsonResponse(teacher_serializer.errors, safe=False)
def delete(self, request, id):
return delete_object(Teacher, id, related_field='profile')
return delete_object(Teacher, id, related_field='profile_role')
@method_decorator(csrf_protect, name='dispatch')
@method_decorator(ensure_csrf_cookie, name='dispatch')