diff --git a/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py b/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py index 19c2693950f433561f15fd7c2f389cd07bdb5262..860269b9b9b23b8d8888695f9bd404aa154dc0f2 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/models/rtsm.py @@ -19,19 +19,6 @@ class RTSMObservation(models.Model): samples = models.IntegerField(default=None, null=True) -class RTSMObservationSummary(RTSMObservation): - @property - def errors_found(self): - return RTSMError.objects.defer('spectra'). \ - filter(observation=self).values('error_type', 'mode', 'rcu'). \ - annotate(count=models.Count('error_type', unique=True, output_field=models.FloatField())). \ - annotate(percentage=models.ExpressionWrapper(models.F('count') * 100. / models.F('observation__samples'), - output_field=models.FloatField())) - - class Meta: - proxy = True - - class RTSMError(models.Model): observation = models.ForeignKey(RTSMObservation, related_name='errors', on_delete=models.CASCADE) @@ -58,7 +45,18 @@ class RTSMError(models.Model): self.error_type,) +class RTSMErrorSummary(models.Model): + observation = models.ForeignKey(RTSMObservation, related_name='errors_summary', on_delete=models.CASCADE) + percentage = models.FloatField(default=None, null=True) + rcu = models.SmallIntegerField(default=None, null=True) + mode = models.SmallIntegerField(default=None, null=True) + count = models.IntegerField(default=None, null=True) + error_type = models.CharField(max_length=50) + start_frequency = models.FloatField(default=None, null=True) + stop_frequency = models.FloatField(default=None, null=True) + + class RTSMSpectrum(models.Model): bad_spectrum = ArrayField(models.FloatField()) average_spectrum = ArrayField(models.FloatField()) - rtsm_error = models.ForeignKey(RTSMError, related_name='spectra', on_delete=models.CASCADE) \ No newline at end of file + rtsm_error = models.ForeignKey(RTSMError, related_name='spectra', on_delete=models.CASCADE) diff --git a/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py b/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py index a08a30f76b5666efc37383dba7e3d4a3792767a5..8cddf2b51b544d17f7ec1482e9f7c20ba0808ca4 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/serializers/rtsm.py @@ -9,13 +9,6 @@ from .station import Station logger = logging.getLogger('serializers') -class RTSMErrorsAggregateSerializer(serializers.Serializer): - count = serializers.IntegerField() - percentage = serializers.FloatField() - error_type = serializers.CharField() - rcu = serializers.IntegerField() - - class RTSMSpectrumSerializer(serializers.ModelSerializer): bad_spectrum = serializers.ListField(child=serializers.FloatField()) average_spectrum = serializers.ListField(child=serializers.FloatField()) @@ -26,8 +19,8 @@ class RTSMSpectrumSerializer(serializers.ModelSerializer): class RTSMErrorSerializer(serializers.ModelSerializer): - observation = serializers.PrimaryKeyRelatedField(read_only=True) + def __init__(self, *args, **kwargs): self.Meta.depth = kwargs.pop('depth', 1) super(RTSMErrorSerializer, self).__init__(*args, **kwargs) @@ -37,27 +30,37 @@ class RTSMErrorSerializer(serializers.ModelSerializer): fields = '__all__' -class RTSMObservationSummarySerializer(serializers.ModelSerializer): - errors_found = RTSMErrorsAggregateSerializer(many=True) +class RTSMErrorSummarySerializer(serializers.ModelSerializer): + observation = serializers.PrimaryKeyRelatedField(read_only=True) class Meta: - model = RTSMObservationSummary + model = RTSMErrorSummary fields = '__all__' - depth=1 class RTSMObservationSerializer(serializers.ModelSerializer): errors = RTSMErrorSerializer(many=True, depth=0) + errors_summary = RTSMErrorSummarySerializer(many=True) class Meta: model = RTSMObservation fields = '__all__' + def compute_summary(self, RTSMObservation_entry): + summary_entries = RTSMObservation_entry.errors.defer('spectra'). \ + filter(observation=RTSMObservation_entry).values('error_type', 'mode', 'rcu', 'start_frequency', + 'stop_frequency'). \ + annotate(count=models.Count('error_type', unique=True, output_field=models.FloatField())). \ + annotate(percentage=models.ExpressionWrapper(models.F('count') * 100. / models.F('observation__samples'), + output_field=models.FloatField())) + for summary_entry in summary_entries: + RTSMErrorSummary(observation=RTSMObservation_entry, **summary_entry).save() + @atomic def create(self, validated_data): rtsm_errors = validated_data.pop('errors') - # derive the station type from the station name + # derive the station type from the station name station_name = validated_data.pop('station_name') station_type = station_name[0].capitalize() station_type = station_type if station_type in ['C', 'R'] else 'I' @@ -85,16 +88,15 @@ class RTSMObservationSerializer(serializers.ModelSerializer): average_spectrum = rtsm_error.pop('average_spectrum') bad_spectrum = rtsm_error.pop('bad_spectrum') - rtsm_error_instance = RTSMError.objects.create(**rtsm_error) rtsm_error_instance.save() ActionLogSerializer.log_model_insert(rtsm_error_instance) rtsm_spectrum_instance = RTSMSpectrum.objects.create(average_spectrum=average_spectrum, - bad_spectrum=bad_spectrum, - rtsm_error=rtsm_error_instance) + bad_spectrum=bad_spectrum, + rtsm_error=rtsm_error_instance) rtsm_spectrum_instance.save() - ActionLogSerializer.log_model_insert(rtsm_spectrum_instance) + self.compute_summary(RTSMObservation_instance) return RTSMObservation_instance diff --git a/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py b/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py index 8459d523e71e9c9105b7274b90d683d748a59d9c..5e0a2560ff7ca59bd3bd6d5f677de7789d38b363 100644 --- a/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py +++ b/LCU/Maintenance/DBInterface/monitoringdb/views/rtsm_views.py @@ -1,7 +1,7 @@ from .common import * -from ..models.rtsm import RTSMObservation, RTSMError, RTSMSpectrum, RTSMObservationSummary -from ..serializers.rtsm import RTSMObservationSerializer, RTSMErrorSerializer,\ - RTSMObservationSummarySerializer, RTSMSpectrumSerializer +from ..models.rtsm import RTSMObservation, RTSMError, RTSMSpectrum +from ..serializers.rtsm import RTSMObservationSerializer, RTSMErrorSerializer, \ + RTSMSpectrumSerializer from ..rtsm_test_raw_parser import parse_rtsm_test logger = logging.getLogger('views') @@ -12,12 +12,6 @@ class RTSMSpectrumViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = RTSMSpectrumSerializer filter_fields = ['rtsm_error'] -class RTSMErrorsDetailedViewSet(viewsets.ReadOnlyModelViewSet): - queryset = RTSMError.objects.all() - serializer_class = RTSMErrorSerializer - filter_fields = '__all__' - - class RTSMErrorsViewSet(viewsets.ReadOnlyModelViewSet): queryset = RTSMError.objects.all() @@ -25,19 +19,12 @@ class RTSMErrorsViewSet(viewsets.ReadOnlyModelViewSet): filter_fields = '__all__' - class RTSMObservationViewSet(viewsets.ReadOnlyModelViewSet): queryset = RTSMObservation.objects.all() serializer_class = RTSMObservationSerializer filter_fields = '__all__' -class RTSMObservationSummaryViewSet(viewsets.ReadOnlyModelViewSet): - queryset = RTSMObservationSummary.objects.all() - serializer_class = RTSMObservationSummarySerializer - filter_fields = '__all__' - - @api_view(['POST']) def insert_raw_rtsm_test(request): """ @@ -61,8 +48,8 @@ def insert_raw_rtsm_test(request): entry.update(station_name=station_name) logger.info('RTSM parsed successfully for obsid %d and station %s', - entry['observation_id'], - entry['station_name']) + entry['observation_id'], + entry['station_name']) try: rtsm_item = RTSMObservationSerializer().create(dict(entry)) @@ -84,7 +71,7 @@ def insert_raw_rtsm_test(request): return Response(exception=True, data="the post message is not correct." + " It has to be of the form {content:[RAWSTRING], station_name:[STATION_NAME]}: %s. Request provided %s" % ( - e, request), + e, request), status=status.HTTP_400_BAD_REQUEST) else: return Response(exception=True,