From 04c48e56979092ce0b6c2f5655456319b7b19fab Mon Sep 17 00:00:00 2001
From: Mattia Mancini <mancini@astron.nl>
Date: Mon, 22 Oct 2018 12:56:46 +0000
Subject: [PATCH] OSB-28: small fixes

---
 .../monitoringdb/station_test_raw_parser.py   |  2 +-
 .../monitoringdb/views/controllers.py         | 91 ++++++++++---------
 .../MDB_tools/cli/station_tests_watchdog.py   |  2 +-
 3 files changed, 51 insertions(+), 44 deletions(-)

diff --git a/LCU/Maintenance/DBInterface/monitoringdb/station_test_raw_parser.py b/LCU/Maintenance/DBInterface/monitoringdb/station_test_raw_parser.py
index 3f4ff081edd..f47b1ae7c47 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/station_test_raw_parser.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/station_test_raw_parser.py
@@ -179,7 +179,7 @@ def dict_from_component_error(content):
 
     component_error = dict(component=component,
                            details=error_details,
-                           type=error_type)
+                           type=error_type.strip())
 
     for element_error in element_errors:
         element_error['component_error'] = dict(component_error)
diff --git a/LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py b/LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py
index 08008cc6689..21bc826a45d 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/views/controllers.py
@@ -1,23 +1,21 @@
 import datetime
 from collections import OrderedDict
+from math import ceil
 
 import coreapi
 import coreschema
 from django.db.models import Count
-
-from math import ceil
 from django.db.models import Window, F
-
 from rest_framework import status
 from rest_framework.response import Response
 from rest_framework.schemas import ManualSchema
 from rest_framework.views import APIView
 
+from lofar.maintenance.monitoringdb.models.component_error import ComponentError
+from lofar.maintenance.monitoringdb.models.rtsm import RTSMErrorSummary
 from lofar.maintenance.monitoringdb.models.rtsm import RTSMObservation
 from lofar.maintenance.monitoringdb.models.station import Station
 from lofar.maintenance.monitoringdb.models.station_test import StationTest
-from lofar.maintenance.monitoringdb.models.component_error import ComponentError
-from lofar.maintenance.monitoringdb.models.rtsm import RTSMErrorSummary
 
 
 class ControllerStationOverview(APIView):
@@ -123,14 +121,14 @@ class ControllerStationOverview(APIView):
                 rtsm_payload['start_datetime'] = rtsm.start_datetime
                 rtsm_payload['end_datetime'] = rtsm.end_datetime
 
-                unique_modes = [item['mode'] for item in rtsm.errors.values('mode').distinct()]
+                unique_modes = [item['mode'] for item in rtsm.errors_summary.values('mode').distinct()]
                 rtsm_payload['mode'] = unique_modes
                 rtsm_payload['total_component_errors'] = rtsm.errors_summary.count()
 
                 errors_summary = OrderedDict()
 
-                errors_summary_query = rtsm.errors_summary.annotate(total=Count('error_type')).values(
-                    'error_type', 'total').distinct()
+                errors_summary_query = rtsm.errors_summary.values('error_type').annotate(
+                    total=Count('error_type'))
 
                 for error_summary in errors_summary_query:
                     errors_summary[error_summary['error_type']] = error_summary['total']
@@ -197,7 +195,7 @@ class ControllerStationTestsSummary(APIView):
         self.station_group = request.query_params.get('station_group', self.DEFAULT_STATION_GROUP)
 
         self.lookback_time = datetime.timedelta(int(request.query_params.get('lookback_time',
-                                                            self.DEFAULT_LOOKBACK_TIME_IN_DAYS)))
+                                                                             self.DEFAULT_LOOKBACK_TIME_IN_DAYS)))
 
     def get(self, request, format=None):
         try:
@@ -209,12 +207,12 @@ class ControllerStationTestsSummary(APIView):
             return Response(status=status.HTTP_406_NOT_ACCEPTABLE,
                             data='Please specify all the required parameters: %s' % (e,))
 
-        station_test_list = StationTest.objects\
-            .filter(start_datetime__gte=datetime.date.today()-self.lookback_time)\
+        station_test_list = StationTest.objects \
+            .filter(start_datetime__gte=datetime.date.today() - self.lookback_time) \
             .order_by('-start_datetime', 'station__name')
         for group in self.station_group:
             if group is not 'A':
