From 4eec38e4df1099b69dc10dbb071debb403a28f5c Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Tue, 19 Feb 2019 10:08:30 +0000
Subject: [PATCH] GH-858: Handle progression of submission

---
 opentech/apply/funds/forms.py                  |  9 +++++++--
 opentech/apply/funds/views.py                  | 18 +++++++++++++++---
 opentech/apply/funds/workflow.py               |  7 ++++---
 .../src/javascript/apply/batch-actions.js      |  2 +-
 4 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/opentech/apply/funds/forms.py b/opentech/apply/funds/forms.py
index 43ae56bd8..cca0eaadd 100644
--- a/opentech/apply/funds/forms.py
+++ b/opentech/apply/funds/forms.py
@@ -27,7 +27,7 @@ class ProgressSubmissionForm(forms.ModelForm):
 
 class BatchProgressSubmissionForm(forms.Form):
     action = forms.ChoiceField(label='Take action')
-    submissions = forms.CharField(widget=forms.HiddenInput())
+    submissions = forms.CharField(widget=forms.HiddenInput(attrs={'class': 'js-submissions-id'}))
 
     def __init__(self, *args, **kwargs):
         self.user = kwargs.pop('user')
@@ -40,6 +40,11 @@ class BatchProgressSubmissionForm(forms.Form):
         submission_ids = [int(submission) for submission in value.split(',')]
         return ApplicationSubmission.objects.filter(id__in=submission_ids)
 
+    def clean_action(self):
+        value = self.cleaned_data['action']
+        action = ACTION_MAPPING[value]['transitions']
+        return action
+
 
 class ScreeningSubmissionForm(forms.ModelForm):
 
@@ -214,7 +219,7 @@ class BatchUpdateReviewersForm(forms.Form):
         queryset=User.objects.staff(),
         widget=Select2MultiCheckboxesWidget(attrs={'data-placeholder': 'Staff'}),
     )
-    submissions = forms.CharField(widget=forms.HiddenInput())
+    submissions = forms.CharField(widget=forms.HiddenInput(attrs={'class': 'js-submissions-id'}))
 
     def __init__(self, *args, **kwargs):
         kwargs.pop('user')
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index 099cc696f..6f406b059 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -133,11 +133,23 @@ class BatchProgressSubmissionView(DelegatedViewMixin, FormView):
 
     def form_valid(self, form):
         submissions = form.cleaned_data['submissions']
-        action = form.cleaned_data.get('action')
+        transitions = form.cleaned_data.get('action')
 
+        failed = []
         for submission in submissions:
-            self.submission.perform_transition(action, self.request.user, request=self.request)
-
+            valid_actions = {action for action, _ in submission.get_actions_for_user(self.request.user)}
+            transition = (valid_actions & set(transitions)).pop()
+            try:
+                submission.perform_transition(transition, self.request.user, request=self.request)
+            except PermissionDenied:
+                failed.append(submission)
+
+        if failed:
+            messages.warning(
+                self.request,
+                _('You do no have permission to do that to: ') +
+                ', '.join(str(submission) for submission in failed)
+            )
         return super().form_valid(form)
 
 
diff --git a/opentech/apply/funds/workflow.py b/opentech/apply/funds/workflow.py
index e66eb557a..23deb6fd3 100644
--- a/opentech/apply/funds/workflow.py
+++ b/opentech/apply/funds/workflow.py
@@ -738,9 +738,10 @@ def get_actions_mapping():
     transitions = defaultdict(lambda: {'display': '', 'phases': []})
     for phase_name, phase in PHASES:
         for transition_name, transition in phase.transitions.items():
-            transition_name = transition['display']
-            transition_key = slugify(transition_name)
-            transitions[transition_key]['display'] = transition_name
+            transition_display = transition['display']
+            transition_key = slugify(transition_display)
+            transitions[transition_key].setdefault('transitions', []).append(transition_name)
+            transitions[transition_key]['display'] = transition_display
             transitions[transition_key]['phases'].append(phase_name)
 
     return transitions
diff --git a/opentech/static_src/src/javascript/apply/batch-actions.js b/opentech/static_src/src/javascript/apply/batch-actions.js
index 6729148a3..37d457028 100644
--- a/opentech/static_src/src/javascript/apply/batch-actions.js
+++ b/opentech/static_src/src/javascript/apply/batch-actions.js
@@ -10,7 +10,7 @@
     const $actionOptions = $('#id_action option');
     const $batchTitlesList = $('.js-batch-titles');
     const $batchTitleCount = $('.js-batch-title-count');
-    const $hiddenIDlist = $('#id_submissions');
+    const $hiddenIDlist = $('.js-submissions-id');
     const $toggleBatchList = $('.js-toggle-batch-list');
     const activeClass = 'batch-actions-enabled';
     const closedClass = 'is-closed';
-- 
GitLab