From 04f4e3325c8145e0d39a925f30b85aa3995e497c Mon Sep 17 00:00:00 2001 From: Mattia Mancini <mancini@astron.nl> Date: Wed, 10 Oct 2018 13:53:24 +0000 Subject: [PATCH] OSB-28: moved the code to process the station test into the serializers --- .../serializers/component_error.py | 53 ++++++++++++++++- .../monitoringdb/serializers/element.py | 10 ++++ .../monitoringdb/serializers/element_error.py | 58 ++++++++++++++++++- .../monitoringdb/serializers/station_tests.py | 46 ++++++++++++++- 4 files changed, 162 insertions(+), 5 deletions(-) diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/component_error.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/component_error.py index 9e4129617a0..3233b4df572 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/serializers/component_error.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/component_error.py @@ -1,6 +1,12 @@ +import logging + from rest_framework.serializers import PrimaryKeyRelatedField, CharField, IntegerField -from ..models.component_error import ComponentError + from .utils import NotNullModelSerializer +from ..models.component import Component +from ..models.component_error import ComponentError + +logger = logging.getLogger(__name__) class ComponentErrorSerializer(NotNullModelSerializer): @@ -16,3 +22,48 @@ class ComponentErrorSerializer(NotNullModelSerializer): def __init__(self, *args, **kwargs): self.Meta.depth = kwargs.pop('depth', 2) super(ComponentErrorSerializer, self).__init__(*args, **kwargs) + + @staticmethod + def insert_component_error(station_test_entry, + station_entry, + component_error): + + component = component_error.pop('component') + + component_entry = Component.objects.filter(station=station_entry, + **component).first() + if component_entry is None: + logger.debug('Component entry is not present, inserting ...') + component_entry = Component(station=station_entry, + **component) + logger.debug(component_entry, component_error) + component_entry.save() + + component_error_entry = ComponentError.objects.filter(component=component_entry, + station_test=station_test_entry, + **component_error).first() + if component_error_entry is None: + logger.debug('Component error entry is not present, inserting ...') + + component_error_entry = ComponentError(component=component_entry, + station_test=station_test_entry, + **component_error) + component_error_entry.save() + return component_error_entry + + @staticmethod + def insert_component_errors(station_test_entry, + station_entry, + component_errors): + results = [] + for component_error in component_errors: + try: + results.append(ComponentErrorSerializer.insert_component_error( + station_test_entry, station_entry, component_error)) + except Exception as e: + logger.exception( + 'Cannot insert component error %s' + ' for station_test_entry %s and station_entry %s: %s', + component_error, station_test_entry, station_entry) + raise e + return results diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/element.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/element.py index 61dbbd28835..36e27d6949c 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/serializers/element.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/element.py @@ -7,3 +7,13 @@ class ElementSerializer(ModelSerializer): model = Element fields = '__all__' depth = 1 + + @staticmethod + def insert_element(component, element): + element_entry = Element.objects.filter(component=component, + **element).first() + if element_entry is None: + element_entry = Element(component=component, + **element) + element_entry.save() + return element_entry \ No newline at end of file diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/element_error.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/element_error.py index 787277e8245..3fe497f3703 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/serializers/element_error.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/element_error.py @@ -1,10 +1,62 @@ from rest_framework.serializers import ModelSerializer + +from .component_error import ComponentErrorSerializer +from .element import ElementSerializer from ..models.element_error import ElementError -from .error_details import ErrorDetailsSerializer +import logging + + +logger = logging.getLogger(__name__) -class ElementErrorSerializer(ModelSerializer): +class ElementErrorSerializer(ModelSerializer): class Meta: model = ElementError fields = '__all__' - depth = 1 \ No newline at end of file + depth = 1 + + @staticmethod + def insert_element_error(station_test_entry, + station_entry, + element_error): + component_error = element_error.pop('component_error') + + component_error_entry = ComponentErrorSerializer(station_test_entry, + station_entry, + component_error) + component = component_error_entry.component + + element = element_error.pop('element') + element_error_details = element_error.pop('details') + + element_entry = ElementSerializer.insert_element(component, element) + + element_error_entry = ElementError.objects.filter(element=element_entry, + component_error=component_error_entry, + **element_error).first() + if element_error_entry is None: + element_error_entry = ElementError(element=element_entry, + details=element_error_details, + component_error=component_error_entry, + **element_error) + + element_error_entry.save() + + return element_error_entry + + @staticmethod + def insert_element_errors(station_test_entry, + station_entry, + element_errors): + results = [] + for element_error in element_errors: + try: + results.append(ElementErrorSerializer.insert_element_error(station_test_entry, + station_entry, + element_error)) + except Exception as e: + logger.exception( + 'Cannot insert element error %s' + ' for station_test_entry %s and station_entry %s: %s', + element_error, station_test_entry, station_entry) + raise e diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/station_tests.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/station_tests.py index 6b5246a94f4..525d6331c9f 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/serializers/station_tests.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/station_tests.py @@ -1,10 +1,54 @@ from rest_framework.serializers import ModelSerializer from ..models.station_test import StationTest +from ..models.station import Station from .component_error import ComponentErrorSerializer +from .element_error import ElementErrorSerializer + +import logging + +logger = logging.getLogger(__name__) class StationTestSerializer(ModelSerializer): component_errors = ComponentErrorSerializer(many=True, read_only=True, depth=0) class Meta: model = StationTest fields = '__all__' - depth = 2 \ No newline at end of file + depth = 2 + + @staticmethod + def insert_station_test(station_test): + """ + Insert the station test in the database and if necessary the component errors + and the element errors + :param station_test: json representation of the station test + :type station_test: dict + :return: the station test entry inserted + :rtype: StationTest + """ + station = station_test.pop('station') + component_errors = station_test.pop('component_errors') + element_errors = station_test.pop('element_errors') + station_entry = Station.objects.filter(**station).first() + + if station_entry is None: + logger.debug('Station is not present, inserting ...') + station_entry = Station(**station) + station_entry.save() + + station_test_entry = StationTest.objects.filter(**station_test).first() + if station_test_entry is None: + logger.debug('Station test is not present, inserting ...') + station_test_entry = StationTest(station=station_entry, + **station_test) + station_test_entry.save() + + ComponentErrorSerializer.insert_component_errors(station_test_entry, + station_entry, + component_errors) + + ElementErrorSerializer.insert_element_errors(station_test_entry, + station_entry, + element_errors) + + return station_test_entry + -- GitLab