# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from api.viewsets import ReadProtectedModelViewSet from django_filters.rest_framework import DjangoFilterBackend from rest_framework.filters import SearchFilter from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework import status from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST from django.http import JsonResponse import json from .serializers import FamilySerializer, FamilyMembershipSerializer, ChallengeSerializer, AchievementSerializer from ..models import Family, FamilyMembership, Challenge, Achievement class FamilyViewSet(ReadProtectedModelViewSet): """ REST API View set. The djangorestframework plugin will get all `Family` objects, serialize it to JSON with the given serializer, then render it on /api/family/family/ """ queryset = Family.objects.order_by('id') serializer_class = FamilySerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ['name', ] search_fields = ['$name', ] class FamilyMembershipViewSet(ReadProtectedModelViewSet): """ REST API View set. The djangorestframework plugin will get all `FamilyMembership` objects, serialize it to JSON with the given serializer, then render it on /api/family/familymembership/ """ queryset = FamilyMembership.objects.order_by('id') serializer_class = FamilyMembershipSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ['name', ] search_fields = ['$name', ] class ChallengeViewSet(ReadProtectedModelViewSet): """ REST API View set. The djangorestframework plugin will get all `Challenge` objects, serialize it to JSON with the given serializer, then render it on /api/family/challenge/ """ queryset = Challenge.objects.order_by('id') serializer_class = ChallengeSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ['name', ] search_fields = ['$name', ] class AchievementViewSet(ReadProtectedModelViewSet): """ REST API View set. The djangorestframework plugin will get all `Achievement` objects, serialize it to JSON with the given serializer, then render it on /api/family/achievement/ """ queryset = Achievement.objects.order_by('id') serializer_class = AchievementSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ['name', ] search_fields = ['$name', ] class BatchAchievementsAPIView(APIView): permission_classes = [IsAuthenticated] def post(self, request, format=None): print("POST de la view spéciale") family_ids = request.data.get('families', []) challenge_ids = request.data.get('challenges', []) families = Family.objects.filter(id__in=family_ids) challenges = Challenge.objects.filter(id__in=challenge_ids) for family in families: for challenge in challenges: a = Achievement(family=family, challenge=challenge) a.save(update_score=False) for family in families: family.update_score() Family.update_ranking() return Response({'status': 'ok'}, status=status.HTTP_201_CREATED)