mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-28 23:43:22 +00:00
fix: Suppression d'un profil uniquement s'il ne contient aucun guardian
rattaché à un élève qui n'en a pas d'autre
This commit is contained in:
@ -22,7 +22,7 @@ from .models import Profile, ProfileRole
|
||||
from rest_framework.decorators import action, api_view
|
||||
|
||||
from Auth.serializers import ProfileSerializer, ProfileRoleSerializer
|
||||
from Subscriptions.models import RegistrationForm
|
||||
from Subscriptions.models import RegistrationForm, Guardian
|
||||
import Subscriptions.mailManager as mailer
|
||||
import Subscriptions.util as util
|
||||
import logging
|
||||
@ -577,8 +577,26 @@ class ProfileRoleSimpleView(APIView):
|
||||
responses={200: 'Suppression réussie'}
|
||||
)
|
||||
def delete(self, request, id):
|
||||
try:
|
||||
# Récupérer le ProfileRole
|
||||
profile_role = ProfileRole.objects.get(id=id)
|
||||
profile = profile_role.profile
|
||||
|
||||
# Vérifier si le ProfileRole est de type PARENT
|
||||
if profile_role.role_type == ProfileRole.RoleType.PROFIL_PARENT:
|
||||
guardian = Guardian.objects.filter(profile_role=profile_role).first()
|
||||
if guardian:
|
||||
# Vérifier si ce Guardian est rattaché à des élèves
|
||||
for student in guardian.student_set.all():
|
||||
# Vérifier si l'élève n'a pas d'autres Guardians
|
||||
other_guardians = student.guardians.exclude(id=guardian.id)
|
||||
if not other_guardians.exists():
|
||||
return JsonResponse(
|
||||
{"error": f"Impossible de supprimer ce profil car l'élève {student.first_name} {student.last_name} n'aura plus de responsable légal."},
|
||||
status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
|
||||
# Supprimer le ProfileRole
|
||||
profile_role.delete()
|
||||
|
||||
# Vérifier si le profil n'a plus de rôles associés
|
||||
@ -586,3 +604,14 @@ class ProfileRoleSimpleView(APIView):
|
||||
profile.delete()
|
||||
|
||||
return JsonResponse({'message': 'Suppression réussie'}, safe=False)
|
||||
|
||||
except ProfileRole.DoesNotExist:
|
||||
return JsonResponse(
|
||||
{"error": "ProfileRole non trouvé."},
|
||||
status=status.HTTP_404_NOT_FOUND
|
||||
)
|
||||
except Exception as e:
|
||||
return JsonResponse(
|
||||
{"error": f"Une erreur est survenue : {str(e)}"},
|
||||
status=status.HTTP_500_INTERNAL_SERVER_ERROR
|
||||
)
|
||||
@ -7,6 +7,5 @@
|
||||
"phone": "Téléphone",
|
||||
"birthdate": "Date de naissance",
|
||||
"profession": "Profession",
|
||||
"address": "Adresse",
|
||||
"add_responsible": "Ajouter un responsable"
|
||||
"address": "Adresse"
|
||||
}
|
||||
|
||||
@ -885,20 +885,9 @@ export default function Page({ params: { locale } }) {
|
||||
{
|
||||
name: t('mainContactMail'),
|
||||
transform: (row) =>
|
||||
row.student.guardians && row.student.guardians.length > 0 ? (
|
||||
row.student.guardians && row.student.guardians.length > 0 && (
|
||||
row.student.guardians[0].associated_profile_email
|
||||
) : (
|
||||
<div className="flex justify-center h-full">
|
||||
<button
|
||||
className="flex items-center gap-2 text-blue-600 font-semibold hover:text-blue-800 transition duration-200 underline decoration-blue-600 hover:decoration-blue-800"
|
||||
onClick={() => handleOpenAddGuardian(row.student)}
|
||||
>
|
||||
<span className="px-3 py-1 bg-blue-100 rounded-full hover:bg-blue-200 transition duration-200">
|
||||
Ajouter un responsable
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
),
|
||||
)
|
||||
},
|
||||
{
|
||||
name: t('phone'),
|
||||
|
||||
@ -92,15 +92,29 @@ export const updateProfileRoles = (id, data, csrfToken) => {
|
||||
return fetch(request).then(requestResponseHandler);
|
||||
};
|
||||
|
||||
export const deleteProfileRoles = (id, csrfToken) => {
|
||||
const request = new Request(`${BE_AUTH_PROFILES_ROLES_URL}/${id}`, {
|
||||
export const deleteProfileRoles = async (id, csrfToken) => {
|
||||
const response = await fetch(
|
||||
`${BE_AUTH_PROFILES_ROLES_URL}/${id}`,
|
||||
{
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'X-CSRFToken': csrfToken,
|
||||
},
|
||||
credentials: 'include',
|
||||
});
|
||||
return fetch(request).then(requestResponseHandler);
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
// Extraire le message d'erreur du backend
|
||||
const errorData = await response.json();
|
||||
const errorMessage =
|
||||
errorData?.error || 'Une erreur est survenue lors de la suppression du profil.';
|
||||
|
||||
// Jeter une erreur avec le message spécifique
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
};
|
||||
|
||||
export const fetchProfiles = () => {
|
||||
|
||||
@ -91,7 +91,7 @@ const ProfileDirectory = ({
|
||||
setPopupVisible(true);
|
||||
})
|
||||
.catch((error) => {
|
||||
setPopupMessage('Erreur lors de la suppression du profil.');
|
||||
setPopupMessage(error.message);
|
||||
setPopupVisible(true);
|
||||
});
|
||||
setConfirmPopupVisible(false);
|
||||
|
||||
Reference in New Issue
Block a user