1
0
Fork 0
satnogs-db/db/api/serializers.py

157 lines
4.9 KiB
Python

"""SatNOGS DB API serializers, django rest framework"""
# pylint: disable=R0201
import h5py
from rest_framework import serializers
from db.base.models import TRANSMITTER_STATUS, Artifact, DemodData, Mode, \
Satellite, Telemetry, Transmitter
class ModeSerializer(serializers.ModelSerializer):
"""SatNOGS DB Mode API Serializer"""
class Meta:
model = Mode
fields = ('id', 'name')
class SatTelemetrySerializer(serializers.ModelSerializer):
"""SatNOGS DB satellite telemetry API Serializer"""
class Meta:
model = Telemetry
fields = ['decoder']
class SatelliteSerializer(serializers.ModelSerializer):
"""SatNOGS DB Satellite API Serializer"""
telemetries = SatTelemetrySerializer(many=True, read_only=True)
class Meta:
model = Satellite
fields = ('norad_cat_id', 'name', 'names', 'image', 'status', 'decayed', 'telemetries')
class TransmitterSerializer(serializers.ModelSerializer):
"""SatNOGS DB Transmitter API Serializer"""
norad_cat_id = serializers.SerializerMethodField()
mode = serializers.SerializerMethodField()
mode_id = serializers.SerializerMethodField()
uplink_mode = serializers.SerializerMethodField()
alive = serializers.SerializerMethodField()
updated = serializers.DateTimeField(source='created')
class Meta:
model = Transmitter
fields = (
'uuid', 'description', 'alive', 'type', 'uplink_low', 'uplink_high', 'uplink_drift',
'downlink_low', 'downlink_high', 'downlink_drift', 'mode', 'mode_id', 'uplink_mode',
'invert', 'baud', 'norad_cat_id', 'status', 'updated', 'citation', 'service'
)
# Keeping alive field for compatibility issues
def get_alive(self, obj):
"""Returns transmitter status"""
return obj.status == TRANSMITTER_STATUS[0]
def get_mode_id(self, obj):
"""Returns downlink mode id"""
return obj.downlink_mode.id
def get_mode(self, obj):
"""Returns downlink mode name"""
try:
return obj.downlink_mode.name
except Exception: # pylint: disable=W0703
return None
def get_uplink_mode(self, obj):
"""Returns uplink mode name"""
try:
return obj.uplink_mode.name
except Exception: # pylint: disable=W0703
return None
def get_norad_cat_id(self, obj):
"""Returns Satellite NORAD ID"""
return obj.satellite.norad_cat_id
class TelemetrySerializer(serializers.ModelSerializer):
"""SatNOGS DB Telemetry API Serializer"""
norad_cat_id = serializers.SerializerMethodField()
transmitter = serializers.SerializerMethodField()
schema = serializers.SerializerMethodField()
decoded = serializers.SerializerMethodField()
frame = serializers.SerializerMethodField()
class Meta:
model = DemodData
fields = (
'norad_cat_id', 'transmitter', 'app_source', 'schema', 'decoded', 'frame', 'observer',
'timestamp'
)
def get_norad_cat_id(self, obj):
"""Returns Satellite NORAD ID for this Transmitter"""
return obj.satellite.norad_cat_id
def get_transmitter(self, obj):
"""Returns Transmitter UUID"""
try:
return obj.transmitter.uuid
except Exception: # pylint: disable=W0703
return ''
def get_schema(self, obj):
"""Returns Transmitter telemetry schema"""
try:
return obj.payload_telemetry.schema
except Exception: # pylint: disable=W0703
return ''
def get_decoded(self, obj):
"""Returns the payload_decoded field"""
return obj.payload_decoded
def get_frame(self, obj):
"""Returns the payload frame"""
return obj.display_frame()
class SidsSerializer(serializers.ModelSerializer):
"""SatNOGS DB SiDS API Serializer"""
class Meta:
model = DemodData
fields = ('satellite', 'payload_frame', 'station', 'lat', 'lng', 'timestamp', 'app_source')
class ArtifactSerializer(serializers.ModelSerializer):
"""SatNOGS DB Artifacts API Serializer"""
class Meta:
model = Artifact
fields = ('id', 'network_obs_id', 'artifact_file')
class NewArtifactSerializer(serializers.ModelSerializer):
"""SatNOGS Network New Artifact API Serializer"""
def validate(self, attrs):
"""Validates data of incoming artifact"""
try:
with h5py.File(self.initial_data['artifact_file'], 'r') as h5_file:
if 'artifact_version' not in h5_file.attrs:
raise serializers.ValidationError(
'Not a valid SatNOGS Artifact.', code='invalid'
)
except OSError as error:
raise serializers.ValidationError(
'Not a valid HDF5 file: {}'.format(error), code='invalid'
)
return attrs
class Meta:
model = Artifact
fields = ('artifact_file', )