From 26b3f5b47676200a355bbed5c9c3b15453358713 Mon Sep 17 00:00:00 2001 From: Todd Dembrey <todd.dembrey@torchbox.com> Date: Mon, 18 Dec 2017 14:50:37 +0000 Subject: [PATCH] Make the stages buildable from the classes --- opentech/apply/tests/factories.py | 8 +++++++- opentech/apply/tests/test_workflow.py | 4 +--- opentech/apply/workflow.py | 25 +++++++++++++++++-------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/opentech/apply/tests/factories.py b/opentech/apply/tests/factories.py index 79fa5ed29..bd237ca95 100644 --- a/opentech/apply/tests/factories.py +++ b/opentech/apply/tests/factories.py @@ -52,7 +52,7 @@ class PhaseFactory(factory.Factory): class StageFactory(factory.Factory): class Meta: model = Stage - inline_args = ('name', 'form', 'phases',) + inline_args = ('form',) class Params: num_phases = factory.Faker('random_int', min=1, max=3) @@ -61,6 +61,12 @@ class StageFactory(factory.Factory): form = factory.LazyFunction(Form) phases = ListSubFactory(PhaseFactory, count=factory.SelfAttribute('num_phases')) + @classmethod + def _create(cls, model_class, *args, **kwargs): + phases = kwargs.pop('phases') + new_class = type(model_class.__name__, (model_class,), {'phases': phases}) + return new_class(*args, **kwargs) + class WorkflowFactory(factory.Factory): class Meta: diff --git a/opentech/apply/tests/test_workflow.py b/opentech/apply/tests/test_workflow.py index 6274684c1..770c5091b 100644 --- a/opentech/apply/tests/test_workflow.py +++ b/opentech/apply/tests/test_workflow.py @@ -44,11 +44,9 @@ class TestStageCreation(SimpleTestCase): def test_can_create_stage(self): name = 'the_stage' form = Form() - phases = PhaseFactory.create_batch(2) - stage = Stage(name, form, phases) + stage = Stage(form, name=name) self.assertEqual(stage.name, name) self.assertEqual(stage.form, form) - self.assertEqual(stage.phases, phases) def test_can_get_next_phase(self): stage = StageFactory(num_phases=2) diff --git a/opentech/apply/workflow.py b/opentech/apply/workflow.py index e4401f62d..ef5dc3ace 100644 --- a/opentech/apply/workflow.py +++ b/opentech/apply/workflow.py @@ -70,14 +70,17 @@ class Workflow: class Stage: - def __init__(self, name: str, form: Form, phases: Sequence['Phase'], - current_phase: Union['Phase', None]=None) -> None: - self.name = name + name: str = 'Stage' + phases: list = list() + + def __init__(self, form: Form, name: str='') -> None: + if name: + self.name = name self.form = form # Make the phases new instances to prevent errors with mutability existing_phases: set = set() new_phases: list = list() - for phase in phases: + for phase in self.phases: phase.stage = self while str(phase) in existing_phases: phase.occurance += 1 @@ -209,10 +212,16 @@ rejected = Phase(name='Rejected') accepted = Phase(name='Accepted') -concept_note = Stage('Concept', Form(), [under_discussion_next, review, should_progress, rejected]) -proposal = Stage('Proposal', Form(), [under_discussion_next, review, under_discussion_next, ReviewPhase('AC Review'), under_discussion, accepted, rejected]) +class ConceptStage(Stage): + name = 'Concept' + phases = [under_discussion_next, review, should_progress, rejected] + + +class ProposalStage(Stage): + name = 'Proposal' + phases = [under_discussion_next, review, under_discussion_next, ReviewPhase('AC Review'), under_discussion, accepted, rejected] -single_stage = Workflow('Single Stage', [proposal]) +single_stage = Workflow('Single Stage', [ConceptStage(Form())]) -two_stage = Workflow('Two Stage', [concept_note, proposal]) +two_stage = Workflow('Two Stage', [ConceptStage(Form()), ProposalStage(Form())]) -- GitLab