From 9af71a98eebc01f65055dd1f9a86ca14774b986b Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Wed, 7 Mar 2018 12:12:17 +0000
Subject: [PATCH] Allow applicants to post comments

---
 opentech/apply/activity/views.py | 23 ++---------------
 opentech/apply/funds/views.py    | 28 ++++++---------------
 opentech/apply/utils/views.py    | 43 +++++++++++++++++++++++++++++++-
 3 files changed, 51 insertions(+), 43 deletions(-)

diff --git a/opentech/apply/activity/views.py b/opentech/apply/activity/views.py
index 3d5c2e483..87b74748d 100644
--- a/opentech/apply/activity/views.py
+++ b/opentech/apply/activity/views.py
@@ -1,7 +1,6 @@
-from django.utils.decorators import method_decorator
-from django.views.generic import CreateView, View
+from django.views.generic import CreateView
 
-from opentech.apply.users.decorators import staff_required
+from opentech.apply.utils.views import DelegatedViewMixin
 
 from .forms import CommentForm
 from .models import Activity, COMMENT
@@ -30,24 +29,6 @@ class ActivityContextMixin:
         return super().get_context_data(**extra, **kwargs)
 
 
-@method_decorator(staff_required, name='dispatch')
-class DelegatedViewMixin(View):
-    """For use on create views accepting forms from another view"""
-    def get_template_names(self):
-        return self.kwargs['template_names']
-
-    def get_context_data(self, **kwargs):
-        # Use the previous context but override the validated form
-        form = kwargs.pop('form')
-        kwargs.update(self.kwargs['context'])
-        kwargs.update(**{self.context_name: form})
-        return super().get_context_data(**kwargs)
-
-    @classmethod
-    def contribute_form(cls, submission):
-        return cls.context_name, cls.form_class(instance=submission)
-
-
 class CommentFormView(DelegatedViewMixin, CreateView):
     form_class = CommentForm
     context_name = 'comment_form'
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index f9fe553cd..2e2ff41f8 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -2,7 +2,7 @@ from django import forms
 from django.core.exceptions import PermissionDenied
 from django.template.response import TemplateResponse
 from django.utils.decorators import method_decorator
-from django.views.generic import DetailView, UpdateView
+from django.views.generic import UpdateView
 
 from django_filters.views import FilterView
 from django_tables2.views import SingleTableMixin
@@ -15,7 +15,7 @@ from opentech.apply.activity.views import (
 )
 from opentech.apply.activity.models import Activity
 from opentech.apply.users.decorators import staff_required
-from opentech.apply.utils.views import ViewDispatcher
+from opentech.apply.utils.views import DelegateableView, ViewDispatcher
 
 from .forms import ProgressSubmissionForm, UpdateSubmissionLeadForm
 from .models import ApplicationSubmission
@@ -92,8 +92,7 @@ class UpdateLeadView(DelegatedViewMixin, UpdateView):
         return response
 
 
-@method_decorator(staff_required, name='dispatch')
-class AdminSubmissionDetailView(ActivityContextMixin, DetailView):
+class AdminSubmissionDetailView(ActivityContextMixin, DelegateableView):
     model = ApplicationSubmission
     form_views = {
         'progress': ProgressSubmissionView,
@@ -102,30 +101,17 @@ class AdminSubmissionDetailView(ActivityContextMixin, DetailView):
     }
 
     def get_context_data(self, **kwargs):
-        forms = dict(form_view.contribute_form(self.object) for form_view in self.form_views.values())
         return super().get_context_data(
             other_submissions=self.model.objects.filter(user=self.object.user).exclude(id=self.object.id),
-            **forms,
             **kwargs,
         )
 
-    def post(self, request, *args, **kwargs):
-        self.object = self.get_object()
-
-        kwargs['submission'] = self.object
-
-        # Information to pretend we originate from this view
-        kwargs['template_names'] = self.get_template_names()
-        kwargs['context'] = self.get_context_data()
-
-        form_submitted = request.POST['form-submitted'].lower()
-        view = self.form_views[form_submitted].as_view()
-
-        return view(request, *args, **kwargs)
 
-
-class ApplicantSubmissionDetailView(DetailView):
+class ApplicantSubmissionDetailView(ActivityContextMixin, DelegateableView):
     model = ApplicationSubmission
+    form_views = {
+        'comment': CommentFormView,
+    }
 
     def dispatch(self, request, *args, **kwargs):
         if self.get_object().user != request.user:
diff --git a/opentech/apply/utils/views.py b/opentech/apply/utils/views.py
index 9308d2a29..fa435b4e3 100644
--- a/opentech/apply/utils/views.py
+++ b/opentech/apply/utils/views.py
@@ -1,6 +1,6 @@
 from django.contrib.auth.decorators import login_required
 from django.utils.decorators import method_decorator
-from django.views.generic import View
+from django.views.generic import DetailView, View
 
 from opentech.apply.users.groups import STAFF_GROUP_NAME
 
@@ -17,3 +17,44 @@ class ViewDispatcher(View):
             view = self.applicant_view
 
         return view.as_view()(request, *args, **kwargs)
+
+
+class DelegateableView(DetailView):
+    """A view which passes its context to child form views to allow them to post to the same URL """
+    def get_context_data(self, **kwargs):
+        forms = dict(form_view.contribute_form(self.object) for form_view in self.form_views.values())
+        return super().get_context_data(
+            **forms,
+            **kwargs,
+        )
+
+    def post(self, request, *args, **kwargs):
+        self.object = self.get_object()
+
+        kwargs['submission'] = self.object
+
+        # Information to pretend we originate from this view
+        kwargs['template_names'] = self.get_template_names()
+        kwargs['context'] = self.get_context_data()
+
+        form_submitted = request.POST['form-submitted'].lower()
+        view = self.form_views[form_submitted].as_view()
+
+        return view(request, *args, **kwargs)
+
+
+class DelegatedViewMixin(View):
+    """For use on create views accepting forms from another view"""
+    def get_template_names(self):
+        return self.kwargs['template_names']
+
+    def get_context_data(self, **kwargs):
+        # Use the previous context but override the validated form
+        form = kwargs.pop('form')
+        kwargs.update(self.kwargs['context'])
+        kwargs.update(**{self.context_name: form})
+        return super().get_context_data(**kwargs)
+
+    @classmethod
+    def contribute_form(cls, submission):
+        return cls.context_name, cls.form_class(instance=submission)
-- 
GitLab