From 56df2e1f23c2467e965e8c5e7358f0b5e42af3d2 Mon Sep 17 00:00:00 2001 From: Nikos Roussos Date: Wed, 9 Sep 2015 11:12:36 +0300 Subject: [PATCH] Provide all settings client needs through API * Amend Station model to include Rig and UUID (Re: #162) * Settings API Endpoint (Re: #163) --- network/api/serializers.py | 11 +++++- network/api/urls.py | 1 + network/api/views.py | 15 ++++++++ network/base/admin.py | 7 +++- network/base/forms.py | 2 +- network/base/helpers.py | 9 +++++ .../migrations/0005_auto_20160320_1619.py | 34 +++++++++++++++++++ network/base/models.py | 16 +++++++++ network/base/views.py | 6 ++-- network/templates/base/station_view.html | 6 ++++ network/templates/includes/station_edit.html | 19 +++++++++++ network/users/views.py | 6 ++-- 12 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 network/base/helpers.py create mode 100644 network/base/migrations/0005_auto_20160320_1619.py diff --git a/network/api/serializers.py b/network/api/serializers.py index 45be118..008c895 100644 --- a/network/api/serializers.py +++ b/network/api/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from network.base.models import Data +from network.base.models import Data, Station class DataSerializer(serializers.ModelSerializer): @@ -32,3 +32,12 @@ class JobSerializer(serializers.ModelSerializer): def get_tle2(self, obj): return obj.observation.tle.tle2 + + +class SettingsSerializer(serializers.ModelSerializer): + class Meta: + model = Station + fields = ('uuid', 'name', 'alt', 'lat', 'lng', 'rig', + 'active', 'antenna', 'id', 'apikey') + + apikey = serializers.CharField(read_only=True) diff --git a/network/api/urls.py b/network/api/urls.py index a1ce34b..b2a6b3c 100644 --- a/network/api/urls.py +++ b/network/api/urls.py @@ -6,5 +6,6 @@ router = routers.DefaultRouter() router.register(r'jobs', views.JobView, base_name='jobs') router.register(r'data', views.DataView, base_name='data') +router.register(r'settings', views.SettingsView, base_name='settings') api_urlpatterns = router.urls diff --git a/network/api/views.py b/network/api/views.py index 27fab75..aeefc0a 100644 --- a/network/api/views.py +++ b/network/api/views.py @@ -1,7 +1,9 @@ from django.utils.timezone import now from django.shortcuts import get_object_or_404 +from django.http import Http404 from rest_framework import viewsets, mixins +from rest_framework.response import Response from network.api.perms import StationOwnerCanEditPermission from network.api import serializers, filters @@ -31,3 +33,16 @@ class JobView(viewsets.ReadOnlyModelViewSet): gs.last_seen = now() gs.save() return queryset + + +class SettingsView(viewsets.ReadOnlyModelViewSet): + queryset = Station.objects.all() + lookup_field = 'uuid' + + def list(self, request): + raise Http404() + + def retrieve(self, request, queryset=queryset, uuid=None): + station = get_object_or_404(queryset, uuid=uuid) + serializer = serializers.SettingsSerializer(station) + return Response(serializer.data) diff --git a/network/base/admin.py b/network/base/admin.py index a0d1d01..20d1177 100644 --- a/network/base/admin.py +++ b/network/base/admin.py @@ -1,9 +1,14 @@ from django.contrib import admin from network.base.models import (Antenna, Satellite, Station, Transmitter, - Observation, Data, Mode, Tle) + Observation, Data, Mode, Tle, Rig) +@admin.register(Rig) +class RigAdmin(admin.ModelAdmin): + list_display = ('name', 'rictld_number') + list_filter = ('name', ) + @admin.register(Mode) class ModeAdmin(admin.ModelAdmin): list_display = ('name', ) diff --git a/network/base/forms.py b/network/base/forms.py index 0dedc8c..5752e53 100644 --- a/network/base/forms.py +++ b/network/base/forms.py @@ -6,7 +6,7 @@ from network.base.models import Station class StationForm(forms.ModelForm): class Meta: model = Station - fields = ['name', 'image', 'alt', + fields = ['name', 'image', 'alt', 'rig', 'uuid', 'lat', 'lng', 'qthlocator', 'horizon', 'antenna', 'active'] image = forms.ImageField(required=False) diff --git a/network/base/helpers.py b/network/base/helpers.py new file mode 100644 index 0000000..8063da2 --- /dev/null +++ b/network/base/helpers.py @@ -0,0 +1,9 @@ +from rest_framework.authtoken.models import Token + + +def get_apikey(user): + try: + token = Token.objects.get(user=user) + except: + token = Token.objects.create(user=user) + return token diff --git a/network/base/migrations/0005_auto_20160320_1619.py b/network/base/migrations/0005_auto_20160320_1619.py new file mode 100644 index 0000000..bc23d6a --- /dev/null +++ b/network/base/migrations/0005_auto_20160320_1619.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-03-20 16:19 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0004_station_horizon'), + ] + + operations = [ + migrations.CreateModel( + name='Rig', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(choices=[(b'Radio', b'Radio'), (b'SDR', b'SDR')], max_length=10)), + ('rictld_number', models.PositiveIntegerField(blank=True, null=True)), + ], + ), + migrations.AddField( + model_name='station', + name='uuid', + field=models.CharField(blank=True, db_index=True, max_length=100), + ), + migrations.AddField( + model_name='station', + name='rig', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='base.Rig'), + ), + ] diff --git a/network/base/models.py b/network/base/models.py index 73308bb..766065d 100644 --- a/network/base/models.py +++ b/network/base/models.py @@ -8,8 +8,10 @@ from django.conf import settings from django.utils.html import format_html from network.users.models import User +from network.base.helpers import get_apikey +RIG_TYPES = ['Radio', 'SDR'] ANTENNA_BANDS = ['HF', 'VHF', 'UHF', 'L', 'S', 'C', 'X', 'KU'] ANTENNA_TYPES = ( ('dipole', 'Dipole'), @@ -20,6 +22,14 @@ ANTENNA_TYPES = ( ) +class Rig(models.Model): + name = models.CharField(choices=zip(RIG_TYPES, RIG_TYPES), max_length=10) + rictld_number = models.PositiveIntegerField(blank=True, null=True) + + def __unicode__(self): + return '{0}: {1}'.format(self.name, self.rictld_number) + + class Mode(models.Model): name = models.CharField(max_length=10, unique=True) @@ -58,6 +68,8 @@ class Station(models.Model): active = models.BooleanField(default=False) last_seen = models.DateTimeField(null=True, blank=True) horizon = models.PositiveIntegerField(help_text='In degrees above 0', default=10) + uuid = models.CharField(db_index=True, max_length=100, blank=True) + rig = models.ForeignKey(Rig, blank=True, null=True, on_delete=models.SET_NULL) class Meta: ordering = ['-active', '-last_seen'] @@ -91,6 +103,10 @@ class Station(models.Model): else: return False + @property + def apikey(self): + return get_apikey(user=self.owner) + def __unicode__(self): return "%d - %s" % (self.pk, self.name) diff --git a/network/base/views.py b/network/base/views.py index b2589c4..73903aa 100644 --- a/network/base/views.py +++ b/network/base/views.py @@ -19,7 +19,7 @@ from django.core.management import call_command from rest_framework import serializers, viewsets from network.base.models import (Station, Transmitter, Observation, - Data, Satellite, Antenna, Tle) + Data, Satellite, Antenna, Tle, Rig) from network.base.forms import StationForm from network.base.decorators import admin_required @@ -326,6 +326,7 @@ def station_view(request, id): station = get_object_or_404(Station, id=id) form = StationForm(instance=station) antennas = Antenna.objects.all() + rigs = Rig.objects.all() try: satellites = Satellite.objects.filter(transmitters__alive=True).distinct() @@ -408,7 +409,8 @@ def station_view(request, id): {'station': station, 'form': form, 'antennas': antennas, 'mapbox_id': settings.MAPBOX_MAP_ID, 'mapbox_token': settings.MAPBOX_TOKEN, - 'nextpasses': sorted(nextpasses, key=itemgetter('tr'))}) + 'nextpasses': sorted(nextpasses, key=itemgetter('tr')), + 'rigs': rigs}) @require_POST diff --git a/network/templates/base/station_view.html b/network/templates/base/station_view.html index a5b3f8d..16123e8 100644 --- a/network/templates/base/station_view.html +++ b/network/templates/base/station_view.html @@ -79,6 +79,12 @@ {{ station.horizon }}° +
+ Rig + + {{ station.rig|default:"-" }} + +
Creation Date
+
+ +
+ +
+
+
+ +
+ +
+
diff --git a/network/users/views.py b/network/users/views.py index 739b5ad..badd427 100644 --- a/network/users/views.py +++ b/network/users/views.py @@ -10,7 +10,7 @@ from rest_framework.authtoken.models import Token from network.users.forms import UserForm from network.users.models import User from network.base.forms import StationForm -from network.base.models import Station, Observation, Antenna +from network.base.models import Station, Observation, Antenna, Rig class UserRedirectView(LoginRequiredMixin, RedirectView): @@ -46,6 +46,7 @@ def view_user(request, username): token = Token.objects.create(user=user) form = StationForm() antennas = Antenna.objects.all() + rigs = Rig.objects.all() return render(request, 'users/user_detail.html', {'user': user, @@ -53,4 +54,5 @@ def view_user(request, username): 'stations': stations, 'token': token, 'form': form, - 'antennas': antennas}) + 'antennas': antennas, + 'rigs': rigs})