feat: Sauvegarde des compétences d'un élève [#16]

This commit is contained in:
N3WT DE COMPET
2025-05-20 17:31:50 +02:00
parent c9c7e7715e
commit 05136035ab
19 changed files with 269 additions and 137 deletions

View File

@ -13,7 +13,8 @@ from .models import (
Fee,
PaymentPlan,
PaymentMode,
EstablishmentCompetency
EstablishmentCompetency,
Competency
)
from .serializers import (
TeacherSerializer,
@ -24,12 +25,14 @@ from .serializers import (
FeeSerializer,
PaymentPlanSerializer,
PaymentModeSerializer,
EstablishmentCompetencySerializer
EstablishmentCompetencySerializer,
CompetencySerializer
)
from Common.models import Domain, Category, Competency
from Common.models import Domain, Category
from N3wtSchool.bdd import delete_object, getAllObjects, getObject
from django.db.models import Q
from collections import defaultdict
from Subscriptions.models import Student, StudentCompetency
@method_decorator(csrf_protect, name='dispatch')
@method_decorator(ensure_csrf_cookie, name='dispatch')
@ -417,6 +420,60 @@ class PaymentModeDetailView(APIView):
def delete(self, request, id):
return delete_object(PaymentMode, id)
@method_decorator(csrf_protect, name='dispatch')
@method_decorator(ensure_csrf_cookie, name='dispatch')
class CompetencyListCreateView(APIView):
def get(self, request):
cycle = request.GET.get('cycle')
if cycle is None:
return JsonResponse({'error': 'cycle est requis'}, safe=False, status=status.HTTP_400_BAD_REQUEST)
competencies_list = getAllObjects(Competency)
competencies_list = competencies_list.filter(
category__domain__cycle=cycle
).distinct()
serializer = CompetencySerializer(competencies_list, many=True)
return JsonResponse(serializer.data, safe=False)
def post(self, request):
data = JSONParser().parse(request)
serializer = CompetencySerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, safe=False, status=status.HTTP_201_CREATED)
return JsonResponse(serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
@method_decorator(csrf_protect, name='dispatch')
@method_decorator(ensure_csrf_cookie, name='dispatch')
class CompetencyDetailView(APIView):
def get(self, request, id):
try:
competency = Competency.objects.get(id=id)
serializer = CompetencySerializer(competency)
return JsonResponse(serializer.data, safe=False)
except Competency.DoesNotExist:
return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND)
def put(self, request, id):
try:
competency = Competency.objects.get(id=id)
except Competency.DoesNotExist:
return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND)
data = JSONParser().parse(request)
serializer = CompetencySerializer(competency, data=data, partial=True)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, safe=False)
return JsonResponse(serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, id):
try:
competency = Competency.objects.get(id=id)
competency.delete()
return JsonResponse({'message': 'Deleted'}, safe=False)
except Competency.DoesNotExist:
return JsonResponse({'error': 'No object found'}, status=status.HTTP_404_NOT_FOUND)
@method_decorator(csrf_protect, name='dispatch')
@method_decorator(ensure_csrf_cookie, name='dispatch')
class EstablishmentCompetencyListCreateView(APIView):
@ -541,6 +598,14 @@ class EstablishmentCompetencyListCreateView(APIView):
custom_category=category,
is_required=False
)
# Associer à tous les élèves de l'établissement
students = Student.objects.filter(associated_class__establishment_id=establishment_id)
for student in students:
StudentCompetency.objects.get_or_create(
student=student,
establishment_competency=ec
)
created.append({
"competence_id": ec.id,
"nom": ec.custom_name,
@ -558,6 +623,7 @@ class EstablishmentCompetencyListCreateView(APIView):
def delete(self, request):
"""
Supprime une ou plusieurs compétences custom (EstablishmentCompetency) à partir d'une liste d'IDs.
Supprime aussi les StudentCompetency associés.
Attendu dans le body :
{
"ids": [1, 2, 3, ...]
@ -571,6 +637,8 @@ class EstablishmentCompetencyListCreateView(APIView):
for ec_id in ids:
try:
ec = EstablishmentCompetency.objects.get(id=ec_id)
# Supprimer les StudentCompetency associés
StudentCompetency.objects.filter(establishment_competency=ec).delete()
ec.delete()
deleted.append(ec_id)
except EstablishmentCompetency.DoesNotExist: