From 1f1ff5cb500447f65c31730d29d62487391dbff1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6rn=20K=C3=BCnsem=C3=B6ller?=
 <jkuensem@physik.uni-bielefeld.de>
Date: Thu, 9 Sep 2021 19:28:38 +0200
Subject: [PATCH] TMSS-983: Define TaskBlueprint statuses as an Enum and use
 that in the task blueprint status filter.

---
 .../src/tmss/tmssapp/models/specification.py  | 30 ++++++++++++-------
 .../tmss/tmssapp/viewsets/specification.py    |  2 +-
 2 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
index 1d2d09b011b..47ab3ea87a3 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
@@ -1004,6 +1004,16 @@ class TaskDraft(NamedCommon, TemplateSchemaMixin, ProjectPropertyMixin):
 
 
 class TaskBlueprint(ProjectPropertyMixin, TemplateSchemaMixin, NamedCommon):
+    class Status(Enum):
+        DEFINED = "defined"
+        FINISHED = "finished"
+        CANCELLED = "cancelled"
+        ERROR = "error"
+        OBSOLETE = "obsolete"
+        OBSERVED = "observed"
+        STARTED = "started"
+        SCHEDULED = "scheduled"
+        SCHEDULABLE = "schedulable"
 
     specifications_doc = JSONField(help_text='Schedulings for this task (IMMUTABLE).')
     specifications_template = ForeignKey('TaskTemplate', on_delete=CASCADE, help_text='Schema used for specifications_doc (IMMUTABLE).')
@@ -1124,35 +1134,35 @@ class TaskBlueprint(ProjectPropertyMixin, TemplateSchemaMixin, NamedCommon):
         # simple python filtering counting by state and type. Saves many round-trip-db calls!
         nr_of_subtasks = len(subtasks)
         if nr_of_subtasks == 0:
-            return "defined"
+            return TaskBlueprint.Status.DEFINED.value
 
         if any(s for s in subtasks if s['state'] == 'defining'):
-            return "defined"
+            return TaskBlueprint.Status.DEFINED.value
 
         if len([s for s in subtasks if s['state'] == 'finished']) == nr_of_subtasks:
-            return "finished"
+            return TaskBlueprint.Status.FINISHED.value
 
         if any(s for s in subtasks if s['state'] in ('cancelling', 'cancelled')):
-            return "cancelled"
+            return TaskBlueprint.Status.CANCELLED.value
 
         if any(s for s in subtasks if s['state'] == 'error'):
-            return "error"
+            return TaskBlueprint.Status.ERROR.value
 
         # TODO: in TMSS-850 implement the various conditional aggregations for the 'obsolete' vs 'finished' states
         if any(s for s in subtasks if s['state'] == 'obsolete'):
-            return "obsolete"
+            return TaskBlueprint.Status.OBSOLETE.value
 
         observations = [s for s in subtasks if s['specifications_template__type_id'] == 'observation']
         if observations and all(obs and obs['state'] in ('finishing', 'finished') for obs in observations):
-            return "observed"
+            return TaskBlueprint.Status.OBSERVED.value
 
         if any(s for s in subtasks if s['state'] in ('starting','started','queueing','queued','finishing','finished')):
-            return "started"
+            return TaskBlueprint.Status.STARTED.value
 
         if any(s for s in subtasks if s['state'] == 'scheduled'):
-            return "scheduled"
+            return TaskBlueprint.Status.SCHEDULED.value
 
-        return "schedulable"
+        return TaskBlueprint.Status.SCHEDULABLE.value
 
 
 class TaskRelationDraft(BasicCommon, TemplateSchemaMixin, ProjectPropertyMixin):
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
index f67538ea4c7..9b2b9b82f44 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
@@ -1279,7 +1279,7 @@ class TaskBlueprintPropertyFilter(property_filters.PropertyFilterSet):
     relative_stop_time_max = property_filters.PropertyDurationFilter(field_name='relative_stop_time', lookup_expr='lte')
     start_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='start_time')
     stop_time = property_filters.PropertyIsoDateTimeFromToRangeFilter(field_name='stop_time')
-    status = property_filters.PropertyMultipleChoiceFilter(field_name='status', choices=tuple((i.value, i.value) for i in models.SubtaskState.Choices), lookup_expr='iexact')
+    status = property_filters.PropertyMultipleChoiceFilter(field_name='status', choices=tuple((i.value, i.value) for i in models.TaskBlueprint.Status), lookup_expr='iexact')
     subtasks = filters.ModelMultipleChoiceFilter(field_name='subtasks', queryset=models.Subtask.objects.all())
     subtasks_min = filters.NumberFilter(field_name='subtasks__id', lookup_expr='gte')
     subtasks_max = filters.NumberFilter(field_name='subtasks__id', lookup_expr='lte')
-- 
GitLab