fix: gestion des codes retours

This commit is contained in:
N3WT DE COMPET
2025-02-07 17:40:30 +01:00
parent 42b4c99be8
commit 7f35527649
6 changed files with 124 additions and 84 deletions

View File

@ -77,8 +77,7 @@ class ProfileView(APIView):
return JsonResponse(profil_serializer.data, safe=False) return JsonResponse(profil_serializer.data, safe=False)
return JsonResponse(profil_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
return JsonResponse(profil_serializer.errors, safe=False)
def put(self, request, _id): def put(self, request, _id):
data=JSONParser().parse(request) data=JSONParser().parse(request)
@ -88,7 +87,7 @@ class ProfileView(APIView):
profil_serializer.save() profil_serializer.save()
return JsonResponse("Updated Successfully", safe=False) return JsonResponse("Updated Successfully", safe=False)
return JsonResponse(profil_serializer.errors, safe=False) return JsonResponse(profil_serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, _id): def delete(self, request, _id):
return bdd.delete_object(Profile, _id) return bdd.delete_object(Profile, _id)

View File

@ -6,7 +6,17 @@ import FeesManagement from '@/components/Structure/Tarification/FeesManagement';
import DjangoCSRFToken from '@/components/DjangoCSRFToken'; import DjangoCSRFToken from '@/components/DjangoCSRFToken';
import useCsrfToken from '@/hooks/useCsrfToken'; import useCsrfToken from '@/hooks/useCsrfToken';
import { ClassesProvider } from '@/context/ClassesContext'; import { ClassesProvider } from '@/context/ClassesContext';
import { fetchSpecialities, fetchTeachers, fetchClasses, fetchSchedules, fetchRegistrationDiscounts, fetchTuitionDiscounts, fetchRegistrationFees, fetchTuitionFees } from '@/app/lib/schoolAction'; import { createDatas,
updateDatas,
removeDatas,
fetchSpecialities,
fetchTeachers,
fetchClasses,
fetchSchedules,
fetchRegistrationDiscounts,
fetchTuitionDiscounts,
fetchRegistrationFees,
fetchTuitionFees } from '@/app/lib/schoolAction';
import SidebarTabs from '@/components/SidebarTabs'; import SidebarTabs from '@/components/SidebarTabs';
export default function Page() { export default function Page() {
@ -111,23 +121,7 @@ export default function Page() {
}; };
const handleCreate = (url, newData, setDatas) => { const handleCreate = (url, newData, setDatas) => {
return fetch(url, { return createDatas(url, newData, csrfToken)
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
body: JSON.stringify(newData),
credentials: 'include'
})
.then(response => {
if (!response.ok) {
return response.json().then(errorData => {
throw errorData;
});
}
return response.json();
})
.then(data => { .then(data => {
setDatas(prevState => [...prevState, data]); setDatas(prevState => [...prevState, data]);
return data; return data;
@ -139,23 +133,7 @@ export default function Page() {
}; };
const handleEdit = (url, id, updatedData, setDatas) => { const handleEdit = (url, id, updatedData, setDatas) => {
return fetch(`${url}/${id}`, { return updateDatas(url, id, updatedData, csrfToken)
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
body: JSON.stringify(updatedData),
credentials: 'include'
})
.then(response => {
if (!response.ok) {
return response.json().then(errorData => {
throw errorData;
});
}
return response.json();
})
.then(data => { .then(data => {
setDatas(prevState => prevState.map(item => item.id === id ? data : item)); setDatas(prevState => prevState.map(item => item.id === id ? data : item));
return data; return data;
@ -167,22 +145,7 @@ export default function Page() {
}; };
const handleDelete = (url, id, setDatas) => { const handleDelete = (url, id, setDatas) => {
return fetch(`${url}/${id}`, { return removeDatas(url, id, csrfToken)
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
credentials: 'include'
})
.then(response => {
if (!response.ok) {
return response.json().then(errorData => {
throw errorData;
});
}
return response.json();
})
.then(data => { .then(data => {
setDatas(prevState => prevState.filter(item => item.id !== id)); setDatas(prevState => prevState.filter(item => item.id !== id));
return data; return data;

View File

@ -58,4 +58,42 @@ export const fetchRegistrationFees = () => {
export const fetchTuitionFees = () => { export const fetchTuitionFees = () => {
return fetch(`${BE_SCHOOL_FEES_URL}/tuition`) return fetch(`${BE_SCHOOL_FEES_URL}/tuition`)
.then(requestResponseHandler) .then(requestResponseHandler)
};
export const createDatas = (url, newData, csrfToken) => {
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
body: JSON.stringify(newData),
credentials: 'include'
})
.then(requestResponseHandler)
};
export const updateDatas = (url, id, updatedData, csrfToken) => {
return fetch(`${url}/${id}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
body: JSON.stringify(updatedData),
credentials: 'include'
})
.then(requestResponseHandler)
};
export const removeDatas = (url, id, csrfToken) => {
return fetch(`${url}/${id}`, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
credentials: 'include'
})
.then(requestResponseHandler)
}; };

View File

@ -139,6 +139,11 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
return choices; return choices;
}; };
// Récupération des messages d'erreur
const getError = (field) => {
return localErrors?.[field]?.[0];
};
const handleAddClass = () => { const handleAddClass = () => {
setNewClass({ id: Date.now(), atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] }); setNewClass({ id: Date.now(), atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] });
setFormData({ atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] }); setFormData({ atmosphere_name: '', age_range: '', levels: [], number_of_students: '', school_year: '', teachers: [] });
@ -169,7 +174,11 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
setLocalErrors({}); setLocalErrors({});
}) })
.catch((error) => { .catch((error) => {
console.error(error); console.error('Error:', error.message);
if (error.details) {
console.error('Form errors:', error.details);
setLocalErrors(error.details);
}
}); });
} else { } else {
setPopupMessage("Tous les champs doivent être remplis et valides"); setPopupMessage("Tous les champs doivent être remplis et valides");
@ -187,7 +196,11 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
setLocalErrors({}); setLocalErrors({});
}) })
.catch((error) => { .catch((error) => {
console.error(error); console.error('Error:', error.message);
if (error.details) {
console.error('Form errors:', error.details);
setLocalErrors(error.details);
}
}); });
} else { } else {
setPopupMessage("Tous les champs doivent être remplis et valides"); setPopupMessage("Tous les champs doivent être remplis et valides");
@ -247,7 +260,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
value={currentData.atmosphere_name} value={currentData.atmosphere_name}
onChange={handleChange} onChange={handleChange}
placeholder="Nom d'ambiance" placeholder="Nom d'ambiance"
errorMsg={localErrors && localErrors.atmosphere_name && Array.isArray(localErrors.atmosphere_name) ? localErrors.atmosphere_name[0] : ''} errorMsg={getError('atmosphere_name')}
/> />
); );
case 'TRANCHE D\'AGE': case 'TRANCHE D\'AGE':
@ -257,7 +270,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
value={currentData.age_range} value={currentData.age_range}
onChange={handleChange} onChange={handleChange}
placeholder="Tranche d'âge (ex: 3-6)" placeholder="Tranche d'âge (ex: 3-6)"
errorMsg={localErrors && localErrors.age_range && Array.isArray(localErrors.age_range) ? localErrors.age_range[0] : ''} errorMsg={getError('age_range')}
/> />
) )
case 'NIVEAUX': case 'NIVEAUX':
@ -267,7 +280,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
options={allNiveaux} options={allNiveaux}
selectedOptions={currentData.levels ? currentData.levels.map(levelId => allNiveaux.find(level => level.id === levelId)) : []} selectedOptions={currentData.levels ? currentData.levels.map(levelId => allNiveaux.find(level => level.id === levelId)) : []}
onChange={handleMultiSelectChange} onChange={handleMultiSelectChange}
errorMsg={localErrors && localErrors.levels && Array.isArray(localErrors.levels) ? localErrors.levels[0] : ''} errorMsg={getError('levels')}
/> />
); );
case 'CAPACITE': case 'CAPACITE':
@ -278,7 +291,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
value={currentData.number_of_students} value={currentData.number_of_students}
onChange={handleChange} onChange={handleChange}
placeholder="Capacité" placeholder="Capacité"
errorMsg={localErrors && localErrors.number_of_students && Array.isArray(localErrors.number_of_students) ? localErrors.number_of_students[0] : ''} errorMsg={getError('number_of_students')}
/> />
) )
case 'ANNÉE SCOLAIRE' : case 'ANNÉE SCOLAIRE' :
@ -290,7 +303,7 @@ const ClassesSection = ({ classes, setClasses, teachers, handleCreate, handleEdi
choices={getSchoolYearChoices()} choices={getSchoolYearChoices()}
callback={handleChange} callback={handleChange}
selected={currentData.school_year || ''} selected={currentData.school_year || ''}
errorMsg={localErrors && localErrors.school_year && Array.isArray(localErrors.school_year) ? localErrors.school_year[0] : ''} errorMsg={getError('school_year')}
IconItem={null} IconItem={null}
disabled={false} disabled={false}
/> />

View File

@ -16,6 +16,11 @@ const SpecialitiesSection = ({ specialities, setSpecialities, handleCreate, hand
const [popupVisible, setPopupVisible] = useState(false); const [popupVisible, setPopupVisible] = useState(false);
const [popupMessage, setPopupMessage] = useState(""); const [popupMessage, setPopupMessage] = useState("");
// Récupération des messages d'erreur
const getError = (field) => {
return localErrors?.[field]?.[0];
};
const handleAddSpeciality = () => { const handleAddSpeciality = () => {
setNewSpeciality({ id: Date.now(), name: '', color_code: '' }); setNewSpeciality({ id: Date.now(), name: '', color_code: '' });
}; };
@ -39,11 +44,11 @@ const SpecialitiesSection = ({ specialities, setSpecialities, handleCreate, hand
setNewSpeciality(null); setNewSpeciality(null);
setLocalErrors({}); setLocalErrors({});
}) })
.catch(error => { .catch((error) => {
if (error && typeof error === 'object') { console.error('Error:', error.message);
setLocalErrors(error); if (error.details) {
} else { console.error('Form errors:', error.details);
console.error(error); setLocalErrors(error.details);
} }
}); });
} else { } else {
@ -61,11 +66,11 @@ const SpecialitiesSection = ({ specialities, setSpecialities, handleCreate, hand
setEditingSpeciality(null); setEditingSpeciality(null);
setLocalErrors({}); setLocalErrors({});
}) })
.catch(error => { .catch((error) => {
if (error && typeof error === 'object') { console.error('Error:', error.message);
setLocalErrors(error); if (error.details) {
} else { console.error('Form errors:', error.details);
console.error(error); setLocalErrors(error.details);
} }
}); });
} else { } else {
@ -111,7 +116,7 @@ const SpecialitiesSection = ({ specialities, setSpecialities, handleCreate, hand
onTextChange={handleChange} onTextChange={handleChange}
onColorChange={handleChange} onColorChange={handleChange}
placeholder="Nom de la spécialité" placeholder="Nom de la spécialité"
errorMsg={localErrors && localErrors.name && Array.isArray(localErrors.name) ? localErrors.name[0] : ''} errorMsg={getError('name')}
/> />
); );
case 'ACTIONS': case 'ACTIONS':

View File

@ -98,6 +98,11 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
const [popupVisible, setPopupVisible] = useState(false); const [popupVisible, setPopupVisible] = useState(false);
const [popupMessage, setPopupMessage] = useState(""); const [popupMessage, setPopupMessage] = useState("");
// Récupération des messages d'erreur
const getError = (field) => {
return localErrors?.[field]?.[0];
};
const handleAddTeacher = () => { const handleAddTeacher = () => {
setNewTeacher({ id: Date.now(), last_name: '', first_name: '', email: '', specialities: [], droit: 0 }); setNewTeacher({ id: Date.now(), last_name: '', first_name: '', email: '', specialities: [], droit: 0 });
setFormData({ last_name: '', first_name: '', email: '', specialities: [], droit: 0 }); setFormData({ last_name: '', first_name: '', email: '', specialities: [], droit: 0 });
@ -133,14 +138,22 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
setTeachers([createdTeacher, ...teachers]); setTeachers([createdTeacher, ...teachers]);
setNewTeacher(null); setNewTeacher(null);
setLocalErrors({}); setLocalErrors({});
})
.catch((error) => {
console.error('Error:', error.message);
if (error.details) {
console.error('Form errors:', error.details);
setLocalErrors(error.details);
}
}); });
} }
setLocalErrors({});
}) })
.catch(error => { .catch((error) => {
if (error && typeof error === 'object') { console.error('Error:', error.message);
setLocalErrors(error); if (error.details) {
} else { console.error('Form errors:', error.details);
console.error(error); setLocalErrors(error.details);
} }
}); });
} else { } else {
@ -165,9 +178,20 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
setEditingTeacher(null); setEditingTeacher(null);
setFormData({}); setFormData({});
}) })
.catch((error) => {
console.error('Error:', error.message);
if (error.details) {
console.error('Form errors:', error.details);
setLocalErrors(error.details);
}
});
}) })
.catch(error => { .catch((error) => {
console.error(error); console.error('Error:', error.message);
if (error.details) {
console.error('Form errors:', error.details);
setLocalErrors(error.details);
}
}); });
} }
else { else {
@ -184,8 +208,6 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
parsedValue = checked ? 1 : 0; parsedValue = checked ? 1 : 0;
} }
console.log(`handleChange - name: ${name}, parsedValue: ${parsedValue}, type: ${type}, checked: ${checked}`);
if (editingTeacher) { if (editingTeacher) {
setFormData((prevData) => ({ setFormData((prevData) => ({
...prevData, ...prevData,
@ -237,7 +259,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
value={currentData.last_name} value={currentData.last_name}
onChange={handleChange} onChange={handleChange}
placeholder="Nom de l'enseignant" placeholder="Nom de l'enseignant"
errorMsg={localErrors && localErrors.last_name && Array.isArray(localErrors.last_name) ? localErrors.last_name[0] : ''} errorMsg={getError('last_name')}
/> />
<InputText <InputText
name="first_name" name="first_name"
@ -245,7 +267,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
value={currentData.first_name} value={currentData.first_name}
onChange={handleChange} onChange={handleChange}
placeholder="Prénom de l'enseignant" placeholder="Prénom de l'enseignant"
errorMsg={localErrors && localErrors.first_name && Array.isArray(localErrors.firstname) ? localErrors.firstname[0] : ''} errorMsg={getError('first_name')}
/> />
</div> </div>
); );
@ -256,7 +278,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, ha
value={currentData.email} value={currentData.email}
onChange={handleChange} onChange={handleChange}
placeholder="Email de l'enseignant" placeholder="Email de l'enseignant"
errorMsg={localErrors && localErrors.email && Array.isArray(localErrors.email) ? localErrors.email[0] : ''} errorMsg={getError('email')}
/> />
); );
case 'SPECIALITES': case 'SPECIALITES':