1
0
Fork 0

Expose more fields to Telemetry API endpoint

* Rename decoded API fields for clarity
merge-requests/154/head
Nikos Roussos 2017-03-28 20:39:53 +03:00
parent 12ce623f47
commit 7c7115f9be
No known key found for this signature in database
GPG Key ID: BADFF1767BA7C8E1
6 changed files with 64 additions and 23 deletions

View File

@ -1,5 +1,7 @@
language: python
dist: trusty
notifications:
email: false
python:
- "2.7"
install:

View File

@ -37,25 +37,37 @@ class TransmitterSerializer(serializers.ModelSerializer):
class TelemetrySerializer(serializers.ModelSerializer):
norad_cat_id = serializers.SerializerMethodField()
appendix = serializers.SerializerMethodField()
telemetry = serializers.SerializerMethodField()
transmitter = serializers.SerializerMethodField()
schema = serializers.SerializerMethodField()
decoded = serializers.SerializerMethodField()
frame = serializers.SerializerMethodField()
class Meta:
model = DemodData
fields = ('norad_cat_id', 'appendix', 'telemetry')
fields = ('norad_cat_id', 'transmitter', 'source', 'schema', 'decoded', 'frame',
'observer', 'timestamp')
def get_norad_cat_id(self, obj):
return obj.satellite.norad_cat_id
def get_appendix(self, obj):
def get_transmitter(self, obj):
try:
return obj.transmitter.uuid
except:
return ''
def get_schema(self, obj):
try:
return obj.payload_telemetry.schema
except:
return ''
def get_telemetry(self, obj):
def get_decoded(self, obj):
return obj.payload_decoded
def get_frame(self, obj):
return obj.display_frame()
class SidsSerializer(serializers.ModelSerializer):
class Meta:

View File

