1
0
Fork 0

Add Station API to network.satnogs.org

environments/stage/deployments/108^2
Cory Levinson 2018-04-01 11:52:20 +00:00 committed by Nikos Roussos
parent 2b2f6726b1
commit fbe246ea26
7 changed files with 110 additions and 1 deletions

1
.gitignore vendored
View File

@ -13,6 +13,7 @@ pip-log.txt
.coverage
.tox
nosetests.xml
.pytest_cache
# Sqlite
*.db

View File

@ -59,6 +59,46 @@ class ObservationSerializer(serializers.ModelSerializer):
return None
class StationSerializer(serializers.ModelSerializer):
antenna = serializers.SerializerMethodField()
altitude = serializers.SerializerMethodField()
min_horizon = serializers.SerializerMethodField()
observations = serializers.SerializerMethodField()
status = serializers.SerializerMethodField()
class Meta:
model = Station
fields = ('id', 'name', 'altitude', 'min_horizon', 'lat', 'lng',
'qthlocator', 'location', 'antenna', 'created', 'last_seen',
'status', 'observations', 'description')
def get_altitude(self, obj):
return obj.alt
def get_min_horizon(self, obj):
return obj.horizon
def get_antenna(self, obj):
def antenna_name(antenna):
return (antenna.band + " " + antenna.get_antenna_type_display())
try:
return [antenna_name(ant) for ant in obj.antenna.all()]
except AttributeError:
return None
def get_observations(self, obj):
try:
return obj.observations_count
except AttributeError:
return None
def get_status(self, obj):
try:
return obj.get_status_display()
except AttributeError:
return None
class JobSerializer(serializers.ModelSerializer):
frequency = serializers.SerializerMethodField()
tle0 = serializers.SerializerMethodField()

View File

@ -3,11 +3,14 @@ import pytest
from django.test import TestCase
from rest_framework.utils.encoders import JSONEncoder
from network.base.tests import (
ObservationFactory,
SatelliteFactory,
TransmitterFactory,
StationFactory
StationFactory,
AntennaFactory
)
@ -55,3 +58,41 @@ class SettingsViewApiTest(TestCase):
def test_retrieve(self):
response = self.client.get('/api/settings/%s/' % self.station.uuid)
self.assertContains(response, self.station.name)
@pytest.mark.django_db(transaction=True)
class StationViewApiTest(TestCase):
"""
Tests the Station View API
"""
station = None
def setUp(self):
self.antenna = AntennaFactory()
self.encoder = JSONEncoder()
self.station = StationFactory.create(antennas=[self.antenna])
def test_station_view_api(self):
ants = self.station.antenna.all()
ser_ants = [" ".join([ant.band, ant.get_antenna_type_display()]) for ant in ants]
station_serialized = {
u'altitude': self.station.alt,
u'antenna': ser_ants,
u'created': self.encoder.default(self.station.created),
u'description': self.station.description,
u'id': self.station.id,
u'last_seen': self.encoder.default(self.station.last_seen),
u'lat': self.station.lat,
u'lng': self.station.lng,
u'location': self.station.location,
u'min_horizon': self.station.horizon,
u'name': self.station.name,
u'observations': 0,
u'qthlocator': self.station.qthlocator,
u'status': self.station.get_status_display()}
response = self.client.get('/api/stations/')
response_json = json.loads(response.content)
self.assertEqual(response_json, [station_serialized])

View File

@ -8,5 +8,6 @@ router.register(r'jobs', views.JobView, base_name='jobs')
router.register(r'data', views.ObservationView, base_name='data')
router.register(r'observations', views.ObservationView, base_name='observations')
router.register(r'settings', views.SettingsView, base_name='settings')
router.register(r'stations', views.StationView, base_name='stations')
api_urlpatterns = router.urls

View File

@ -28,6 +28,12 @@ class ObservationView(viewsets.ModelViewSet, mixins.UpdateModelMixin):
return Response(status=status.HTTP_200_OK)
class StationView(viewsets.ModelViewSet, mixins.UpdateModelMixin):
queryset = Station.objects.all()
serializer_class = serializers.StationSerializer
pagination_class = pagination.LinkedHeaderPageNumberPagination
class JobView(viewsets.ReadOnlyModelViewSet):
queryset = Observation.objects.filter(payload='')
serializer_class = serializers.JobSerializer

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.11 on 2018-03-30 22:43
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('base', '0038_auto_20180322_2054'),
]
operations = [
migrations.AlterModelOptions(
name='stationstatuslog',
options={'ordering': ['-changed']},
),
]

View File

@ -64,6 +64,7 @@ class ModeFactory(factory.django.DjangoModelFactory):
class AntennaFactory(factory.django.DjangoModelFactory):
"""Antenna model factory."""
frequency = fuzzy.FuzzyFloat(200, 500)
frequency_max = fuzzy.FuzzyFloat(500, 800)
band = fuzzy.FuzzyChoice(choices=ANTENNA_BAND_IDS)
antenna_type = fuzzy.FuzzyChoice(choices=ANTENNA_TYPE_IDS)