From f535eea2ced11ac6a9f45011285ed85590018752 Mon Sep 17 00:00:00 2001
From: Mattia Mancini <mancini@astron.nl>
Date: Mon, 4 Jun 2018 13:42:05 +0000
Subject: [PATCH] Story SW-300: improving performances of rtsm error retrieval

---
 .../DBInterface/monitoringdb/models/rtsm.py   | 33 +++++++++++++++++++
 .../monitoringdb/serializers/rtsm.py          | 10 ++++--
 .../DBInterface/monitoringdb/urls.py          |  4 +--
 .../monitoringdb/views/rtsm_views.py          |  6 ++--
 LCU/Maintenance/MDB_tools/cli/probe_mdb.py    |  6 ++--
 5 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py b/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py
index c634c9f5ade..8632e83b704 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py
@@ -19,10 +19,26 @@ class RTSMObservation(models.Model):
     samples = models.IntegerField(default=None, null=True)
 
 
+class RTSMErrorSummary(models.Model):
+    rcu = models.SmallIntegerField(default=None, null=True)
+    mode = models.SmallIntegerField(default=None, null=True)
+    observation = models.ForeignKey(RTSMObservation, related_name='errors_summary', on_delete=models.CASCADE)
+
+    error_type = models.CharField(max_length=10)
+    start_frequency = models.FloatField(default=None, null=True)
+    stop_frequency = models.FloatField(default=None, null=True)
+    time = models.DateTimeField()
+
+    class Meta:
+        managed = False
+        db_table = 'monitoringdb_rtsmerror'
+
+
 class RTSMError(models.Model):
     rcu = models.SmallIntegerField(default=None, null=True)
     mode = models.SmallIntegerField(default=None, null=True)
     observation = models.ForeignKey(RTSMObservation, related_name='errors', on_delete=models.CASCADE)
+
     error_type = models.CharField(max_length=10)
     start_frequency = models.FloatField(default=None, null=True)
     stop_frequency = models.FloatField(default=None, null=True)
@@ -30,3 +46,20 @@ class RTSMError(models.Model):
     bad_spectrum = ArrayField(models.FloatField())
     average_spectrum = ArrayField(models.FloatField())
 
+    def __str__(self):
+        return self.__unicode__()
+
+    def __repr__(self):
+        return self.__unicode__()
+
+    def __unicode__(self):
+        return '%s - MODE %d, FROM %f MHz TO %f MHz RCU=(%d): %s' % (self.time,
+                                                                     self.mode,
+                                                                     self.start_frequency,
+                                                                     self.stop_frequency,
+                                                                     self.rcu,
+                                                                     self.error_type,)
+
+    class Meta:
+        managed = True
+        db_table = 'monitoringdb_rtsmerror'
diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py
index d86e41a65de..749d9b03c20 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py
@@ -19,14 +19,18 @@ class RTSMErrorSerializer(serializers.ModelSerializer):
 
 class RTSMErrorSummarySerializer(serializers.ModelSerializer):
     samples = serializers.IntegerField(source='observation.samples', read_only=True)
+    start_time = serializers.DateTimeField(source='observation.start_time', read_only=True)
+    end_time = serializers.DateTimeField(source='observation.start_time', read_only=True)
+    observation_id = serializers.IntegerField(source='observation.observation_id', read_only=True)
+    id = serializers.IntegerField()
 
     class Meta:
-        model = RTSMError
-        exclude = ['average_spectrum', 'bad_spectrum']
+        model = RTSMErrorSummary
+        fields = '__all__'
 
 
 class RTSMObservationSerializer(serializers.ModelSerializer):
-    errors = RTSMErrorSummarySerializer(many=True)
+    errors_summary = RTSMErrorSummarySerializer(many=True)
 
     class Meta:
         model = RTSMObservation
