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
parent
3c8d7ac53a
commit
56df2e1f23
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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', )
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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})
|
||||
|
|
Loading…
Reference in New Issue