mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-29 07:53:23 +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 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,8 +577,26 @@ class ProfileRoleSimpleView(APIView):
|
|||||||
responses={200: 'Suppression réussie'}
|
responses={200: 'Suppression réussie'}
|
||||||
)
|
)
|
||||||
def delete(self, request, id):
|
def delete(self, request, id):
|
||||||
|
try:
|
||||||
|
# Récupérer le ProfileRole
|
||||||
profile_role = ProfileRole.objects.get(id=id)
|
profile_role = ProfileRole.objects.get(id=id)
|
||||||
profile = profile_role.profile
|
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()
|
profile_role.delete()
|
||||||
|
|
||||||
# Vérifier si le profil n'a plus de rôles associés
|
# Vérifier si le profil n'a plus de rôles associés
|
||||||
@ -586,3 +604,14 @@ class ProfileRoleSimpleView(APIView):
|
|||||||
profile.delete()
|
profile.delete()
|
||||||
|
|
||||||
return JsonResponse({'message': 'Suppression réussie'}, safe=False)
|
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",
|
"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"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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'),
|
||||||
|
|||||||
@ -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(
|
||||||
|
`${BE_AUTH_PROFILES_ROLES_URL}/${id}`,
|
||||||
|
{
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
headers: {
|
headers: {
|
||||||
'X-CSRFToken': csrfToken,
|
'X-CSRFToken': csrfToken,
|
||||||
},
|
},
|
||||||
credentials: 'include',
|
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 = () => {
|
export const fetchProfiles = () => {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user