-                station_entities = station_test_list.filter(type=group)
+                station_test_list = station_test_list.filter(station__type=group)
 
         # Since django preferes a ordered dict over a dict we make it happy... for now
         response_payload = list()
@@ -331,7 +329,7 @@ class ControllerLatestObservations(APIView):
             return Response(status=status.HTTP_406_NOT_ACCEPTABLE,
                             data='Please specify both the start and the end date: %s' % (e,))
 
-        rtsm_observation_entities = RTSMObservation.objects.filter(
+        rtsm_observation_entities = RTSMObservation.objects.defer('errors').filter(
             start_datetime__gte=self.from_date)
         for group in self.station_group:
             if group is not 'A':
@@ -342,26 +340,25 @@ class ControllerLatestObservations(APIView):
         for rtsm_observation_entity in rtsm_observation_entities.values('observation_id',
                                                                         'start_datetime',
                                                                         'end_datetime'). \
-                distinct().order_by('-observation_id'):
+                distinct().order_by('-start_datetime'):
             observation_payload = OrderedDict()
 
             observation_payload['observation_id'] = rtsm_observation_entity['observation_id']
             observation_payload['start_datetime'] = rtsm_observation_entity['start_datetime']
             observation_payload['end_datetime'] = rtsm_observation_entity['end_datetime']
 
-            rtsm_list = RTSMObservation.objects.filter(
+            rtsm_list = RTSMObservation.objects.defer('errors').filter(
                 start_datetime__gte=self.from_date,
                 observation_id=rtsm_observation_entity['observation_id'])
-            unique_modes = [item['errors__mode'] for item in rtsm_list.values('errors__mode').distinct()]
+            unique_modes = [item['errors_summary__mode'] for item in
+                            rtsm_list.values('errors_summary__mode').distinct()]
 
             observation_payload['mode'] = unique_modes
             observation_payload['total_component_errors'] = 0
 
-
             station_involved_list = list()
 
             for rtsm_entry_per_station in rtsm_list.order_by('station__name'):
-
                 station_summary = OrderedDict()
                 station_summary['station_name'] = rtsm_entry_per_station.station.name
 
@@ -378,7 +375,7 @@ class ControllerLatestObservations(APIView):
 
             response_payload.append(observation_payload)
         if self.errors_only and self.errors_only != 'false':
-            print(self.errors_only)
+
             response_payload = filter(
                 lambda station_entry:
                 len(station_entry['total_component_errors']) > 0,
@@ -488,27 +485,32 @@ result:
         if self.test_type not in ['R', 'S', 'B']:
             raise ValueError('test_type is not one of [R,S,B]')
 
-        self.averaging_interval = datetime.timedelta(int(request.query_params.get('averaging_interval')))
+        self.averaging_interval = datetime.timedelta(
+            int(request.query_params.get('averaging_interval')))
 
-    def compute_errors_per_station(self, from_date, to_date, central_time, station_group, test_type):
+    def compute_errors_per_station(self, from_date, to_date, central_time, station_group,
+                                   test_type):
 
         component_errors = ComponentError.objects.all()
         rtsm_summary_errors = RTSMErrorSummary.objects.all()
 
         if station_group:
             component_errors = component_errors.filter(station_test__station__type=station_group)
-            rtsm_summary_errors = rtsm_summary_errors.filter(observation__station__type=station_group)
+            rtsm_summary_errors = rtsm_summary_errors.filter(
+                observation__station__type=station_group)
 
         station_test_results = []
         rtsm_results = []
         if test_type in ['S', 'B']:
             station_test_results = component_errors. \
-                filter(station_test__start_datetime__gt=from_date, station_test__start_datetime__lt=to_date). \
+                filter(station_test__start_datetime__gt=from_date,
+                       station_test__start_datetime__lt=to_date). \
                 values('station_test__station__name'). \
                 annotate(n_errors=Count('station_test__station__name'))
         if test_type in ['R', 'B']:
             rtsm_results = rtsm_summary_errors. \
-                filter(observation__start_datetime__gt=from_date, observation__start_datetime__lt=to_date). \
+                filter(observation__start_datetime__gt=from_date,
+                       observation__start_datetime__lt=to_date). \
                 values('observation__station__name'). \
                 annotate(n_errors=Count('observation__station__name'))
 
@@ -541,18 +543,22 @@ result:
         station_test_results = []
         rtsm_results = []
 
+        central_time_str = central_time.strftime('%Y-%m-%d')
         if station_group:
             component_errors = component_errors.filter(station_test__station__type=station_group)
-            rtsm_summary_errors = rtsm_summary_errors.filter(observation__station__type=station_group)
+            rtsm_summary_errors = rtsm_summary_errors.filter(
+                observation__station__type=station_group)
 
         if test_type in ['S', 'B']:
             station_test_results = component_errors. \
-                filter(station_test__start_datetime__gt=from_date, station_test__start_datetime__lt=to_date). \
+                filter(station_test__start_datetime__gt=from_date,
+                       station_test__start_datetime__lt=to_date). \
                 values('type'). \
                 annotate(n_errors=Count('type'))
         if test_type in ['R', 'B']:
             rtsm_results = rtsm_summary_errors. \
-                filter(observation__start_datetime__gt=from_date, observation__start_datetime__lt=to_date). \
+                filter(observation__start_datetime__gt=from_date,
+                       observation__start_datetime__lt=to_date). \
                 values('error_type'). \
                 annotate(n_errors=Count('error_type'))
 
@@ -563,14 +569,14 @@ result:
                 error_type = result['type']
                 errors_per_error_type_in_bin[error_type] = dict(error_type=error_type,
                                                                 n_errors=result['n_errors'],
-                                                                time=central_time)
+                                                                time=central_time_str)
         if test_type in ['R', 'B']:
             for result in rtsm_results:
                 error_type = result['error_type']
                 if error_type not in errors_per_error_type_in_bin:
                     errors_per_error_type_in_bin[error_type] = dict(error_type=error_type,
                                                                     n_errors=result['n_errors'],
-                                                                    time=central_time)
+                                                                    time=central_time_str)
                 else:
                     errors_per_error_type_in_bin[error_type]['n_errors'] += result['n_errors']
 
@@ -601,18 +607,19 @@ result:
                 station_group = None
             else:
                 station_group = self.station_group
-            errors_per_station.append(
-                self.compute_errors_per_station(from_date=self.from_date + i * self.averaging_interval,
-                                                to_date=self.from_date + (i + 1) * self.averaging_interval,
-                                                central_time=self.from_date + (i + .5) * self.averaging_interval,
-                                                station_group=station_group,
-                                                test_type=self.test_type))
-            errors_per_type.append(
-                self.compute_errors_per_type(from_date=self.from_date + i * self.averaging_interval,
-                                             to_date=self.from_date + (i + 1) * self.averaging_interval,
-                                             central_time=self.from_date + (i + .5) * self.averaging_interval,
-                                             station_group=station_group,
-                                             test_type=self.test_type))
+            errors_per_station += self.compute_errors_per_station(
+                from_date=self.from_date + i * self.averaging_interval,
+                to_date=self.from_date + (i + 1) * self.averaging_interval,
+                central_time=self.from_date + (i + .5) * self.averaging_interval,
+                station_group=station_group,
+                test_type=self.test_type)
+
+            errors_per_type += self.compute_errors_per_type(
+                from_date=self.from_date + i * self.averaging_interval,
+                to_date=self.from_date + (i + 1) * self.averaging_interval,
+                central_time=self.from_date + (i + .5) * self.averaging_interval,
+                station_group=station_group,
+                test_type=self.test_type)
 
         response_payload['errors_per_station'] = errors_per_station
         response_payload['errors_per_type'] = errors_per_type
@@ -627,4 +634,4 @@ class ControllerAllComponentErrorTypes(APIView):
 
     def get(self, request, format=None):
         data = [item['type'] for item in ComponentError.objects.values('type').distinct()]
-        return Response(status=status.HTTP_200_OK, data=data)
\ No newline at end of file
+        return Response(status=status.HTTP_200_OK, data=data)
diff --git a/LCU/Maintenance/MDB_tools/cli/station_tests_watchdog.py b/LCU/Maintenance/MDB_tools/cli/station_tests_watchdog.py
index 4b4ae3fff66..d4e7d675776 100644
--- a/LCU/Maintenance/MDB_tools/cli/station_tests_watchdog.py
+++ b/LCU/Maintenance/MDB_tools/cli/station_tests_watchdog.py
@@ -172,7 +172,7 @@ def handle_event_file_created(mdb_address, event):
 
 def main():
     setup_logging_framework()
-    station_tests_watchdog(sys.argv)
+    station_tests_watchdog(sys.argv[1:])
 
 
 if __name__ == '__main__':
-- 
GitLab