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:
N3WT DE COMPET
2025-05-03 15:53:19 +02:00
parent ac0672f334
commit 330018edfd
5 changed files with 64 additions and 33 deletions

View File

@ -22,7 +22,7 @@ from .models import Profile, ProfileRole
from rest_framework.decorators import action, api_view from rest_framework.decorators import action, api_view
from Auth.serializers import ProfileSerializer, ProfileRoleSerializer from Auth.serializers import ProfileSerializer, ProfileRoleSerializer
from Subscriptions.models import RegistrationForm from Subscriptions.models import RegistrationForm, Guardian
import Subscriptions.mailManager as mailer import Subscriptions.mailManager as mailer
import Subscriptions.util as util import Subscriptions.util as util
import logging import logging
@ -577,12 +577,41 @@ class ProfileRoleSimpleView(APIView):
responses={200: 'Suppression réussie'} responses={200: 'Suppression réussie'}
) )
def delete(self, request, id): def delete(self, request, id):
profile_role = ProfileRole.objects.get(id=id) try:
profile = profile_role.profile # Récupérer le ProfileRole
profile_role.delete() profile_role = ProfileRole.objects.get(id=id)
profile = profile_role.profile
# Vérifier si le profil n'a plus de rôles associés # Vérifier si le ProfileRole est de type PARENT
if not ProfileRole.objects.filter(profile=profile).exists(): if profile_role.role_type == ProfileRole.RoleType.PROFIL_PARENT:
profile.delete() 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
)
return JsonResponse({'message': 'Suppression réussie'}, safe=False) # Supprimer le ProfileRole
profile_role.delete()
# Vérifier si le profil n'a plus de rôles associés
if not ProfileRole.objects.filter(profile=profile).exists():
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
)

View File

@ -7,6 +7,5 @@
"phone": "Téléphone", "phone": "Téléphone",
"birthdate": "Date de naissance", "birthdate": "Date de naissance",
"profession": "Profession", "profession": "Profession",
"address": "Adresse", "address": "Adresse"
"add_responsible": "Ajouter un responsable"
} }

View File

@ -885,20 +885,9 @@ export default function Page({ params: { locale } }) {
{ {
name: t('mainContactMail'), name: t('mainContactMail'),
transform: (row) => 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 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'), name: t('phone'),

View File

@ -92,15 +92,29 @@ export const updateProfileRoles = (id, data, csrfToken) => {
return fetch(request).then(requestResponseHandler); return fetch(request).then(requestResponseHandler);
}; };
export const deleteProfileRoles = (id, csrfToken) => { export const deleteProfileRoles = async (id, csrfToken) => {
const request = new Request(`${BE_AUTH_PROFILES_ROLES_URL}/${id}`, { const response = await fetch(
method: 'DELETE', `${BE_AUTH_PROFILES_ROLES_URL}/${id}`,
headers: { {
'X-CSRFToken': csrfToken, method: 'DELETE',
}, headers: {
credentials: 'include', 'X-CSRFToken': csrfToken,
}); },
return fetch(request).then(requestResponseHandler); credentials: 'include',
}
);
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 = () => { export const fetchProfiles = () => {

View File

@ -91,7 +91,7 @@ const ProfileDirectory = ({
setPopupVisible(true); setPopupVisible(true);
}) })
.catch((error) => { .catch((error) => {
setPopupMessage('Erreur lors de la suppression du profil.'); setPopupMessage(error.message);
setPopupVisible(true); setPopupVisible(true);
}); });
setConfirmPopupVisible(false); setConfirmPopupVisible(false);