diff --git a/Back-End/School/serializers.py b/Back-End/School/serializers.py index 320efd5..d3bae13 100644 --- a/Back-End/School/serializers.py +++ b/Back-End/School/serializers.py @@ -31,8 +31,10 @@ class TeacherDetailSerializer(serializers.ModelSerializer): class TeacherSerializer(serializers.ModelSerializer): specialities = serializers.PrimaryKeyRelatedField(queryset=Speciality.objects.all(), many=True, required=False) + specialities_details = serializers.SerializerMethodField() associated_profile = serializers.PrimaryKeyRelatedField(queryset=Profile.objects.all(), required=True) updated_date_formatted = serializers.SerializerMethodField() + droit = serializers.SerializerMethodField() class Meta: model = Teacher @@ -67,6 +69,18 @@ class TeacherSerializer(serializers.ModelSerializer): return local_time.strftime("%d-%m-%Y %H:%M") + def get_droit(self, obj): + if obj.associated_profile: + droit_id = obj.associated_profile.droit + return { + "label": obj.associated_profile.get_droit_display(), + "id": droit_id + } + return None + + def get_specialities_details(self, obj): + return [{'name': speciality.name, 'color_code': speciality.color_code} for speciality in obj.specialities.all()] + class PlanningSerializer(serializers.ModelSerializer): class Meta: model = Planning @@ -80,6 +94,7 @@ class PlanningSerializer(serializers.ModelSerializer): class SchoolClassSerializer(serializers.ModelSerializer): updated_date_formatted = serializers.SerializerMethodField() teachers = serializers.PrimaryKeyRelatedField(queryset=Teacher.objects.all(), many=True, required=False) + teachers_details = serializers.SerializerMethodField() class Meta: model = SchoolClass @@ -150,6 +165,9 @@ class SchoolClassSerializer(serializers.ModelSerializer): return instance + def get_teachers_details(self, obj): + return [{'last_name': teacher.last_name, 'first_name': teacher.first_name} for teacher in obj.teachers.all()] + def get_updated_date_formatted(self, obj): utc_time = timezone.localtime(obj.updated_date) local_tz = pytz.timezone(settings.TZ_APPLI) diff --git a/Front-End/src/app/[locale]/admin/structure/page.js b/Front-End/src/app/[locale]/admin/structure/page.js index 7ae7b2f..365a30f 100644 --- a/Front-End/src/app/[locale]/admin/structure/page.js +++ b/Front-End/src/app/[locale]/admin/structure/page.js @@ -11,6 +11,7 @@ import { BE_SCHOOL_SPECIALITIES_URL, import DjangoCSRFToken from '@/components/DjangoCSRFToken' import useCsrfToken from '@/hooks/useCsrfToken'; import { ClassesProvider } from '@/context/ClassesContext'; +import { fetchSpecialities, fetchTeachers, fetchClasses, fetchSchedules } from '@/app/lib/schoolAction'; export default function Page() { const [specialities, setSpecialities] = useState([]); @@ -27,21 +28,20 @@ export default function Page() { useEffect(() => { // Fetch data for specialities - fetchSpecialities(); + handleSpecialities(); // Fetch data for teachers - fetchTeachers(); + handleTeachers(); // Fetch data for classes - fetchClasses(); + handleClasses(); // Fetch data for schedules - fetchSchedules(); + handleSchedules(); }, []); - const fetchSpecialities = () => { - fetch(`${BE_SCHOOL_SPECIALITIES_URL}`) - .then(response => response.json()) + const handleSpecialities = () => { + fetchSpecialities() .then(data => { setSpecialities(data); }) @@ -50,9 +50,8 @@ export default function Page() { }); }; - const fetchTeachers = () => { - fetch(`${BE_SCHOOL_TEACHERS_URL}`) - .then(response => response.json()) + const handleTeachers = () => { + fetchTeachers() .then(data => { setTeachers(data); }) @@ -61,9 +60,8 @@ export default function Page() { }); }; - const fetchClasses = () => { - fetch(`${BE_SCHOOL_SCHOOLCLASSES_URL}`) - .then(response => response.json()) + const handleClasses = () => { + fetchClasses() .then(data => { setClasses(data); }) @@ -72,9 +70,8 @@ export default function Page() { }); }; - const fetchSchedules = () => { - fetch(`${BE_SCHOOL_PLANNINGS_URL}`) - .then(response => response.json()) + const handleSchedules = () => { + fetchSchedules() .then(data => { setSchedules(data); }) @@ -142,7 +139,6 @@ export default function Page() { }); }; - const handleDelete = (url, id, setDatas) => { fetch(`${url}/${id}`, { method:'DELETE', diff --git a/Front-End/src/app/lib/schoolAction.js b/Front-End/src/app/lib/schoolAction.js index fceb666..29080e1 100644 --- a/Front-End/src/app/lib/schoolAction.js +++ b/Front-End/src/app/lib/schoolAction.js @@ -1,9 +1,26 @@ import { - BE_SCHOOL_SCHOOLCLASSES_URL + BE_SCHOOL_SPECIALITIES_URL, + BE_SCHOOL_TEACHERS_URL, + BE_SCHOOL_SCHOOLCLASSES_URL, + BE_SCHOOL_PLANNINGS_URL } from '@/utils/Url'; - export const fetchClasses = () => { - return fetch(`${BE_SCHOOL_SCHOOLCLASSES_URL}`) - .then(response => response.json()) +export const fetchSpecialities = () => { + return fetch(`${BE_SCHOOL_SPECIALITIES_URL}`) + .then(response => response.json()) +}; - }; \ No newline at end of file +export const fetchTeachers = () => { + return fetch(`${BE_SCHOOL_TEACHERS_URL}`) + .then(response => response.json()) +}; + +export const fetchClasses = () => { + return fetch(`${BE_SCHOOL_SCHOOLCLASSES_URL}`) + .then(response => response.json()) +}; + +export const fetchSchedules = () => { + return fetch(`${BE_SCHOOL_PLANNINGS_URL}`) + .then(response => response.json()) +}; \ No newline at end of file diff --git a/Front-End/src/components/ClasseDetails.js b/Front-End/src/components/ClasseDetails.js index 823c4ac..cc13f29 100644 --- a/Front-End/src/components/ClasseDetails.js +++ b/Front-End/src/components/ClasseDetails.js @@ -6,7 +6,7 @@ const ClasseDetails = ({ classe }) => { if (!classe) return null; const nombreElevesInscrits = classe.eleves.length; - const capaciteTotale = classe.nombre_eleves; + const capaciteTotale = classe.number_of_students; const pourcentage = Math.round((nombreElevesInscrits / capaciteTotale) * 100); const getColor = (pourcentage) => { diff --git a/Front-End/src/components/Inscription/InscriptionFormShared.js b/Front-End/src/components/Inscription/InscriptionFormShared.js index 2190a57..3d2a0f8 100644 --- a/Front-End/src/components/Inscription/InscriptionFormShared.js +++ b/Front-End/src/components/Inscription/InscriptionFormShared.js @@ -8,7 +8,7 @@ import DjangoCSRFToken from '@/components/DjangoCSRFToken'; import FileUpload from '@/app/[locale]/admin/subscriptions/components/FileUpload'; import Table from '@/components/Table'; -const niveaux = [ +const levels = [ { value:'1', label: 'TPS - Très Petite Section'}, { value:'2', label: 'PS - Petite Section'}, { value:'3', label: 'MS - Moyenne Section'}, @@ -158,7 +158,7 @@ export default function InscriptionFormShared({ label="Niveau" selected={formData.level} callback={(e) => updateFormField('level', e.target.value)} - choices={niveaux} + choices={levels} required /> diff --git a/Front-End/src/components/Structure/Configuration/ClassForm.js b/Front-End/src/components/Structure/Configuration/ClassForm.js index f7e5729..8088b1a 100644 --- a/Front-End/src/components/Structure/Configuration/ClassForm.js +++ b/Front-End/src/components/Structure/Configuration/ClassForm.js @@ -13,7 +13,7 @@ const ClassForm = ({ onSubmit, isNew, teachers }) => { const { formData, setFormData } = useClasseForm(); const { getNiveauNameById, schoolYears, getNiveauxLabels, getNiveauxTabs, generateAgeToNiveaux, niveauxPremierCycle, niveauxSecondCycle, niveauxTroisiemeCycle, typeEmploiDuTemps, updatePlannings } = useClasses(); - const [selectedTeachers, setSelectedTeachers] = useState(formData.enseignants_ids); + const [selectedTeachers, setSelectedTeachers] = useState(formData.teachers); const handleTeacherSelection = (teacher) => { setSelectedTeachers(prevState => @@ -23,21 +23,21 @@ const ClassForm = ({ onSubmit, isNew, teachers }) => { ); setFormData(prevState => ({ ...prevState, - enseignants_ids: prevState.enseignants_ids.includes(teacher.id) - ? prevState.enseignants_ids.filter(id => id !== teacher.id) - : [...prevState.enseignants_ids, teacher.id] + teachers: prevState.teachers.includes(teacher.id) + ? prevState.teachers.filter(id => id !== teacher.id) + : [...prevState.teachers, teacher.id] })); }; const handleTimeChange = (e, index) => { const { value } = e.target; setFormData(prevState => { - const updatedTimes = [...prevState.plage_horaire]; + const updatedTimes = [...prevState.time_range]; updatedTimes[index] = value; const updatedFormData = { ...prevState, - plage_horaire: updatedTimes, + time_range: updatedTimes, }; const existingPlannings = prevState.plannings || []; @@ -53,12 +53,12 @@ const ClassForm = ({ onSubmit, isNew, teachers }) => { setFormData((prevState) => { const updatedJoursOuverture = checked - ? [...prevState.jours_ouverture, dayId] - : prevState.jours_ouverture.filter((id) => id !== dayId); + ? [...prevState.opening_days, dayId] + : prevState.opening_days.filter((id) => id !== dayId); const updatedFormData = { ...prevState, - jours_ouverture: updatedJoursOuverture, + opening_days: updatedJoursOuverture, }; const existingPlannings = prevState.plannings || []; @@ -82,7 +82,7 @@ const ClassForm = ({ onSubmit, isNew, teachers }) => { ? [...(prevState[name] || []), parseInt(value)] : (prevState[name] || []).filter(v => v !== parseInt(value)); newState[name] = newValues; - } else if (name === 'tranche_age') { + } else if (name === 'age_range') { const [minAgeStr, maxAgeStr] = value.split('-'); const minAge = minAgeStr ? parseInt(minAgeStr) : null; const maxAge = minAgeStr ? parseInt(maxAgeStr) : null; @@ -92,7 +92,7 @@ const ClassForm = ({ onSubmit, isNew, teachers }) => { newState = { ...prevState, [name]: value, - niveaux: selectedNiveaux.length > 0 ? selectedNiveaux : [], + levels: selectedNiveaux.length > 0 ? selectedNiveaux : [], }; } else if (type === 'radio') { newState[name] = parseInt(value, 10); @@ -111,7 +111,7 @@ const ClassForm = ({ onSubmit, isNew, teachers }) => { onSubmit(formData); }; - const [minAge, maxAge] = formData.tranche_age.length === 2 ? formData.tranche_age : [null, null]; + const [minAge, maxAge] = formData.age_range.length === 2 ? formData.age_range : [null, null]; const selectedAgeGroup = generateAgeToNiveaux(minAge, maxAge); return ( @@ -136,11 +136,11 @@ const ClassForm = ({ onSubmit, isNew, teachers }) => {