From 850f3e17354135b1d365b848a546914d76668aae Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Mon, 21 Jan 2019 01:50:08 +0000
Subject: [PATCH] Add the comment creation and listing on the submission

---
 opentech/apply/funds/api_views.py   | 35 ++++++++++++++++++++++++++++-
 opentech/apply/funds/serializers.py |  8 +++++++
 opentech/apply/funds/urls.py        |  2 ++
 3 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/opentech/apply/funds/api_views.py b/opentech/apply/funds/api_views.py
index bc7932bd5..d86e3def3 100644
--- a/opentech/apply/funds/api_views.py
+++ b/opentech/apply/funds/api_views.py
@@ -8,11 +8,14 @@ from django_filters import rest_framework as filters
 from wagtail.core.models import Page
 
 from opentech.api.pagination import StandardResultsSetPagination
-from opentech.apply.activity.models import Activity
+from opentech.apply.activity.models import Activity, COMMENT
+from opentech.apply.activity.messaging import messenger, MESSAGES
+
 from .models import ApplicationSubmission
 from .models.applications import SubmittableStreamForm
 from .serializers import (
     CommentSerializer,
+    CommentCreateSerializer,
     RoundLabSerializer,
     SubmissionActionSerializer,
     SubmissionListSerializer,
@@ -100,3 +103,33 @@ class CommentList(generics.ListAPIView):
 
     def get_queryset(self):
         return super().get_queryset().visible_to(self.request.user)
+
+
+class CommentListCreate(generics.ListCreateAPIView):
+    queryset = Activity.comments.all()
+    serializer_class = CommentCreateSerializer
+    permission_classes = (
+        permissions.IsAuthenticated, IsApplyStaffUser,
+    )
+    filter_backends = (filters.DjangoFilterBackend,)
+    filter_fields = ('visibility',)
+    pagination_class = StandardResultsSetPagination
+
+    def get_queryset(self):
+        return super().get_queryset().filter(
+            submission=self.kwargs['pk']
+        ).visible_to(self.request.user)
+
+    def perform_create(self, serializer):
+        obj = serializer.save(
+            type=COMMENT,
+            user=self.request.user,
+            submission_id=self.kwargs['pk']
+        )
+        messenger(
+            MESSAGES.COMMENT,
+            request=self.request,
+            user=self.request.user,
+            submission=obj.submission,
+            related=obj,
+        )
diff --git a/opentech/apply/funds/serializers.py b/opentech/apply/funds/serializers.py
index 777459040..cde0af1fe 100644
--- a/opentech/apply/funds/serializers.py
+++ b/opentech/apply/funds/serializers.py
@@ -90,3 +90,11 @@ class CommentSerializer(serializers.ModelSerializer):
     class Meta:
         model = Activity
         fields = ('id', 'timestamp', 'user', 'submission', 'message', 'visibility')
+
+
+class CommentCreateSerializer(serializers.ModelSerializer):
+    user = serializers.StringRelatedField()
+
+    class Meta:
+        model = Activity
+        fields = ('id', 'timestamp', 'user', 'message', 'visibility')
diff --git a/opentech/apply/funds/urls.py b/opentech/apply/funds/urls.py
index 3c1b8919f..76e663079 100644
--- a/opentech/apply/funds/urls.py
+++ b/opentech/apply/funds/urls.py
@@ -12,6 +12,7 @@ from .views import (
 )
 from .api_views import (
     CommentList,
+    CommentListCreate,
     RoundLabDetail,
     SubmissionAction,
     SubmissionList,
@@ -46,6 +47,7 @@ api_urls = ([
         path('', SubmissionList.as_view(), name='list'),
         path('<int:pk>/', SubmissionDetail.as_view(), name='detail'),
         path('<int:pk>/actions/', SubmissionAction.as_view(), name='actions'),
+        path('<int:pk>/comments/', CommentListCreate.as_view(), name='comments'),
     ], 'submissions'))),
     path('rounds/', include(([
         path('<int:pk>/', RoundLabDetail.as_view(), name='detail'),
-- 
GitLab