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