diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py index d9d211e730cadb2ca947b2fcc93fff50ac3691cc..dd03169d75e37d624beb4217125061b78de049db 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py @@ -47,11 +47,12 @@ def _get_telescope_time_distribution(cycle: models.Cycle) -> {}: # Get durations for single project subs = models.SchedulingUnitBlueprint.objects.filter(draft__scheduling_set__project=p.pk) for sub in subs: - sup = SchedulingUnitProcess.objects.filter(su=sub).first() - # Aggregate total, successful and failed durations - total += sub.observed_duration.total_seconds() - succeeded += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0 - failed += sub.observed_duration.total_seconds() if sup and sup.results_accepted is False else 0 + if sub.observed_duration: + sup = SchedulingUnitProcess.objects.filter(su=sub).first() + # Aggregate total, successful and failed durations + total += sub.observed_duration.total_seconds() + succeeded += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0 + failed += sub.observed_duration.total_seconds() if sup and sup.results_accepted is False else 0 idle = total - succeeded - failed result[c if c == 'UNASSIGNED' or c == 'FILLER' else c.name] = {'durations': {'total': total, 'succeeded': succeeded, 'failed': failed, 'idle': idle}} @@ -132,16 +133,16 @@ def _get_observation_hours_per_category(cycle: models.Cycle) -> {}: # 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_{prio.name}'] = 0 + result[f'total_duration_successful_{prio.name}'] = 0 subs = cycle_subs.filter(priority_queue=prio.value) for sub in subs: - result['total_duration_idle'] += sub.observed_duration.total_seconds() if sub.observed_duration else 0 if sub.observed_duration: + result['total_duration_idle'] += sub.observed_duration.total_seconds() sup = SchedulingUnitProcess.objects.filter(su=sub).first() - result[f'total_duration_{prio.name}'] += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0 + result[f'total_duration_successful_{prio.name}'] += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0 result['total_duration_failed'] += sub.observed_duration.total_seconds() if sup and sup.results_accepted is False else 0 # Subtract prio states from total to get partial idle - result['total_duration_idle'] -= result[f'total_duration_{prio.name}'] + result['total_duration_idle'] -= result[f'total_duration_successful_{prio.name}'] # Subtract total failed to get total idle eventually result['total_duration_idle'] -= result['total_duration_failed'] @@ -337,27 +338,26 @@ def _get_subs_and_durations_from_project(project_pk: int) -> ({}, {}): 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: + # Main SUB information to be returned sub_duration = sub.duration.total_seconds() sub_observed_duration = sub.observed_duration.total_seconds() if sub.observed_duration else 0 - + sub_info = {'id': sub.pk, 'name': sub.name, 'status': sub.status, 'start': sub.start_time.isoformat(), + 'stop': sub.stop_time.isoformat(), 'duration': sub_duration, 'observed_duration': sub_observed_duration} + # Gather durations durations['total'] += sub_duration # Total if sub.status != 'cancelled': # Not cancelled SUBs durations['total_not_cancelled'] += sub_duration - durations['total_observed'] += sub_observed_duration # Total observed + # Distinguish successful and failed SUBs sup = SchedulingUnitProcess.objects.filter(su=sub).first() - # Succeeded SUBs - if sup and sup.results_accepted: + if sup and sup.results_accepted: # Succeeded SUBs 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: + subs_succeeded.append(sub_info) + elif sup and sup.results_accepted is False: # Failed SUBs 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}) + subs_failed.append(sub_info) # 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}']