Add Station API to network.satnogs.org
parent
2b2f6726b1
commit
fbe246ea26
|
@ -13,6 +13,7 @@ pip-log.txt
|
|||
.coverage
|
||||
.tox
|
||||
nosetests.xml
|
||||
.pytest_cache
|
||||
|
||||
# Sqlite
|
||||
*.db
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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']},
|
||||
),
|
||||
]
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue