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