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