From 814e723715112443479a8666ed3edf630dff7bea Mon Sep 17 00:00:00 2001 From: Todd Dembrey <todd.dembrey@torchbox.com> Date: Thu, 16 Aug 2018 14:28:28 +0100 Subject: [PATCH] Reformat to use the view dispatcher --- opentech/apply/funds/views.py | 57 ++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py index 1fe5f6a55..6511df5d3 100644 --- a/opentech/apply/funds/views.py +++ b/opentech/apply/funds/views.py @@ -247,8 +247,7 @@ class SubmissionDetailView(ViewDispatcher): return super().admin_check(request) -@method_decorator(login_required, name='dispatch') -class SubmissionEditView(UpdateView): +class BaseSubmissionEditView(UpdateView): """ Converts the data held on the submission into an editable format and knows how to save that back to the object. Shortcuts the normal update view save approach @@ -256,20 +255,10 @@ class SubmissionEditView(UpdateView): model = ApplicationSubmission def dispatch(self, request, *args, **kwargs): - if request.user != self.get_object().user and not request.user.is_apply_staff: - raise PermissionDenied if not self.get_object().phase.permissions.can_edit(request.user): raise PermissionDenied return super().dispatch(request, *args, **kwargs) - @property - def transitions(self): - transitions = self.object.get_available_user_status_transitions(self.request.user) - return { - transition.name: transition - for transition in transitions - } - def buttons(self): yield ('save', 'white', 'Save') yield ('submit', 'primary', 'Submit') @@ -286,6 +275,9 @@ class SubmissionEditView(UpdateView): def get_form_class(self): return self.object.get_form_class() + +@method_decorator(staff_required, name='dispatch') +class AdminSubmissionEditView(BaseSubmissionEditView): def form_valid(self, form): self.object.new_data(form.cleaned_data) @@ -293,7 +285,7 @@ class SubmissionEditView(UpdateView): self.object.create_revision(draft=True, by=self.request.user) return self.form_invalid(form) - if 'submit' in self.request.POST and self.request.user.is_staff: + if 'submit' in self.request.POST: created = self.object.create_revision(by=self.request.user) if created: messenger( @@ -302,15 +294,45 @@ class SubmissionEditView(UpdateView): user=self.request.user, submission=self.object, ) - else: - action = set(self.request.POST.keys()) & set(self.transitions.keys()) - transition = self.transitions[action.pop()] - self.object.perform_transition(transition.target, self.request.user, request=self.request) + return HttpResponseRedirect(self.get_success_url()) + + +@method_decorator(login_required, name='dispatch') +class ApplicantSubmissionEditView(BaseSubmissionEditView): + def dispatch(self, request, *args, **kwargs): + if request.user != self.get_object().user: + raise PermissionDenied + return super().dispatch(request, *args, **kwargs) + + @property + def transitions(self): + transitions = self.object.get_available_user_status_transitions(self.request.user) + return { + transition.name: transition + for transition in transitions + } + + def form_valid(self, form): + self.object.new_data(form.cleaned_data) + + if 'save' in self.request.POST: + self.object.create_revision(draft=True, by=self.request.user) + return self.form_invalid(form) + + action = set(self.request.POST.keys()) & set(self.transitions.keys()) + + transition = self.transitions[action.pop()] + self.object.perform_transition(transition.target, self.request.user, request=self.request) return HttpResponseRedirect(self.get_success_url()) +class SubmissionEditView(ViewDispatcher): + admin_view = AdminSubmissionEditView + applicant_view = ApplicantSubmissionEditView + + @method_decorator(staff_required, name='dispatch') class RevisionListView(ListView): model = ApplicationRevision @@ -332,6 +354,7 @@ class RevisionListView(ListView): ) +@method_decorator(staff_required, name='dispatch') class RevisionCompareView(DetailView): model = ApplicationSubmission template_name = 'funds/revisions_compare.html' -- GitLab