1
0
Fork 0

Provide all settings client needs through API

* Amend Station model to include Rig and UUID (Re: #162)
* Settings API Endpoint (Re: #163)
merge-requests/164/head
Nikos Roussos 2015-09-09 11:12:36 +03:00
parent 3c8d7ac53a
commit 56df2e1f23
12 changed files with 125 additions and 7 deletions

View File

@ -1,6 +1,6 @@
from rest_framework import serializers from rest_framework import serializers
from network.base.models import Data from network.base.models import Data, Station
class DataSerializer(serializers.ModelSerializer): class DataSerializer(serializers.ModelSerializer):
@ -32,3 +32,12 @@ class JobSerializer(serializers.ModelSerializer):
def get_tle2(self, obj): def get_tle2(self, obj):
return obj.observation.tle.tle2 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)

View File

@ -6,5 +6,6 @@ router = routers.DefaultRouter()
router.register(r'jobs', views.JobView, base_name='jobs') router.register(r'jobs', views.JobView, base_name='jobs')
router.register(r'data', views.DataView, base_name='data') router.register(r'data', views.DataView, base_name='data')
router.register(r'settings', views.SettingsView, base_name='settings')
api_urlpatterns = router.urls api_urlpatterns = router.urls

View File

@ -1,7 +1,9 @@
from django.utils.timezone import now from django.utils.timezone import now
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.http import Http404
from rest_framework import viewsets, mixins from rest_framework import viewsets, mixins
from rest_framework.response import Response
from network.api.perms import StationOwnerCanEditPermission from network.api.perms import StationOwnerCanEditPermission
from network.api import serializers, filters from network.api import serializers, filters
@ -31,3 +33,16 @@ class JobView(viewsets.ReadOnlyModelViewSet):
gs.last_seen = now() gs.last_seen = now()
gs.save() gs.save()
return queryset 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)

View File

@ -1,9 +1,14 @@
from django.contrib import admin from django.contrib import admin
from network.base.models import (Antenna, Satellite, Station, Transmitter, 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) @admin.register(Mode)
class ModeAdmin(admin.ModelAdmin): class ModeAdmin(admin.ModelAdmin):
list_display = ('name', ) list_display = ('name', )

View File

@ -6,7 +6,7 @@ from network.base.models import Station
class StationForm(forms.ModelForm): class StationForm(forms.ModelForm):
class Meta: class Meta:
model = Station model = Station
fields = ['name', 'image', 'alt', fields = ['name', 'image', 'alt', 'rig', 'uuid',
'lat', 'lng', 'qthlocator', 'lat', 'lng', 'qthlocator',
'horizon', 'antenna', 'active'] 'horizon', 'antenna', 'active']
image = forms.ImageField(required=False) image = forms.ImageField(required=False)

View File

@ -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

View File

@ -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'),
),
]

View File

@ -8,8 +8,10 @@ from django.conf import settings
from django.utils.html import format_html from django.utils.html import format_html
from network.users.models import User 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_BANDS = ['HF', 'VHF', 'UHF', 'L', 'S', 'C', 'X', 'KU']
ANTENNA_TYPES = ( ANTENNA_TYPES = (
('dipole', 'Dipole'), ('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): class Mode(models.Model):
name = models.CharField(max_length=10, unique=True) name = models.CharField(max_length=10, unique=True)
@ -58,6 +68,8 @@ class Station(models.Model):
active = models.BooleanField(default=False) active = models.BooleanField(default=False)
last_seen = models.DateTimeField(null=True, blank=True) last_seen = models.DateTimeField(null=True, blank=True)
horizon = models.PositiveIntegerField(help_text='In degrees above 0', default=10) 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: class Meta:
ordering = ['-active', '-last_seen'] ordering = ['-active', '-last_seen']
@ -91,6 +103,10 @@ class Station(models.Model):
else: else:
return False return False
@property
def apikey(self):
return get_apikey(user=self.owner)
def __unicode__(self): def __unicode__(self):
return "%d - %s" % (self.pk, self.name) return "%d - %s" % (self.pk, self.name)

View File

@ -19,7 +19,7 @@ from django.core.management import call_command
from rest_framework import serializers, viewsets from rest_framework import serializers, viewsets
from network.base.models import (Station, Transmitter, Observation, 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.forms import StationForm
from network.base.decorators import admin_required from network.base.decorators import admin_required
@ -326,6 +326,7 @@ def station_view(request, id):
station = get_object_or_404(Station, id=id) station = get_object_or_404(Station, id=id)
form = StationForm(instance=station) form = StationForm(instance=station)
antennas = Antenna.objects.all() antennas = Antenna.objects.all()
rigs = Rig.objects.all()
try: try:
satellites = Satellite.objects.filter(transmitters__alive=True).distinct() satellites = Satellite.objects.filter(transmitters__alive=True).distinct()
@ -408,7 +409,8 @@ def station_view(request, id):
{'station': station, 'form': form, 'antennas': antennas, {'station': station, 'form': form, 'antennas': antennas,
'mapbox_id': settings.MAPBOX_MAP_ID, 'mapbox_id': settings.MAPBOX_MAP_ID,
'mapbox_token': settings.MAPBOX_TOKEN, 'mapbox_token': settings.MAPBOX_TOKEN,
'nextpasses': sorted(nextpasses, key=itemgetter('tr'))}) 'nextpasses': sorted(nextpasses, key=itemgetter('tr')),
'rigs': rigs})
@require_POST @require_POST

View File

@ -79,6 +79,12 @@
{{ station.horizon }}° {{ station.horizon }}°
</span> </span>
</div> </div>
<div class="gs-front-line">
<span class="label label-default">Rig</span>
<span class="gs-front-data">
{{ station.rig|default:"-" }}
</span>
</div>
<div class="gs-front-line"> <div class="gs-front-line">
<span class="label label-default">Creation Date</span> <span class="label label-default">Creation Date</span>
<span class="gs-front-data" <span class="gs-front-data"

View File

@ -76,6 +76,25 @@
</select> </select>
</div> </div>
</div> </div>
<div class="form-group">
<label for="rig" class="col-sm-2 control-label">Rig</label>
<div class="col-sm-10">
<select class="form-control" name="rig">
<option value="" selected>---</option>
{% for rig in rigs %}
<option value="{{ rig.id }}" {% ifequal station.rig rig %}selected{% endifequal %}>
{{ rig }}
</option>
{% endfor %}
</select>
</div>
</div>
<div class="form-group has-warning">
<label for="uuid" class="col-sm-2 control-label">UUID</label>
<div class="col-sm-10">
<input value="{{ form.uuid.value|default_if_none:"" }}" id="uuid" type="text" class="form-control" name="uuid" placeholder="UUID">
</div>
</div>
<div class="form-group"> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10"> <div class="col-sm-offset-2 col-sm-10">
<div class="checkbox"> <div class="checkbox">

View File

@ -10,7 +10,7 @@ from rest_framework.authtoken.models import Token
from network.users.forms import UserForm from network.users.forms import UserForm
from network.users.models import User from network.users.models import User
from network.base.forms import StationForm 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): class UserRedirectView(LoginRequiredMixin, RedirectView):
@ -46,6 +46,7 @@ def view_user(request, username):
token = Token.objects.create(user=user) token = Token.objects.create(user=user)
form = StationForm() form = StationForm()
antennas = Antenna.objects.all() antennas = Antenna.objects.all()
rigs = Rig.objects.all()
return render(request, 'users/user_detail.html', return render(request, 'users/user_detail.html',
{'user': user, {'user': user,
@ -53,4 +54,5 @@ def view_user(request, username):
'stations': stations, 'stations': stations,
'token': token, 'token': token,
'form': form, 'form': form,
'antennas': antennas}) 'antennas': antennas,
'rigs': rigs})