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 language: python
dist: trusty dist: trusty
notifications:
email: false
python: python:
- "2.7" - "2.7"
install: install:

View File

@ -37,25 +37,37 @@ class TransmitterSerializer(serializers.ModelSerializer):
class TelemetrySerializer(serializers.ModelSerializer): class TelemetrySerializer(serializers.ModelSerializer):
norad_cat_id = serializers.SerializerMethodField() norad_cat_id = serializers.SerializerMethodField()
appendix = serializers.SerializerMethodField() transmitter = serializers.SerializerMethodField()
telemetry = serializers.SerializerMethodField() schema = serializers.SerializerMethodField()
decoded = serializers.SerializerMethodField()
frame = serializers.SerializerMethodField()
class Meta: class Meta:
model = DemodData 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): def get_norad_cat_id(self, obj):
return obj.satellite.norad_cat_id 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: try:
return obj.payload_telemetry.schema return obj.payload_telemetry.schema
except: except:
return '' return ''
def get_telemetry(self, obj): def get_decoded(self, obj):
return obj.payload_decoded return obj.payload_decoded
def get_frame(self, obj):
return obj.display_frame()
class SidsSerializer(serializers.ModelSerializer): class SidsSerializer(serializers.ModelSerializer):
class Meta: class Meta:

View File

@ -3,7 +3,7 @@ import pytest
from rest_framework import status from rest_framework import status
from django.test import TestCase 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) @pytest.mark.django_db(transaction=True)
@ -22,7 +22,8 @@ class ModeViewApiTest(TestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_retrieve(self): 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) self.assertContains(response, self.mode.name)
@ -42,7 +43,8 @@ class SatelliteViewApiTest(TestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_retrieve(self): 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) self.assertContains(response, self.satellite.name)
@ -63,5 +65,26 @@ class TransmitterViewApiTest(TestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_retrieve(self): 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) 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): def __unicode__(self):
return 'data-for-{0}'.format(self.satellite.norad_cat_id) 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) 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) source = fuzzy.FuzzyChoice(choices=DATA_SOURCE_IDS)
data_id = fuzzy.FuzzyInteger(0, 200) data_id = fuzzy.FuzzyInteger(0, 200)
payload_frame = factory.django.FileField(filename='data.raw') payload_frame = factory.django.FileField(filename='data.raw')
payload_decoded = None payload_decoded = '{}'
payload_telemetry = None payload_telemetry = factory.SubFactory(TelemetryFactory)
station = fuzzy.FuzzyText() station = fuzzy.FuzzyText()
lat = fuzzy.FuzzyFloat(-20, 70) lat = fuzzy.FuzzyFloat(-20, 70)
lng = fuzzy.FuzzyFloat(-180, 180) lng = fuzzy.FuzzyFloat(-180, 180)

View File

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