@ -3,7 +3,7 @@ import pytest
from rest_framework import status
from django.test import TestCase
from db.base.tests import ModeFactory, SatelliteFactory, TransmitterFactory
from db.base.tests import ModeFactory, SatelliteFactory, TransmitterFactory, DemodDataFactory
@pytest.mark.django_db(transaction=True)
@ -22,7 +22,8 @@ class ModeViewApiTest(TestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_retrieve(self):
response = self.client.get('/api/modes/%s/' % self.mode.id)
response = self.client.get('/api/modes/{0}/'.format(self.mode.id),
format='json')
self.assertContains(response, self.mode.name)
@ -42,7 +43,8 @@ class SatelliteViewApiTest(TestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_retrieve(self):
response = self.client.get('/api/satellites/%s/' % self.satellite.norad_cat_id)
response = self.client.get('/api/satellites/{0}/'.format(self.satellite.norad_cat_id),
format='json')
self.assertContains(response, self.satellite.name)
@ -63,5 +65,26 @@ class TransmitterViewApiTest(TestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_retrieve(self):
response = self.client.get('/api/transmitters/%s/' % self.transmitter.uuid)
response = self.client.get('/api/transmitters/{0}/'.format(self.transmitter.uuid),
format='json')
self.assertContains(response, self.transmitter.description)
@pytest.mark.django_db(transaction=True)
class TelemetryViewApiTest(TestCase):
"""
Tests the Telemetry View API
"""
datum = None
def setUp(self):
self.datum = DemodDataFactory()
self.datum.save()
def test_list(self):
response = self.client.get('/api/telemetry/', format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_retrieve(self):
response = self.client.get('/api/telemetry/{0}/'.format(self.datum.id), format='json')
self.assertContains(response, self.datum.observer)

View File

@ -176,5 +176,9 @@ class DemodData(models.Model):
def __unicode__(self):
return 'data-for-{0}'.format(self.satellite.norad_cat_id)
def display_frame(self):
with open(self.payload_frame.path) as fp:
return fp.read()
post_save.connect(_gen_observer, sender=DemodData)

View File

@ -105,8 +105,8 @@ class DemodDataFactory(factory.django.DjangoModelFactory):
source = fuzzy.FuzzyChoice(choices=DATA_SOURCE_IDS)
data_id = fuzzy.FuzzyInteger(0, 200)
payload_frame = factory.django.FileField(filename='data.raw')
payload_decoded = None
payload_telemetry = None
payload_decoded = '{}'
payload_telemetry = factory.SubFactory(TelemetryFactory)
station = fuzzy.FuzzyText()
lat = fuzzy.FuzzyFloat(-20, 70)
lng = fuzzy.FuzzyFloat(-180, 180)

View File

@ -23,7 +23,7 @@ d3.lineChart = function(telemetry_key, unit) {
var x1 = d3.scale.ordinal()
.domain(_data.map(function(d){
return parseDate(d.telemetry.observation_datetime);
return parseDate(d.decoded.observation_datetime);
}))
.rangePoints([0, chartW]);
@ -32,13 +32,13 @@ d3.lineChart = function(telemetry_key, unit) {
switch(_data.length) {
case 1:
y1 = d3.scale.linear()
.domain([0, d3.max(_data, function(d){ return +d.telemetry.damod_data[telemetry_key]; })])
.domain([0, d3.max(_data, function(d){ return +d.decoded.damod_data[telemetry_key]; })])
.range([chartH, 0])
.nice(4);
break;
default:
y1 = d3.scale.linear()
.domain(d3.extent(_data, function(d){ return +d.telemetry.damod_data[telemetry_key]; }))
.domain(d3.extent(_data, function(d){ return +d.decoded.damod_data[telemetry_key]; }))
.range([chartH, 0])
.nice(4);
}
@ -102,13 +102,13 @@ d3.lineChart = function(telemetry_key, unit) {
.enter().append('circle')
.attr('r', 4)
.attr('cx', function() { return chartW / 2 + config.margin.left; })
.attr('cy', function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; })
.attr('cy', function(d) { return y1(d.decoded.damod_data[telemetry_key]) + config.margin.top; })
.attr('class', 'circle')
.on('mouseover', function(d) {
div.transition()
.duration(200)
.style('opacity', 1);
div.html(d.telemetry.damod_data[telemetry_key] + ' (' + unit + ')')
div.html(d.decoded.damod_data[telemetry_key] + ' (' + unit + ')')
.style('left', (d3.event.pageX) + 'px')
.style('top', (d3.event.pageY - 26) + 'px');
})
@ -124,7 +124,7 @@ d3.lineChart = function(telemetry_key, unit) {
// Define the line
var valueline = d3.svg.line()
.x(function(d,i) { return (xInterval*i + config.margin.left); })
.y(function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; });
.y(function(d) { return y1(d.decoded.damod_data[telemetry_key]) + config.margin.top; });
// Add the valueline path
svg.append('path')
@ -137,13 +137,13 @@ d3.lineChart = function(telemetry_key, unit) {
.enter().append('circle')
.attr('r', 4)
.attr('cx', function(d, i) { return xInterval*i + config.margin.left; })
.attr('cy', function(d) { return y1(d.telemetry.damod_data[telemetry_key]) + config.margin.top; })
.attr('cy', function(d) { return y1(d.decoded.damod_data[telemetry_key]) + config.margin.top; })
.attr('class', 'circle')
.on('mouseover', function(d) {
div.transition()
.duration(200)
.style('opacity', 1);
div.html(d.telemetry.damod_data[telemetry_key] + ' (' + unit + ')')
div.html(d.decoded.damod_data[telemetry_key] + ' (' + unit + ')')
.style('left', (d3.event.pageX) + 'px')
.style('top', (d3.event.pageY - 26) + 'px');
})
@ -197,18 +197,18 @@ if (has_telemetry_data) {
var TelemetryDescriptors = TelemetryCollection.extend({
parse: function(response){
if(response.length !== 0) {
return response[0].appendix;
return response[0].schema;
}
}
});
var TelemetryValues = TelemetryCollection.extend({
comparator: function(collection){
return( collection.get('telemetry').observation_datetime );
return( collection.get('decoded').observation_datetime );
},
byDate: function (start_date, end_date) {
var filtered = this.filter(function (model) {
var date = parseDateFilter(model.get('telemetry').observation_datetime);
var date = parseDateFilter(model.get('decoded').observation_datetime);
return ( date >= start_date && date <= end_date );
});
return new TelemetryValues(filtered);
@ -252,7 +252,7 @@ if (has_telemetry_data) {
var data = this.collection.toJSON();
this.chartSelection = d3.select(this.el)
.datum(data)
.call(d3.lineChart(data[0].appendix[0].key, data[0].appendix[0].unit));
.call(d3.lineChart(data[0].schema[0].key, data[0].schema[0].unit));
} else {
this.renderPlaceholder();
}