diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py index c7aaad86abfe66755da6b131643cf65c22cb2c5b..7a4629fdf3bf56d699ce9701c53d9a416a7d56a5 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py @@ -54,9 +54,13 @@ def _get_telescope_time_distribution(cycle: models.Cycle, start: datetime, stop: 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 + # Calculate derived and store durations idle = total - succeeded - failed - result[c if c == 'UNASSIGNED' or c == 'FILLER' else c.name] = {'durations': {'total': total, 'succeeded': succeeded, - 'failed': failed, 'idle': idle}} + succeeded_perc = succeeded * 100.0 / total if total > 0 else None + failed_perc = failed * 100.0 / total if total > 0 else None + idle_perc = idle * 100.0 / total if total > 0 else None + durations = {'total': total, 'succeeded': succeeded, 'succeeded_perc': succeeded_perc, 'failed': failed, 'failed_perc': failed_perc, 'idle': idle, 'idle_perc': idle_perc} + result[c if c == 'UNASSIGNED' or c == 'FILLER' else c.name] = {'durations': durations} return result @@ -84,7 +88,7 @@ def _get_average_efficiency(cycle: models.Cycle, start: datetime, stop: datetime sup = SchedulingUnitProcess.objects.filter(su=sub).first() total_per_day += sub.observed_duration.total_seconds() total_succeeded_per_day += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0 - efficiency_per_day += total_succeeded_per_day / total_per_day if total_per_day > 0 else 0 + efficiency_per_day += total_succeeded_per_day * 100.0 / total_per_day if total_per_day > 0 else 0 i += 1 d += step @@ -112,12 +116,14 @@ def _get_completion_level(cycle: models.Cycle, start: datetime, stop: datetime) sup = SchedulingUnitProcess.objects.filter(su=sub).first() total += sub.observed_duration.total_seconds() total_succeeded += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0 - result['total'], result['succeeded'] = total, total_succeeded + # Store durations + succeeded_perc = total_succeeded * 100.0 / total if total > 0 else None + result['total'], result['succeeded'], result['succeeded_perc'] = total, total_succeeded, succeeded_perc # Calculate prognosis unschedulable_subtasks = models.Subtask.objects.filter(task_blueprints__scheduling_unit_blueprint__in=subs).filter(state='unschedulable') unschedulable_duration = sum([uns.specified_duration.total_seconds() for uns in unschedulable_subtasks]) - result['prognosis'] = (total - unschedulable_duration) * 100.0 / total if total > 0 and total >= unschedulable_duration else None + result['prognosis'] = unschedulable_duration * 100.0 / total if total > 0 else None return result @@ -182,8 +188,8 @@ def _get_weekly_efficiency(cycle: models.Cycle, start: datetime, stop: datetime) sup = SchedulingUnitProcess.objects.filter(su=sub).first() total_per_week += sub.observed_duration.total_seconds() total_succeeded_per_week += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0 - result['weeks'].append( - {'week': d.date().isoformat(), 'efficiency': total_succeeded_per_week / total_per_week if total_per_week > 0 else None}) + efficiency = total_succeeded_per_week * 100.0 / total_per_week if total_per_week > 0 else None + result['weeks'].append({'week': d.date().isoformat(), 'efficiency': efficiency}) d += step return result @@ -297,7 +303,8 @@ def _get_failures(cycle: models.Cycle, start: datetime, stop: datetime) -> {}: sup = SchedulingUnitProcess.objects.filter(su=sub).first() total_per_month += sub.observed_duration.total_seconds() total_failed_per_month += sub.observed_duration.total_seconds() if sup and sup.results_accepted is False else 0 - result['months'].append({'month': d.date().isoformat(), 'total': total_per_month, 'total_failed': total_failed_per_month}) + failed_perc = total_failed_per_month * 100.0 / total_per_month if total_per_month > 0 else None + result['months'].append({'month': d.date().isoformat(), 'total': total_per_month, 'total_failed': total_failed_per_month, 'failed_perc': failed_perc}) d += step return result