From a621fe488fbaaa60563456470d49852681083fad Mon Sep 17 00:00:00 2001
From: Todd Dembrey <todd.dembrey@torchbox.com>
Date: Mon, 18 Dec 2017 15:16:57 +0000
Subject: [PATCH] Add a public display name to the Phase

---
 .../apply/templates/apply/demo_workflow.html   |  3 ++-
 opentech/apply/tests/test_workflow.py          | 17 +++++++++++++++++
 opentech/apply/workflow.py                     | 18 +++++++++++++-----
 3 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/opentech/apply/templates/apply/demo_workflow.html b/opentech/apply/templates/apply/demo_workflow.html
index e81ec67c7..6817653d7 100644
--- a/opentech/apply/templates/apply/demo_workflow.html
+++ b/opentech/apply/templates/apply/demo_workflow.html
@@ -17,7 +17,8 @@
         <section class="container">
             <h2>{{ workflow}}</h2>
             <h3>{{ phase.stage }}</h3>
-            <h4>{{ phase.name }}</h4>
+            <h4>OTF: {{ phase.name }}</h4>
+            <h4>Public: {{ phase.public_name }}</h4>
             <form method="post">
             {% csrf_token %}
             <input id="current" type="hidden" name="current" value="{{ phase }}" />
diff --git a/opentech/apply/tests/test_workflow.py b/opentech/apply/tests/test_workflow.py
index 770c5091b..5770b0d66 100644
--- a/opentech/apply/tests/test_workflow.py
+++ b/opentech/apply/tests/test_workflow.py
@@ -69,6 +69,23 @@ class TestPhaseCreation(SimpleTestCase):
         phase = PhaseFactory(actions=actions)
         self.assertEqual(phase[action.name], action)
 
+    def test_uses_name_if_no_public(self):
+        phase = Phase('Phase Name')
+        self.assertEqual(phase.public_name, phase.name)
+
+    def test_uses_public_if_provided(self):
+        public_name = 'Public Name'
+        phase = Phase('Phase Name', public_name=public_name)
+        self.assertEqual(phase.public_name, public_name)
+        self.assertNotEqual(phase.public_name, phase.name)
+
+    def test_uses_public_if_provided_on_class(self):
+        class NewPhase(Phase):
+            public_name = 'Public Name'
+        phase = NewPhase('Phase Name')
+        self.assertEqual(phase.public_name, NewPhase.public_name)
+        self.assertNotEqual(phase.public_name, phase.name)
+
 
 class TestActions(SimpleTestCase):
     def test_can_create_action(self):
diff --git a/opentech/apply/workflow.py b/opentech/apply/workflow.py
index dd24aa001..c7ff5b158 100644
--- a/opentech/apply/workflow.py
+++ b/opentech/apply/workflow.py
@@ -115,10 +115,17 @@ class Stage:
 class Phase:
     actions: Sequence['Action'] = list()
     name: str = ''
+    public_name: str = ''
 
-    def __init__(self, name: str='') -> None:
+    def __init__(self, name: str='', public_name:str = '') -> None:
         if name:
             self.name = name
+
+        if public_name:
+            self.public_name = public_name
+        elif not self.public_name:
+            self.public_name = self.name
+
         self._internal = slugify(self.name)
         self.stage: Union['Stage', None] = None
         self._actions = {action.name: action for action in self.actions}
@@ -160,10 +167,8 @@ class ChangePhaseAction(Action):
 
     def process(self, phase: 'Phase') -> Union['Phase', None]:
         if isinstance(self.target_phase, str):
-            phase = globals()[self.target_phase]
-        else:
-            phase = self.target_phase
-        return phase
+            return phase.stage.current(self.target_phase, '0')
+        return self.target_phase
 
 
 class NextPhaseAction(Action):
@@ -182,16 +187,19 @@ next_phase = NextPhaseAction('Progress')
 
 class ReviewPhase(Phase):
     name = 'Internal Review'
+    public_name = 'In review'
     actions = [NextPhaseAction('Close Review')]
 
 
 class DeterminationWithProgressionPhase(Phase):
     name = 'Under Discussion'
+    public_name = 'In review'
     actions = [progress_stage, reject_action]
 
 
 class DeterminationWithNextPhase(Phase):
     name = 'Under Discussion'
+    public_name = 'In review'
     actions = [NextPhaseAction('Open Review'), reject_action]
 
 
-- 
GitLab