From 7f239ccbf3b081e3ac1f3d6976b3f71ea91c9cd5 Mon Sep 17 00:00:00 2001 From: Parbhat Puri <parbhatpuri17@gmail.com> Date: Fri, 9 Aug 2019 13:35:28 +0000 Subject: [PATCH] GH-717: Allow staff to pick proposal form if multiple exists for proposal stage --- opentech/apply/determinations/forms.py | 20 +++++++++++++++++++- opentech/apply/determinations/views.py | 4 +++- opentech/apply/funds/models/submissions.py | 10 ++++++---- opentech/apply/funds/models/utils.py | 8 ++++---- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/opentech/apply/determinations/forms.py b/opentech/apply/determinations/forms.py index b6d2559b5..f706486ee 100644 --- a/opentech/apply/determinations/forms.py +++ b/opentech/apply/determinations/forms.py @@ -344,7 +344,25 @@ class BaseProposalDeterminationForm(forms.Form): class ConceptDeterminationForm(BaseConceptDeterminationForm, BaseNormalDeterminationForm): - pass + def __init__(self, *args, submission, user, initial={}, instance=None, **kwargs): + super().__init__(*args, submission=submission, user=user, initial={}, instance=None, **kwargs) + + action = kwargs.get('action') + stages_num = len(submission.workflow.stages) + + if stages_num > 1 and action == 'invited_to_proposal': + second_stage_forms = submission.get_from_parent('forms').filter(stage=2) + if second_stage_forms.count() > 1: + proposal_form_choices = [ + (index, form.form.name) + for index, form in enumerate(second_stage_forms) + ] + self.fields['proposal_form'] = forms.ChoiceField( + label='Proposal Form', + choices=proposal_form_choices, + help_text='Select the proposal form to use for proposal stage.', + ) + self.fields['proposal_form'].group = 1 class ProposalDeterminationForm(BaseProposalDeterminationForm, BaseNormalDeterminationForm): diff --git a/opentech/apply/determinations/views.py b/opentech/apply/determinations/views.py index 5e341b491..b6a0549e1 100644 --- a/opentech/apply/determinations/views.py +++ b/opentech/apply/determinations/views.py @@ -248,6 +248,7 @@ class DeterminationCreateOrUpdateView(CreateOrUpdateView): submission=self.object.submission, related=self.object, ) + proposal_form = form.cleaned_data.get('proposal_form') transition = transition_from_outcome(form.cleaned_data.get('outcome'), self.submission) if self.object.outcome == NEEDS_MORE_INFO: @@ -260,7 +261,8 @@ class DeterminationCreateOrUpdateView(CreateOrUpdateView): related_object=self.object, ) - self.submission.perform_transition(transition, self.request.user, request=self.request, notify=False) + self.submission.perform_transition( + transition, self.request.user, request=self.request, notify=False, proposal_form=proposal_form) return HttpResponseRedirect(self.submission.get_absolute_url()) diff --git a/opentech/apply/funds/models/submissions.py b/opentech/apply/funds/models/submissions.py index 3591d72b2..7087194a0 100644 --- a/opentech/apply/funds/models/submissions.py +++ b/opentech/apply/funds/models/submissions.py @@ -310,15 +310,15 @@ class AddTransitions(models.base.ModelBase): transition(by=user, request=request, **kwargs) self.save(update_fields=['status']) - self.progress_stage_when_possible(user, request) + self.progress_stage_when_possible(user, request, **kwargs) attrs['perform_transition'] = perform_transition - def progress_stage_when_possible(self, user, request): + def progress_stage_when_possible(self, user, request, notify=None, **kwargs): # Check to see if we can progress to a new stage from the current status for stage_transition in STAGE_CHANGE_ACTIONS: try: - self.perform_transition(stage_transition, user, request=request, notify=False) + self.perform_transition(stage_transition, user, request=request, notify=False, **kwargs) except PermissionDenied: pass @@ -513,7 +513,9 @@ class ApplicationSubmission( prev_meta_categories = submission_in_db.meta_categories.all() self.id = None - self.form_fields = self.get_from_parent('get_defined_fields')(target) + proposal_form = kwargs.get('proposal_form') + proposal_form = int(proposal_form) if proposal_form else 0 + self.form_fields = self.get_from_parent('get_defined_fields')(target, proposal_form) self.live_revision = None self.draft_revision = None diff --git a/opentech/apply/funds/models/utils.py b/opentech/apply/funds/models/utils.py index f6661614f..2d32775f0 100644 --- a/opentech/apply/funds/models/utils.py +++ b/opentech/apply/funds/models/utils.py @@ -83,12 +83,12 @@ class WorkflowStreamForm(WorkflowHelpers, AbstractStreamForm): # type: ignore class Meta: abstract = True - def get_defined_fields(self, stage=None): + def get_defined_fields(self, stage=None, proposal_form=0): if not stage: - form_index = 0 + stage_num = 1 else: - form_index = self.workflow.stages.index(stage) - return self.forms.all()[form_index].fields + stage_num = self.workflow.stages.index(stage) + 1 + return self.forms.filter(stage=stage_num)[proposal_form].fields def render_landing_page(self, request, form_submission=None, *args, **kwargs): # We only reach this page after creation of a new submission -- GitLab