diff --git a/projects/views.py b/projects/views.py index 716f394dd07160a58ff02993c93d53a489a21077..489d13a5f67266ca44eec2ab034ecdf4103afc53 100644 --- a/projects/views.py +++ b/projects/views.py @@ -1,12 +1,15 @@ """Projects views.""" +from django.shortcuts import redirect from django.utils.timezone import now -from rest_framework import mixins, permissions, viewsets -from rest_framework.response import Response -from rest_framework.decorators import action +from django.core.exceptions import ObjectDoesNotExist +from django_filters import rest_framework as filters from django_filters.rest_framework.backends import DjangoFilterBackend +from rest_framework import mixins, permissions, viewsets, status +from rest_framework.decorators import action +from rest_framework.response import Response -from django_filters import rest_framework as filters +from dynamicforms.serializers import FormEntrySerializer from .models import Edition, Participation, Project from .serializers import (EditionDetailSerializer, EditionListSerializer, @@ -263,6 +266,26 @@ class EditionViewSet(viewsets.ReadOnlyModelViewSet): serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) + @action(methods=['get'], detail=True) + def form(self, request, pk=None): + """Return the edition's form. + + If the edition does not have a form, + returns a `404 Not Found` error response. + + ### Example response + + See [forms: read](#forms-read). + """ + edition = self.get_object() + try: + form = edition.edition_form.form + except ObjectDoesNotExist: + return Response( + {'detail': 'No form set on this edition.'}, status=404) + else: + return redirect('api:form-detail', str(form.pk)) + class ParticipationViewSet(mixins.CreateModelMixin, viewsets.ReadOnlyModelViewSet): @@ -326,3 +349,28 @@ class ParticipationViewSet(mixins.CreateModelMixin, permission_classes = (permissions.IsAuthenticated,) filter_backends = (DjangoFilterBackend,) filter_fields = ('user', 'state',) + + @action(methods=['get'], detail=True) + def form_entry(self, request, pk=None): + """Return the answers to the edition form for a participation. + + ### Example response + + { + "id": 20, + "form": 4, + "submitted": "2018-06-30T09:43:28.779628+02:00", + "answers": [ + { + "id": 79, + "question": 40, + "entry": 20, + "answer": "Florimond" + } + ] + } + """ + participation = self.get_object() + serializer = FormEntrySerializer(participation.entry) + data = serializer.data + return Response(data, status=status.HTTP_200_OK)