diff --git a/LCU/Maintenance/DBInterface/monitoringdb/urls.py b/LCU/Maintenance/DBInterface/monitoringdb/urls.py
index dc7315516f2..cde62e231b5 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/urls.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/urls.py
@@ -12,8 +12,8 @@ station_test_router.register(r'^', StationTestViewSet)
 
 rtsm_router = routers.DefaultRouter()
 #RTSM
-rtsm_router.register(r'^errors_detailed', RTSMErrorsDetailedViewSet)
-rtsm_router.register(r'^errors', RTSMErrorsViewSet)
+rtsm_router.register(r'^/errors_detailed', RTSMErrorsDetailedViewSet)
+rtsm_router.register(r'^/errors', RTSMErrorsViewSet)
 rtsm_router.register(r'^', RTSMObservationViewSet)
 
 
diff --git a/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py b/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py
index cdeb154c254..a5d3b02743d 100644
--- a/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py
+++ b/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py
@@ -5,6 +5,7 @@ from ..rtsm_test_raw_parser import parse_rtsm_test
 
 logger = logging.getLogger('views')
 
+
 class RTSMErrorsDetailedViewSet(viewsets.ModelViewSet):
     queryset = RTSMError.objects.all()
     serializer_class = RTSMErrorSerializer
@@ -23,7 +24,7 @@ class RTSMErrorsViewSet(viewsets.ModelViewSet):
     serializer_class = RTSMErrorSummarySerializer
 
     def get_queryset(self):
-        queryset = RTSMError.objects.all()
+        queryset = RTSMError.objects.defer('average_spectrum', 'bad_spectrum').all()
         for key, param in self.request.query_params.items():
             if key in RESERVED_FILTER_NAME:
                 continue
@@ -31,9 +32,8 @@ class RTSMErrorsViewSet(viewsets.ModelViewSet):
         return queryset
 
 
-
 class RTSMObservationViewSet(viewsets.ModelViewSet):
-    queryset = RTSMObservation.objects.all()
+    queryset = RTSMObservation.objects.select_related('errors').defer('errors__average_spectrum', 'errors__bad_spectrum').all()
     serializer_class = RTSMObservationSerializer
 
     def get_queryset(self):
diff --git a/LCU/Maintenance/MDB_tools/cli/probe_mdb.py b/LCU/Maintenance/MDB_tools/cli/probe_mdb.py
index 147e82cdcd9..91cab9071a0 100755
--- a/LCU/Maintenance/MDB_tools/cli/probe_mdb.py
+++ b/LCU/Maintenance/MDB_tools/cli/probe_mdb.py
@@ -56,7 +56,7 @@ def perform_query(query_string, address, next_url=None):
     response = requests.get(full_address)
     logging.info('response acknowledged: status code is %s', response.status_code)
     if response.status_code == 200:
-        parsed_content = json.loads(response.content)
+        parsed_content = response.json()
 
         extracted_content = parsed_content['results']
         next_url = parsed_content['next']
@@ -324,7 +324,7 @@ def print_out_rtsm_summary(rtsm_results):
                                 'component_id', 'error_type', 'start_frequency', 'stop_frequency',
                                 'mode', 'percentage']
 
-        sorted_rtsm = rtsm_sort_errors(rtsm_result['errors'])
+        sorted_rtsm = rtsm_sort_errors(rtsm_result['errors_summary'])
         rtsm_errors = Counter()
         for error in sorted_rtsm:
             rcu_id = error['rcu']
@@ -364,7 +364,7 @@ def print_out_rtsm(rtsm_results):
     for rtsm_result in rtsm_results:
         obs_id = rtsm_result['observation_id']
         station_name = rtsm_result['station_name']
-        for error in rtsm_sort_errors(rtsm_result['errors']):
+        for error in rtsm_sort_errors(rtsm_result['errors_summary']):
             rcu_id = error['rcu']
             start_frequency = error['start_frequency']
             stop_frequency = error['stop_frequency']
-- 
GitLab