mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-28 23:43:22 +00:00
feat: Gestion des profils ADMIN/ECOLE (création des enseignants)
This commit is contained in:
@ -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):
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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')
|
||||
|
||||
Reference in New Issue
Block a user