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 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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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', )
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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})
|
||||||
|
|
Loading…
Reference in New Issue