diff --git a/opentech/apply/funds/models.py b/opentech/apply/funds/models.py index 556e0bb6693a154e4c578c761408debcc13817f4..34d9dc523a8318b365763ccc71e4c9d507ac0ce6 100644 --- a/opentech/apply/funds/models.py +++ b/opentech/apply/funds/models.py @@ -111,9 +111,12 @@ class WorkflowStreamForm(WorkflowHelpers, AbstractStreamForm): # type: ignore class Meta: abstract = True - def get_defined_fields(self): - # Only return the first form, will need updating for when working with 2 stage WF - return self.forms.all()[0].fields + def get_defined_fields(self, stage=None): + if not stage: + form_index = 0 + else: + form_index = self.workflow.stages.index(stage) + return self.forms.all()[form_index].fields content_panels = AbstractStreamForm.content_panels + [ FieldPanel('workflow_name'), @@ -601,6 +604,7 @@ class ApplicationSubmission(WorkflowHelpers, AbstractFormSubmission): self.id = None self.status = str(self.workflow.next(self.status)) + self.form_fields = self.round.get_defined_fields(self.stage) super().save(*args, **kwargs) diff --git a/opentech/apply/funds/tests/factories/models.py b/opentech/apply/funds/tests/factories/models.py index 87d4ffcf551dea830299f5e1412c56edf4e3fd73..edceb91f98f29bb27a4973026b80836e14c519af 100644 --- a/opentech/apply/funds/tests/factories/models.py +++ b/opentech/apply/funds/tests/factories/models.py @@ -104,6 +104,17 @@ class RoundFactory(wagtail_factories.PageFactory): end_date = factory.LazyFunction(lambda: datetime.date.today() + datetime.timedelta(days=7)) lead = factory.SubFactory(UserFactory, groups__name=STAFF_GROUP_NAME) + @factory.post_generation + def forms(self, create, extracted, **kwargs): + if create: + fields = build_form(kwargs, prefix='form') + for _ in range(len(self.workflow_class.stage_classes)): + # Generate a form based on all defined fields on the model + RoundFormFactory( + round=self, + **fields, + ) + class RoundFormFactory(AbstractRelatedFormFactory): class Meta: @@ -123,6 +134,17 @@ class LabFactory(wagtail_factories.PageFactory): workflow_name = factory.LazyAttribute(lambda o: list(FundType.WORKFLOWS.keys())[o.workflow_stages - 1]) lead = factory.SubFactory(UserFactory, groups__name=STAFF_GROUP_NAME) + @factory.post_generation + def forms(self, create, extracted, **kwargs): + if create: + fields = build_form(kwargs, prefix='form') + for _ in range(len(self.workflow_class.stage_classes)): + # Generate a form based on all defined fields on the model + LabFormFactory( + lab=self, + **fields, + ) + class LabFormFactory(AbstractRelatedFormFactory): class Meta: @@ -163,10 +185,14 @@ class ApplicationSubmissionFactory(factory.DjangoModelFactory): class Meta: model = ApplicationSubmission + class Params: + workflow_stages = 1 + form_fields = blocks.CustomFormFieldsFactory form_data = factory.SubFactory(FormDataFactory, form_fields=factory.SelfAttribute('..form_fields')) page = factory.SubFactory(FundTypeFactory) - round = factory.SubFactory(RoundFactory) + workflow_name = factory.LazyAttribute(lambda o: list(FundType.WORKFLOWS.keys())[o.workflow_stages - 1]) + round = factory.SubFactory(RoundFactory, workflow_name=factory.SelfAttribute('..workflow_name')) user = factory.SubFactory(UserFactory) @classmethod diff --git a/opentech/apply/funds/tests/factories/workflows.py b/opentech/apply/funds/tests/factories/workflows.py index 00992227589da479a081a8f7b16e83a1726acc35..31815c1b7d9b84c88fb3040ea3470fd8607dc324 100644 --- a/opentech/apply/funds/tests/factories/workflows.py +++ b/opentech/apply/funds/tests/factories/workflows.py @@ -90,6 +90,9 @@ class StageFactory(factory.Factory): phases = kwargs.pop('phases') name = kwargs.pop('name') new_class = type(model_class.__name__, (model_class,), {'phases': phases, 'name': name}) + + # Pretend we have a workflow object, only used for __le__ + kwargs['workflow'] = None return new_class(*args, **kwargs) diff --git a/opentech/apply/funds/tests/test_models.py b/opentech/apply/funds/tests/test_models.py index c429bb6b9199014b91b89533ff11a9e84fcb03bf..644632f2b9c5143510dd2dad330971d7c29a3f60 100644 --- a/opentech/apply/funds/tests/test_models.py +++ b/opentech/apply/funds/tests/test_models.py @@ -201,9 +201,7 @@ class TestFormSubmission(TestCase): self.site.save() self.round_page = RoundFactory(parent=fund) - RoundFormFactory(round=self.round_page, form=form) self.lab_page = LabFactory(lead=self.round_page.lead) - LabFormFactory(lab=self.lab_page, form=form) def submit_form(self, page=None, email=None, name=None, user=AnonymousUser()): if email is None: @@ -213,7 +211,7 @@ class TestFormSubmission(TestCase): page = page or self.round_page fields = page.get_form_fields() - data = {k: v for k, v in zip(fields, [email, name, 'project'])} + data = {k: v for k, v in zip(fields, ['project', email, name])} request = self.request_factory.post('', data) request.user = user @@ -378,7 +376,7 @@ class TestApplicationSubmission(TestCase): class TestApplicationProgression(TestCase): def test_new_submission_created(self): - submission = ApplicationSubmissionFactory(round__workflow_name='double') + submission = ApplicationSubmissionFactory(workflow_name='double') self.assertEqual(ApplicationSubmission.objects.count(), 1) old_id = submission.id @@ -391,3 +389,7 @@ class TestApplicationProgression(TestCase): self.assertEqual(ApplicationSubmission.objects.count(), 2) self.assertEqual(submission.previous, old_submission) self.assertEqual(old_submission.next, submission) + + form_fields = submission.round.forms.all()[1].fields + + self.assertEqual(submission.form_fields, form_fields) diff --git a/opentech/apply/funds/tests/test_workflow.py b/opentech/apply/funds/tests/test_workflow.py index 7fd8a08ed07478d85b1d314010143294d10c1605..30a0226ea28d0875e20eefc58e95e3ea3462cbe7 100644 --- a/opentech/apply/funds/tests/test_workflow.py +++ b/opentech/apply/funds/tests/test_workflow.py @@ -54,7 +54,7 @@ class TestStageCreation(SimpleTestCase): def test_can_create_stage(self): name = 'the_stage' form = Form() - stage = Stage(form, name=name) + stage = Stage(form, None, name=name) self.assertEqual(stage.name, name) self.assertEqual(stage.form, form) @@ -73,7 +73,7 @@ class TestStageCreation(SimpleTestCase): [first_phase, second_phase], ] - stage = MultiPhaseStep(None) + stage = MultiPhaseStep(None, None) self.assertEqual(stage.steps, 2) current_phase = stage.phases[0]