From 408597ecaa3860e3362bb55d1e90e93340be5faf Mon Sep 17 00:00:00 2001
From: Mario Raciti <mario.raciti@inaf.it>
Date: Tue, 20 Jul 2021 11:09:56 +0200
Subject: [PATCH] TMSS-770: Fix get_subs_and_durations_from_project duration
 gathering logic

---
 .../src/tmss/tmssapp/adapters/reports.py      | 43 +++++++++++--------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
index d491a5ecc8e..d9d211e730c 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
@@ -326,33 +326,40 @@ def _get_subs_and_durations_from_project(project_pk: int) -> ({}, {}):
     """
     from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
 
-    durations = {'total': 0, 'total_not_cancelled': 0, 'total_observed': 0, 'total_observed_succeeded': 0,
-                 'total_observed_failed': 0}
+    durations = {'total': 0, 'total_not_cancelled': 0, 'total_succeeded': 0, 'total_failed': 0,
+                 'total_observed': 0, 'total_observed_succeeded': 0, 'total_observed_failed': 0}
 
     # Get SUBs related to the project
     project_subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__pk=project_pk)
 
     subs_succeeded, subs_failed = [], []
     for prio in models.PriorityQueueType.Choices:
-        durations[f'total_observed_succeeded_{prio.name}'] = 0
+        durations[f'total_succeeded_{prio.name}'], durations[f'total_observed_succeeded_{prio.name}'] = 0, 0
         subs = project_subs.filter(priority_queue=prio.value)
         for sub in subs:
-            # TODO: Does it make any sense to consider generic successful and failed?
-            durations['total'] += sub.duration.total_seconds()
+            sub_duration = sub.duration.total_seconds()
+            sub_observed_duration = sub.observed_duration.total_seconds() if sub.observed_duration else 0
+
+            durations['total'] += sub_duration  # Total
             if sub.status != 'cancelled':  # Not cancelled SUBs
-                durations['total_not_cancelled'] += sub.duration.total_seconds()
-            # Observations
-            if sub.observed_duration:
-                durations['total_observed'] += sub.observed_duration.total_seconds()
-                sup = SchedulingUnitProcess.objects.filter(su=sub).first()
-                if sup and sup.results_accepted:    # Succeeded SUBs
-                    durations[f'total_observed_succeeded_{prio.name}'] += sub.observed_duration.total_seconds()
-                    subs_succeeded.append({'id': sub.pk, 'name': sub.name, 'duration': sub.duration.total_seconds(),
-                                           'observed_duration': sub.observed_duration.total_seconds()})
-                elif sup and sup.results_accepted is False:  # Failed SUBs
-                    durations['total_observed_failed'] += sub.observed_duration.total_seconds()
-                    subs_failed.append({'id': sub.pk, 'name': sub.name, 'duration': sub.duration.total_seconds(),
-                                        'observed_duration': sub.observed_duration.total_seconds()})
+                durations['total_not_cancelled'] += sub_duration
+
+            durations['total_observed'] += sub_observed_duration  # Total observed
+            sup = SchedulingUnitProcess.objects.filter(su=sub).first()
+            # Succeeded SUBs
+            if sup and sup.results_accepted:
+                durations[f'total_succeeded_{prio.name}'] += sub_duration
+                durations[f'total_observed_succeeded_{prio.name}'] += sub_observed_duration
+                subs_succeeded.append({'id': sub.pk, 'name': sub.name, 'duration': sub_duration,
+                                       'observed_duration': sub_observed_duration})
+            # Failed SUBs
+            elif sup and sup.results_accepted is False:
+                durations['total_failed'] += sub_duration
+                durations['total_observed_failed'] += sub_observed_duration
+                subs_failed.append({'id': sub.pk, 'name': sub.name, 'duration': sub_duration,
+                                    'observed_duration': sub_observed_duration})
+        # Gather prios durations as well
+        durations['total_succeeded'] += durations[f'total_succeeded_{prio.name}']
         durations['total_observed_succeeded'] += durations[f'total_observed_succeeded_{prio.name}']
 
     subs = {'successful': subs_succeeded, 'failed': subs_failed}
-- 
GitLab