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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

@ -79,6 +79,12 @@
{{ station.horizon }}°
</span>
</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">
<span class="label label-default">Creation Date</span>
<span class="gs-front-data"

View File

@ -76,6 +76,25 @@
</select>
</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="col-sm-offset-2 col-sm-10">
<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.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})