from django.http.response import JsonResponse from rest_framework.views import APIView from rest_framework import status from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi from django.views.decorators.csrf import ensure_csrf_cookie, csrf_protect from django.utils.decorators import method_decorator from Subscriptions.models import StudentCompetency, Student from Common.models import Domain, Competency from N3wtSchool.bdd import delete_object @method_decorator(csrf_protect, name='dispatch') @method_decorator(ensure_csrf_cookie, name='dispatch') class StudentCompetencyListCreateView(APIView): def get(self, request): student_id = request.GET.get('student_id') if not student_id: return JsonResponse({'error': 'student_id requis'}, status=400) try: student = Student.objects.get(id=student_id) except Student.DoesNotExist: return JsonResponse({'error': 'Élève introuvable'}, status=404) student_competencies = StudentCompetency.objects.filter(student=student).select_related('competency', 'competency__category', 'competency__category__domain') # On ne garde que les IDs des compétences de l'élève student_competency_ids = set(sc.competency_id for sc in student_competencies) result = [] total_competencies = 0 domaines = Domain.objects.all() for domaine in domaines: domaine_dict = { "domaine_id": domaine.id, "domaine_nom": domaine.name, "categories": [] } categories = domaine.categories.all() for categorie in categories: categorie_dict = { "categorie_id": categorie.id, "categorie_nom": categorie.name, "competences": [] } # On ne boucle que sur les compétences du student pour cette catégorie for sc in student_competencies: comp = sc.competency if comp.category_id == categorie.id: categorie_dict["competences"].append({ "competence_id": comp.id, "nom": comp.name, "score": sc.score, "comment": sc.comment or "", }) total_competencies += 1 if categorie_dict["competences"]: domaine_dict["categories"].append(categorie_dict) if domaine_dict["categories"]: result.append(domaine_dict) return JsonResponse({ "count": total_competencies, "data": result }, safe=False, status=200) # def post(self, request): # serializer = AbsenceManagementSerializer(data=request.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 StudentCompetencySimpleView(APIView): def get(self, request, id): return JsonResponse("ok", safe=False, status=status.HTTP_200_OK) # def put(self, request, id): # try: # absence = AbsenceManagement.objects.get(id=id) # serializer = AbsenceManagementSerializer(absence, data=request.data) # if serializer.is_valid(): # serializer.save() # return JsonResponse(serializer.data, safe=False, status=status.HTTP_200_OK) # return JsonResponse(serializer.errors, safe=False, status=status.HTTP_400_BAD_REQUEST) # except AbsenceManagement.DoesNotExist: # return JsonResponse({"error": "Absence not found"}, safe=False, status=status.HTTP_404_NOT_FOUND) # def delete(self, request, id): # return delete_object(AbsenceManagement, id)