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