diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py index 047f7ba96a071b7c9c0cdc042db4b143b029a864..8df42757e9a6a2818e9dfc4886050eabd6c7167d 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py @@ -1,5 +1,5 @@ from django.db.models import F, Sum, Count, ExpressionWrapper -from django.db.models.functions import TruncMonth +from django.db.models.functions import Coalesce from lofar.sas.tmss.tmss.tmssapp import models from lofar.sas.tmss.tmss.exceptions import TaskOverlappingWarning @@ -679,7 +679,7 @@ class FailureReport(): for field_name in ['issue_type', 'issue_subtype']: group_aggregates = list(self.system_events.values(f'{field_name}__value') .annotate(count=Count(f'{field_name}__value'), - total_duration=Sum(F('stop') - F('start')))) + total_duration=Sum(Coalesce(F('stop'), datetime.utcnow()) - F('start')))) # convert durations to seconds and add derived values for d in group_aggregates: @@ -699,12 +699,13 @@ class FailureReport(): system_events = models.SystemEvent.objects.filter(severity__value=models.SystemEventSeverity.Choices.FAILURE.value).order_by('start') for event in system_events.all(): + event_stop = event.stop if event.stop else datetime.utcnow() start_bin = datetime(year=event.start.year, month=event.start.month, day=1) - stop_bin = datetime(year=event.stop.year, month=event.stop.month, day=1) + stop_bin = datetime(year=event_stop.year, month=event_stop.month, day=1) # deal with event starting/stopping in same month if start_bin == stop_bin: - histogram[start_bin] = histogram.get(start_bin, 0) + (event.stop - event.start).total_seconds() + histogram[start_bin] = histogram.get(start_bin, 0) + (event_stop - event.start).total_seconds() continue # deal with events wrapping over several months... @@ -718,7 +719,7 @@ class FailureReport(): histogram[next_bin] = histogram.get(next_bin, 0) + seconds_in_month next_bin += relativedelta(months=1) # ...account for partial month at stop - histogram[stop_bin] = histogram.get(stop_bin, 0) + (event.stop - stop_bin).total_seconds() + histogram[stop_bin] = histogram.get(stop_bin, 0) + (event_stop - stop_bin).total_seconds() # todo: Or should this be based on the time that was actually lost in SUs? # This would do the trick (SU start time determines bin these fall into): @@ -749,8 +750,8 @@ class FailureReport(): unit_list.append({'name': unit.name, 'id': unit.id, 'status': unit.status.value, - 'on_sky_start_time': unit.on_sky_start_time.isoformat(), - 'on_sky_duration': unit.on_sky_duration.total_seconds(), + 'on_sky_start_time': unit.on_sky_start_time.isoformat() if unit.on_sky_start_time else None, + 'on_sky_duration': unit.on_sky_duration.total_seconds() if unit.on_sky_duration else None, 'subtasks': list(observation_subtasks.values_list('id', flat=True)), 'issue_type(s)': [event.issue_type.value for event in system_events_for_this_unit], 'issue_subtype(s)': [event.issue_subtype.value for event in system_events_for_this_unit],