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 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
)

View File

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

View File

@ -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'),

View File

@ -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 = () => {

View File

@ -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);