diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py index c64eeacbcd0b1255a6f45a7be11e807264ec71d4..fa7a26739c06ec5f7c714fa88857aa007976bb99 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py @@ -128,16 +128,26 @@ def _get_observation_hours_per_category(cycle: models.Cycle) -> {}: """ from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess - result = {'total_duration_failed': 0, 'total_duration_idle': 0} + result = {'total_duration_failed': 0, 'total_duration_idle': 0, 'DDT Com Rep': 0} + # Filter System Unavailability + # TODO: Maybe add some other case scenarios where the system is not up and running? + reservations_duration = models.Reservation.objects.filter(start_time__gte=cycle.start, stop_time__lte=cycle.stop).\ + filter(specifications_doc__activity__type='maintenance').aggregate(duration=Sum(F('stop_time') - F('start_time')))['duration'] + result['System Unavailability'] = reservations_duration.total_seconds() if reservations_duration else None + + # Filter durations for each prio basing on SUBs and projects cycle_subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project__cycles=cycle.pk) - # TODO: Filter also according to "DDT Com Rep", and "System Unavailability". - # Filter durations for each prio basing on SUBs states for prio in models.PriorityQueueType.Choices: result[f'total_duration_successful_{prio.name}'] = 0 subs = cycle_subs.filter(priority_queue=prio.value) for sub in subs: if sub.observed_duration: + # Filter DDT Com Rep + project_categoy = sub.project.project_category + if project_categoy == 'ddt' or project_categoy == 'commissioning': # TODO: Rep as repetition. + result['DDT Com Rep'] += sub.observed_duration.total_seconds() + # Distinguish successful and failed result['total_duration_idle'] += sub.observed_duration.total_seconds() sup = SchedulingUnitProcess.objects.filter(su=sub).first() result[f'total_duration_successful_{prio.name}'] += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0