From 7178c5f3fb6be61ffc1c1f94daeec8b1a8ac99d3 Mon Sep 17 00:00:00 2001 From: florimondmanca <florimond.manca@gmail.com> Date: Sat, 30 Jun 2018 11:53:10 +0100 Subject: [PATCH] add edition documents endpoint --- projects/serializers.py | 15 +++++++++- projects/views.py | 66 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/projects/serializers.py b/projects/serializers.py index 637eb1d..aa78ff0 100644 --- a/projects/serializers.py +++ b/projects/serializers.py @@ -4,7 +4,8 @@ from django.db import transaction from rest_framework import serializers from core.fields import MarkdownField -from dynamicforms.serializers import FormDetailSerializer, FormEntrySerializer +from dynamicforms.serializers import (FileSerializer, FormDetailSerializer, + FormEntrySerializer) from profiles.serializers import TutorSerializer from users.fields import UserField from users.serializers import UserSerializer @@ -144,6 +145,18 @@ class EditionDetailSerializer(EditionListSerializer): edition_form = EditionFormDetailSerializer() +class EditionDocumentsSerializer(serializers.ModelSerializer): + """Serializer for information about an edition form's documents.""" + + recipient = TutorSerializer(source='edition_form.recipient') + deadline = serializers.DateField(source='edition_form.deadline') + files = FileSerializer(many=True, source='edition_form.form.files') + + class Meta: # noqa + model = Edition + fields = ('recipient', 'deadline', 'files') + + class ProjectDetailSerializer(ProjectSerializer): """Detail serializer for project objects.""" diff --git a/projects/views.py b/projects/views.py index 321ba05..6824d2a 100644 --- a/projects/views.py +++ b/projects/views.py @@ -1,11 +1,11 @@ """Projects views.""" +from django.core.exceptions import ObjectDoesNotExist from django.shortcuts import redirect from django.utils.timezone import now -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 import mixins, permissions, status, viewsets from rest_framework.decorators import action from rest_framework.response import Response @@ -14,7 +14,7 @@ from dynamicforms.serializers import FormEntrySerializer from .models import Edition, Participation, Project from .serializers import (EditionDetailSerializer, EditionListSerializer, ParticipationSerializer, ProjectDetailSerializer, - ProjectSerializer) + ProjectSerializer, EditionDocumentsSerializer) class ProjectViewSet(viewsets.ReadOnlyModelViewSet): @@ -268,7 +268,7 @@ class EditionViewSet(viewsets.ReadOnlyModelViewSet): @action(methods=['get'], detail=True) def form(self, request, pk=None): - """Return the edition's form. + """Return an edition's form. If the edition does not have a form, returns a `404 Not Found` error response. @@ -282,10 +282,64 @@ class EditionViewSet(viewsets.ReadOnlyModelViewSet): form = edition.edition_form.form except ObjectDoesNotExist: return Response( - {'detail': 'No form set on this edition.'}, status=404) + {'detail': 'No form set on this edition.'}, + status=status.HTTP_404_NOT_FOUND) else: return redirect('api:form-detail', str(form.pk)) + @action(methods=['get'], detail=True) + def documents(self, request, pk=None): + """Return list of files attached an edition's form. + + The recipient of the documents and the registration deadline + are returned as well. + + ### Example response + + { + "recipient": { + "user": { + "id": 3, + "email": "john.doe@example.com", + "profile_type": null, + "first_name": "John", + "last_name": "Doe", + "gender": null, + "phone_number": "+33 6 12 34 56 78", + "date_of_birth": null, + "url": "http://localhost:8000/api/users/3/" + }, + "address": { + "line1": "Rue de Rivoli", + "line2": "", + "post_code": "75001", + "city": "Paris", + "country": { + "code": "FR", + "name": "France" + } + }, + "promotion": 2020, + "tutoring_groups": [1], + "url": "http://localhost:8000/api/tutors/1/" + }, + "deadline": "2018-07-29", + "files": [ + { + "id": 3, + "name": "Autorisation parentale", + "file": "http://...", + "form": 4 + } + ] + } + """ + edition = self.get_object() + serializer = EditionDocumentsSerializer( + edition, context={'request': request}) + data = serializer.data + return Response(data) + class ParticipationViewSet(mixins.CreateModelMixin, viewsets.ReadOnlyModelViewSet): @@ -373,4 +427,4 @@ class ParticipationViewSet(mixins.CreateModelMixin, participation = self.get_object() serializer = FormEntrySerializer(participation.entry) data = serializer.data - return Response(data, status=status.HTTP_200_OK) + return Response(data) -- GitLab