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