Files
n3wt-school/Back-End/School/serializers.py
2025-01-12 10:07:06 +01:00

195 lines
8.8 KiB
Python

from rest_framework import serializers
from .models import Teacher, Speciality, SchoolClass, Planning, LEVEL_CHOICES
from Subscriptions.models import RegistrationForm
from Subscriptions.serializers import StudentSerializer
from Auth.serializers import ProfileSerializer
from Auth.models import Profile
from N3wtSchool import settings, bdd
from django.utils import timezone
import pytz
class SpecialitySerializer(serializers.ModelSerializer):
creationDateFormatted = serializers.SerializerMethodField()
class Meta:
model = Speciality
fields = '__all__'
def get_creationDateFormatted(self, obj):
utc_time = timezone.localtime(obj.updatedDate) # Convert to local time
local_tz = pytz.timezone(settings.TZ_APPLI)
local_time = utc_time.astimezone(local_tz)
return local_time.strftime("%d-%m-%Y %H:%M")
class TeacherDetailSerializer(serializers.ModelSerializer):
specialities = SpecialitySerializer(many=True, read_only=True)
class Meta:
model = Teacher
fields = ['id', 'lastName', 'firstName', 'email', 'specialities']
class TeacherSerializer(serializers.ModelSerializer):
specialities = SpecialitySerializer(many=True, read_only=True)
specialties_ids = serializers.PrimaryKeyRelatedField(queryset=Speciality.objects.all(), many=True, source='specialities')
associatedProfile_id = serializers.PrimaryKeyRelatedField(queryset=Profile.objects.all(), source='associatedProfile', write_only=False, read_only=False)
mainClasses = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='schoolClasses')
associatedProfile = ProfileSerializer(read_only=True)
rightLabel = serializers.SerializerMethodField()
rightValue = serializers.SerializerMethodField()
creationDateFormatted = serializers.SerializerMethodField()
class Meta:
model = Teacher
fields = ['id', 'lastName', 'firstName', 'email', 'specialities', 'specialties_ids', 'mainClasses', 'associatedProfile', 'associatedProfile_id', 'rightLabel', 'rightValue', 'updatedDate', 'creationDateFormatted']
def create(self, validated_data):
specialties_data = validated_data.pop('specialities', None)
associatedProfile = validated_data.pop('associatedProfile', None)
teacher = Teacher.objects.create(**validated_data)
teacher.specialities.set(specialties_data)
if associatedProfile:
teacher.associatedProfile = associatedProfile
teacher.save()
return teacher
def update(self, instance, validated_data):
specialties_data = validated_data.pop('specialities', [])
instance.lastName = validated_data.get('lastName', instance.lastName)
instance.firstName = validated_data.get('firstName', instance.firstName)
instance.email = validated_data.get('email', instance.email)
instance.associatedProfile = validated_data.get('associatedProfile', instance.associatedProfile)
instance.save()
instance.specialities.set(specialties_data)
return instance
def get_rightLabel(self, obj):
return obj.associatedProfile.get_right_display() if obj.associatedProfile else None
def get_rightValue(self, obj):
return obj.associatedProfile.right if obj.associatedProfile else None
def get_creationDateFormatted(self, obj):
utc_time = timezone.localtime(obj.updatedDate) # Convert to local time
local_tz = pytz.timezone(settings.TZ_APPLI)
local_time = utc_time.astimezone(local_tz)
return local_time.strftime("%d-%m-%Y %H:%M")
class PlanningSerializer(serializers.ModelSerializer):
class Meta:
model = Planning
fields = ['id', 'level', 'schedule']
def to_internal_value(self, data):
internal_value = super().to_internal_value(data)
internal_value['schedule'] = data.get('schedule', {})
return internal_value
class SchoolClassSerializer(serializers.ModelSerializer):
creationDateFormatted = serializers.SerializerMethodField()
teachers = TeacherSerializer(many=True, read_only=True)
teachers_ids = serializers.PrimaryKeyRelatedField(queryset=Teacher.objects.all(), many=True, source='teachers')
students = serializers.SerializerMethodField()
levels = serializers.ListField(child=serializers.ChoiceField(choices=LEVEL_CHOICES))
plannings_read = serializers.SerializerMethodField()
plannings = PlanningSerializer(many=True, write_only=True)
class Meta:
model = SchoolClass
fields = [
'id', 'atmosphereName', 'ageGroup', 'numberOfStudents', 'teachingLanguage',
'teachers', 'teachers_ids', 'schoolYear', 'updatedDate',
'creationDateFormatted', 'students', 'levels', 'type', 'schedule',
'openingDays', 'plannings', 'plannings_read'
]
def create(self, validated_data):
teachers_data = validated_data.pop('teachers', [])
levels_data = validated_data.pop('levels', [])
plannings_data = validated_data.pop('plannings', [])
classModel = SchoolClass.objects.create(
atmosphereName=validated_data.get('atmosphereName', ''),
ageGroup=validated_data.get('ageGroup', []),
numberOfStudents=validated_data.get('numberOfStudents', 0),
teachingLanguage=validated_data.get('teachingLanguage', ''),
schoolYear=validated_data.get('schoolYear', ''),
levels=levels_data,
type=validated_data.get('type', 1), # Added here
schedule=validated_data.get('schedule', ['08:30', '17:30']), # Added here
openingDays=validated_data.get('openingDays', [1, 2, 4, 5]) # Added here
)
classModel.teachers.set(teachers_data)
for planning_data in plannings_data:
Planning.objects.create(
classModel=classModel,
level=planning_data['level'],
schedule=planning_data.get('schedule', {})
)
return classModel
def update(self, instance, validated_data):
teachers_data = validated_data.pop('teachers', [])
levels_data = validated_data.pop('levels', [])
plannings_data = validated_data.pop('plannings', [])
instance.atmosphereName = validated_data.get('atmosphereName', instance.atmosphereName)
instance.ageGroup = validated_data.get('ageGroup', instance.ageGroup)
instance.numberOfStudents = validated_data.get('numberOfStudents', instance.numberOfStudents)
instance.teachingLanguage = validated_data.get('teachingLanguage', instance.teachingLanguage)
instance.schoolYear = validated_data.get('schoolYear', instance.schoolYear)
instance.levels = levels_data
instance.type = validated_data.get('type', instance.type) # Added here
instance.schedule = validated_data.get('schedule', instance.schedule) # Added here
instance.openingDays = validated_data.get('openingDays', instance.openingDays) # Added here
instance.save()
instance.teachers.set(teachers_data)
existing_plannings = {planning.level: planning for planning in instance.plannings.all()}
for planning_data in plannings_data:
level = planning_data['level']
if level in existing_plannings:
# Update existing planning
planning = existing_plannings[level]
planning.schedule = planning_data.get('schedule', planning.schedule)
planning.save()
else:
# Create new planning if level not existing
Planning.objects.create(
classModel=instance,
level=level,
schedule=planning_data.get('schedule', {})
)
return instance
def get_creationDateFormatted(self, obj):
utc_time = timezone.localtime(obj.updatedDate)
local_tz = pytz.timezone(settings.TZ_APPLI)
local_time = utc_time.astimezone(local_tz)
return local_time.strftime("%d-%m-%Y %H:%M")
def get_students(self, obj):
studentsList = obj.students.all()
filtered_students = []
for student in studentsList:
registrationForm = bdd.getObject(RegistrationForm, "student__id", student.id)
if registrationForm.status == registrationForm.RegistrationFormStatus.RF_VALIDATED:
filtered_students.append(student)
return StudentSerializer(filtered_students, many=True, read_only=True).data
def get_plannings_read(self, obj):
plannings = obj.plannings.all()
levels_dict = {level: {'level': level, 'planning': None} for level in obj.levels}
for planning in plannings:
if planning.level in levels_dict:
levels_dict[planning.level]['planning'] = PlanningSerializer(planning).data
return list(levels_dict.values())