2019-07-12 20:36:18 -06:00
|
|
|
"""SatNOGS DB API serializers, django rest framework"""
|
2019-07-17 07:23:02 -06:00
|
|
|
# pylint: disable=R0201
|
2019-06-30 14:52:45 -06:00
|
|
|
|
2020-05-20 10:30:10 -06:00
|
|
|
import h5py
|
2019-05-09 11:49:10 -06:00
|
|
|
from rest_framework import serializers
|
|
|
|
|
2020-05-20 10:30:10 -06:00
|
|
|
from db.base.models import TRANSMITTER_STATUS, Artifact, DemodData, Mode, \
|
2020-08-03 05:21:58 -06:00
|
|
|
Satellite, Telemetry, Tle, Transmitter
|
2015-04-22 05:05:30 -06:00
|
|
|
|
2015-08-13 06:57:04 -06:00
|
|
|
|
|
|
|
class ModeSerializer(serializers.ModelSerializer):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""SatNOGS DB Mode API Serializer"""
|
2015-08-13 06:57:04 -06:00
|
|
|
class Meta:
|
|
|
|
model = Mode
|
|
|
|
fields = ('id', 'name')
|
2015-05-03 15:23:07 -06:00
|
|
|
|
|
|
|
|
2019-10-19 12:12:24 -06:00
|
|
|
class SatTelemetrySerializer(serializers.ModelSerializer):
|
|
|
|
"""SatNOGS DB satellite telemetry API Serializer"""
|
|
|
|
class Meta:
|
|
|
|
model = Telemetry
|
|
|
|
fields = ['decoder']
|
|
|
|
|
|
|
|
|
2015-05-03 15:23:07 -06:00
|
|
|
class SatelliteSerializer(serializers.ModelSerializer):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""SatNOGS DB Satellite API Serializer"""
|
2019-07-12 20:38:53 -06:00
|
|
|
|
2019-10-19 12:12:24 -06:00
|
|
|
telemetries = SatTelemetrySerializer(many=True, read_only=True)
|
2020-07-26 08:28:49 -06:00
|
|
|
countries = serializers.SerializerMethodField()
|
|
|
|
operator = serializers.SerializerMethodField()
|
2019-10-19 12:12:24 -06:00
|
|
|
|
2015-05-03 15:23:07 -06:00
|
|
|
class Meta:
|
|
|
|
model = Satellite
|
2020-07-26 08:28:49 -06:00
|
|
|
fields = (
|
|
|
|
'norad_cat_id', 'name', 'names', 'image', 'status', 'decayed', 'launched', 'deployed',
|
|
|
|
'website', 'operator', 'countries', 'telemetries'
|
|
|
|
)
|
|
|
|
|
|
|
|
def get_operator(self, obj):
|
|
|
|
"""Returns operator text"""
|
|
|
|
return str(obj.operator)
|
|
|
|
|
|
|
|
def get_countries(self, obj):
|
|
|
|
"""Returns countires"""
|
|
|
|
return ','.join(map(str, obj.countries))
|
2015-04-22 05:05:30 -06:00
|
|
|
|
|
|
|
|
2015-07-23 06:48:58 -06:00
|
|
|
class TransmitterSerializer(serializers.ModelSerializer):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""SatNOGS DB Transmitter API Serializer"""
|
2015-05-09 03:52:24 -06:00
|
|
|
norad_cat_id = serializers.SerializerMethodField()
|
2019-04-04 21:46:30 -06:00
|
|
|
mode = serializers.SerializerMethodField()
|
2019-11-09 03:09:41 -07:00
|
|
|
mode_id = serializers.SerializerMethodField()
|
|
|
|
uplink_mode = serializers.SerializerMethodField()
|
2019-04-04 21:46:30 -06:00
|
|
|
alive = serializers.SerializerMethodField()
|
|
|
|
updated = serializers.DateTimeField(source='created')
|
2015-05-07 02:28:03 -06:00
|
|
|
|
2015-04-22 05:05:30 -06:00
|
|
|
class Meta:
|
2015-07-23 06:48:58 -06:00
|
|
|
model = Transmitter
|
2019-04-27 03:04:49 -06:00
|
|
|
fields = (
|
|
|
|
'uuid', 'description', 'alive', 'type', 'uplink_low', 'uplink_high', 'uplink_drift',
|
2019-11-09 03:09:41 -07:00
|
|
|
'downlink_low', 'downlink_high', 'downlink_drift', 'mode', 'mode_id', 'uplink_mode',
|
2020-09-06 09:21:43 -06:00
|
|
|
'invert', 'baud', 'norad_cat_id', 'status', 'updated', 'citation', 'service',
|
|
|
|
'coordination', 'coordination_url'
|
2019-04-27 03:04:49 -06:00
|
|
|
)
|
2019-04-04 21:46:30 -06:00
|
|
|
|
|
|
|
# Keeping alive field for compatibility issues
|
|
|
|
def get_alive(self, obj):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""Returns transmitter status"""
|
2019-04-04 21:46:30 -06:00
|
|
|
return obj.status == TRANSMITTER_STATUS[0]
|
2015-05-07 02:28:03 -06:00
|
|
|
|
2015-08-14 07:57:39 -06:00
|
|
|
def get_mode_id(self, obj):
|
2019-11-09 03:09:41 -07:00
|
|
|
"""Returns downlink mode id"""
|
2020-09-06 09:21:43 -06:00
|
|
|
try:
|
|
|
|
return obj.downlink_mode.id
|
|
|
|
except AttributeError: # rare chance that this happens in prod
|
|
|
|
return None
|
2019-11-09 03:09:41 -07:00
|
|
|
|
|
|
|
def get_mode(self, obj):
|
|
|
|
"""Returns downlink mode name"""
|
2015-08-14 07:57:39 -06:00
|
|
|
try:
|
2019-11-09 03:09:41 -07:00
|
|
|
return obj.downlink_mode.name
|
2019-07-17 07:23:02 -06:00
|
|
|
except Exception: # pylint: disable=W0703
|
2015-09-17 07:01:41 -06:00
|
|
|
return None
|
2015-08-14 07:57:39 -06:00
|
|
|
|
2019-11-09 03:09:41 -07:00
|
|
|
def get_uplink_mode(self, obj):
|
|
|
|
"""Returns uplink mode name"""
|
2019-04-04 21:46:30 -06:00
|
|
|
try:
|
2019-11-09 03:09:41 -07:00
|
|
|
return obj.uplink_mode.name
|
2019-07-17 07:23:02 -06:00
|
|
|
except Exception: # pylint: disable=W0703
|
2019-04-04 21:46:30 -06:00
|
|
|
return None
|
|
|
|
|
2015-05-09 03:52:24 -06:00
|
|
|
def get_norad_cat_id(self, obj):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""Returns Satellite NORAD ID"""
|
2015-05-07 02:28:03 -06:00
|
|
|
return obj.satellite.norad_cat_id
|
2016-05-08 09:44:22 -06:00
|
|
|
|
|
|
|
|
2020-08-03 05:21:58 -06:00
|
|
|
class TleSerializer(serializers.ModelSerializer):
|
|
|
|
"""SatNOGS DB Tle API Serializer"""
|
|
|
|
|
|
|
|
norad_cat_id = serializers.SerializerMethodField()
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Tle
|
|
|
|
fields = ('tle0', 'tle1', 'tle2', 'tle_source', 'norad_cat_id', 'updated')
|
|
|
|
|
|
|
|
def get_norad_cat_id(self, obj):
|
|
|
|
"""Returns Satellite NORAD ID"""
|
|
|
|
return obj.satellite.norad_cat_id
|
|
|
|
|
|
|
|
|
2016-05-08 09:44:22 -06:00
|
|
|
class TelemetrySerializer(serializers.ModelSerializer):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""SatNOGS DB Telemetry API Serializer"""
|
2016-05-08 09:44:22 -06:00
|
|
|
norad_cat_id = serializers.SerializerMethodField()
|
2017-03-28 11:39:53 -06:00
|
|
|
transmitter = serializers.SerializerMethodField()
|
|
|
|
schema = serializers.SerializerMethodField()
|
|
|
|
decoded = serializers.SerializerMethodField()
|
|
|
|
frame = serializers.SerializerMethodField()
|
2016-05-08 09:44:22 -06:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = DemodData
|
2019-04-27 03:04:49 -06:00
|
|
|
fields = (
|
|
|
|
'norad_cat_id', 'transmitter', 'app_source', 'schema', 'decoded', 'frame', 'observer',
|
|
|
|
'timestamp'
|
|
|
|
)
|
2016-05-08 09:44:22 -06:00
|
|
|
|
|
|
|
def get_norad_cat_id(self, obj):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""Returns Satellite NORAD ID for this Transmitter"""
|
2017-03-02 10:55:10 -07:00
|
|
|
return obj.satellite.norad_cat_id
|
2016-05-08 09:44:22 -06:00
|
|
|
|
2017-03-28 11:39:53 -06:00
|
|
|
def get_transmitter(self, obj):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""Returns Transmitter UUID"""
|
2017-03-28 11:39:53 -06:00
|
|
|
try:
|
|
|
|
return obj.transmitter.uuid
|
2019-07-17 07:23:02 -06:00
|
|
|
except Exception: # pylint: disable=W0703
|
2017-03-28 11:39:53 -06:00
|
|
|
return ''
|
|
|
|
|
|
|
|
def get_schema(self, obj):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""Returns Transmitter telemetry schema"""
|
2017-03-02 10:55:10 -07:00
|
|
|
try:
|
|
|
|
return obj.payload_telemetry.schema
|
2019-07-17 07:23:02 -06:00
|
|
|
except Exception: # pylint: disable=W0703
|
2017-03-02 10:55:10 -07:00
|
|
|
return ''
|
2016-05-08 09:44:22 -06:00
|
|
|
|
2017-03-28 11:39:53 -06:00
|
|
|
def get_decoded(self, obj):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""Returns the payload_decoded field"""
|
2017-03-02 10:55:10 -07:00
|
|
|
return obj.payload_decoded
|
|
|
|
|
2017-03-28 11:39:53 -06:00
|
|
|
def get_frame(self, obj):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""Returns the payload frame"""
|
2017-03-28 11:39:53 -06:00
|
|
|
return obj.display_frame()
|
|
|
|
|
2017-03-02 10:55:10 -07:00
|
|
|
|
|
|
|
class SidsSerializer(serializers.ModelSerializer):
|
2019-07-12 20:36:18 -06:00
|
|
|
"""SatNOGS DB SiDS API Serializer"""
|
2017-03-02 10:55:10 -07:00
|
|
|
class Meta:
|
|
|
|
model = DemodData
|
2019-04-27 03:04:49 -06:00
|
|
|
fields = ('satellite', 'payload_frame', 'station', 'lat', 'lng', 'timestamp', 'app_source')
|
2020-05-20 10:30:10 -06:00
|
|
|
|
|
|
|
|
|
|
|
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', )
|