[Fixes #150] Create model for MODES and sync them from DB
parent
6974c55258
commit
5806f4f0c2
|
@ -1,13 +1,21 @@
|
|||
from django.contrib import admin
|
||||
|
||||
from network.base.models import (Antenna, Satellite, Station, Transmitter,
|
||||
Observation, Data)
|
||||
Observation, Data, Mode)
|
||||
|
||||
|
||||
@admin.register(Mode)
|
||||
class ModeAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', )
|
||||
readonly_fields = ('name', )
|
||||
|
||||
|
||||
@admin.register(Antenna)
|
||||
class AntennaAdmin(admin.ModelAdmin):
|
||||
list_filter = ('band', 'antenna_type')
|
||||
|
||||
|
||||
@admin.register(Station)
|
||||
class StationAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'owner', 'lng', 'lat', 'qthlocator',
|
||||
'created_date', 'active', 'state')
|
||||
|
@ -17,20 +25,26 @@ class StationAdmin(admin.ModelAdmin):
|
|||
return obj.created.strftime('%d.%m.%Y, %H:%M')
|
||||
|
||||
|
||||
@admin.register(Satellite)
|
||||
class SatelliteAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'norad_cat_id', 'updated_date')
|
||||
readonly_fields = ('name', 'names', 'image', 'tle0', 'tle1', 'tle2')
|
||||
|
||||
def updated_date(self, obj):
|
||||
return obj.updated.strftime('%d.%m.%Y, %H:%M')
|
||||
|
||||
|
||||
@admin.register(Transmitter)
|
||||
class TransmitterAdmin(admin.ModelAdmin):
|
||||
list_display = ('uuid', 'description', 'satellite', 'uplink_low',
|
||||
'uplink_high', 'downlink_low', 'downlink_high')
|
||||
search_fields = ('satellite', 'uuid')
|
||||
list_filter = ('mode', 'invert', 'uuid')
|
||||
readonly_fields = ('uuid', 'description', 'satellite', 'uplink_low', 'uplink_high',
|
||||
'downlink_low', 'downlink_high', 'baud', 'invert', 'alive', 'mode')
|
||||
|
||||
|
||||
@admin.register(Observation)
|
||||
class ObservationAdmin(admin.ModelAdmin):
|
||||
list_display = ('id', 'author', 'satellite', 'transmitter', 'start_date', 'end_date')
|
||||
list_filter = ('start', 'end')
|
||||
|
@ -43,6 +57,7 @@ class ObservationAdmin(admin.ModelAdmin):
|
|||
return obj.end.strftime('%d.%m.%Y, %H:%M')
|
||||
|
||||
|
||||
@admin.register(Data)
|
||||
class DataAdmin(admin.ModelAdmin):
|
||||
list_display = ('id', 'start_date', 'end_date', 'observation', 'ground_station')
|
||||
readonly_fields = ('observation', 'ground_station')
|
||||
|
@ -52,11 +67,3 @@ class DataAdmin(admin.ModelAdmin):
|
|||
|
||||
def end_date(self, obj):
|
||||
return obj.end.strftime('%d.%m.%Y, %H:%M')
|
||||
|
||||
|
||||
admin.site.register(Antenna, AntennaAdmin)
|
||||
admin.site.register(Satellite, SatelliteAdmin)
|
||||
admin.site.register(Station, StationAdmin)
|
||||
admin.site.register(Transmitter, TransmitterAdmin)
|
||||
admin.site.register(Observation, ObservationAdmin)
|
||||
admin.site.register(Data, DataAdmin)
|
||||
|
|
|
@ -4,7 +4,7 @@ import urllib2
|
|||
from django.core.management.base import BaseCommand, CommandError
|
||||
from django.conf import settings
|
||||
|
||||
from network.base.models import Satellite, Transmitter
|
||||
from network.base.models import Mode, Satellite, Transmitter
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
|
@ -12,43 +12,70 @@ class Command(BaseCommand):
|
|||
|
||||
def handle(self, *args, **options):
|
||||
apiurl = settings.DB_API_ENDPOINT
|
||||
modes_url = "{0}modes".format(apiurl)
|
||||
satellites_url = "{0}satellites".format(apiurl)
|
||||
transmitters_url = "{0}transmitters".format(apiurl)
|
||||
self.stdout.write("Fetching from: {0}".format(satellites_url))
|
||||
|
||||
self.stdout.write("Fetching from: {0}".format(apiurl))
|
||||
try:
|
||||
modes = urllib2.urlopen(modes_url).read()
|
||||
satellites = urllib2.urlopen(satellites_url).read()
|
||||
transmitters = urllib2.urlopen(transmitters_url).read()
|
||||
except:
|
||||
raise CommandError('API is unreachable')
|
||||
|
||||
# Fetch Modes
|
||||
for mode in json.loads(modes):
|
||||
id = mode['id']
|
||||
name = mode['name']
|
||||
try:
|
||||
existing_mode = Mode.objects.get(id=id)
|
||||
existing_mode.__dict__.update(mode)
|
||||
existing_mode.save()
|
||||
self.stdout.write('Mode {0} updated'.format(name))
|
||||
except Mode.DoesNotExist:
|
||||
Mode.objects.create(**mode)
|
||||
self.stdout.write('Mode {0} added'.format(name))
|
||||
|
||||
# Fetch Satellites
|
||||
for satellite in json.loads(satellites):
|
||||
norad_cat_id = satellite['norad_cat_id']
|
||||
name = satellite['name']
|
||||
try:
|
||||
sat = Satellite.objects.get(norad_cat_id=norad_cat_id)
|
||||
self.stdout.write('Satellite {0}-{1} already exists'.format(norad_cat_id, name))
|
||||
except:
|
||||
sat = Satellite(norad_cat_id=norad_cat_id, name=name)
|
||||
sat.save()
|
||||
existing_satellite = Satellite.objects.get(norad_cat_id=norad_cat_id)
|
||||
existing_satellite.__dict__.update(satellite)
|
||||
existing_satellite.save()
|
||||
self.stdout.write('Satellite {0}-{1} updated'.format(norad_cat_id, name))
|
||||
except Satellite.DoesNotExist:
|
||||
Satellite.objects.create(**satellite)
|
||||
self.stdout.write('Satellite {0}-{1} added'.format(norad_cat_id, name))
|
||||
|
||||
# Fetch Transmitters
|
||||
for transmitter in json.loads(transmitters):
|
||||
norad_cat_id = transmitter['norad_cat_id']
|
||||
uuid = transmitter['uuid']
|
||||
description = transmitter['description']
|
||||
mode_id = transmitter['mode_id']
|
||||
|
||||
try:
|
||||
sat = Satellite.objects.get(norad_cat_id=norad_cat_id)
|
||||
except:
|
||||
except Satellite.DoesNotExist:
|
||||
self.stdout.write('Satellite {0} not present'.format(norad_cat_id))
|
||||
transmitter.pop('norad_cat_id')
|
||||
|
||||
try:
|
||||
mode = Mode.objects.get(id=mode_id)
|
||||
except Mode.DoesNotExist:
|
||||
mode = None
|
||||
try:
|
||||
existing_transmitter = Transmitter.objects.get(uuid=uuid)
|
||||
existing_transmitter.__dict__.update(transmitter)
|
||||
existing_transmitter.satellite = sat
|
||||
existing_transmitter.save()
|
||||
self.stdout.write('Transmitter {0}-{1} updated'.format(uuid, description))
|
||||
except Transmitter.DoesNotExist:
|
||||
new_transmitter = Transmitter.objects.create(**transmitter)
|
||||
new_transmitter.satellite = sat
|
||||
new_transmitter.mode = mode
|
||||
new_transmitter.save()
|
||||
self.stdout.write('Transmitter {0}-{1} created'.format(uuid, description))
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('base', '0006_auto_20150723_1504'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Mode',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('name', models.CharField(unique=True, max_length=10)),
|
||||
],
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='transmitter',
|
||||
name='mode',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='satellite',
|
||||
name='image',
|
||||
field=models.ImageField(upload_to=b'satellites', blank=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='satellite',
|
||||
name='names',
|
||||
field=models.TextField(blank=True),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,20 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('base', '0007_auto_20150814_1341'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='transmitter',
|
||||
name='mode',
|
||||
field=models.ForeignKey(related_name='transmitters', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='base.Mode', null=True),
|
||||
),
|
||||
]
|
|
@ -17,7 +17,13 @@ ANTENNA_TYPES = (
|
|||
('helical', 'Helical'),
|
||||
('parabolic', 'Parabolic'),
|
||||
)
|
||||
MODE_CHOICES = ['FM', 'AFSK', 'BFSK', 'APRS', 'SSTV', 'CW', 'FMN', 'SSTV', 'GMSK', 'SSB']
|
||||
|
||||
|
||||
class Mode(models.Model):
|
||||
name = models.CharField(max_length=10, unique=True)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Antenna(models.Model):
|
||||
|
@ -28,7 +34,7 @@ class Antenna(models.Model):
|
|||
antenna_type = models.CharField(choices=ANTENNA_TYPES, max_length=15)
|
||||
|
||||
def __unicode__(self):
|
||||
return "%s - %s - %s" % (self.band, self.antenna_type, self.frequency)
|
||||
return '{0} - {1} - {2}'.format(self.band, self.antenna_type, self.frequency)
|
||||
|
||||
|
||||
class Station(models.Model):
|
||||
|
@ -88,6 +94,8 @@ class Satellite(models.Model):
|
|||
"""Model for SatNOGS satellites."""
|
||||
norad_cat_id = models.PositiveIntegerField()
|
||||
name = models.CharField(max_length=45)
|
||||
names = models.TextField(blank=True)
|
||||
image = models.ImageField(upload_to='satellites', blank=True)
|
||||
tle0 = models.CharField(max_length=100, blank=True)
|
||||
tle1 = models.CharField(max_length=200, blank=True)
|
||||
tle2 = models.CharField(max_length=200, blank=True)
|
||||
|
@ -96,6 +104,12 @@ class Satellite(models.Model):
|
|||
class Meta:
|
||||
ordering = ['norad_cat_id']
|
||||
|
||||
def get_image(self):
|
||||
if self.image and hasattr(self.image, 'url'):
|
||||
return self.image.url
|
||||
else:
|
||||
return settings.SATELLITE_DEFAULT_IMAGE
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
|
@ -109,12 +123,11 @@ class Transmitter(models.Model):
|
|||
uplink_high = models.PositiveIntegerField(blank=True, null=True)
|
||||
downlink_low = models.PositiveIntegerField(blank=True, null=True)
|
||||
downlink_high = models.PositiveIntegerField(blank=True, null=True)
|
||||
mode = models.CharField(choices=zip(MODE_CHOICES, MODE_CHOICES),
|
||||
max_length=10, blank=True)
|
||||
mode = models.ForeignKey(Mode, related_name='transmitters', blank=True,
|
||||
null=True, on_delete=models.SET_NULL)
|
||||
invert = models.BooleanField(default=False)
|
||||
baud = models.FloatField(validators=[MinValueValidator(0)], null=True, blank=True)
|
||||
satellite = models.ForeignKey(Satellite, related_name='transmitters',
|
||||
null=True)
|
||||
satellite = models.ForeignKey(Satellite, related_name='transmitters', null=True)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.description
|
||||
|
|
|
@ -101,6 +101,7 @@ MEDIA_ROOT = path.join(path.dirname(BASE_DIR), 'media')
|
|||
MEDIA_URL = '/media/'
|
||||
CRISPY_TEMPLATE_PACK = 'bootstrap3'
|
||||
STATION_DEFAULT_IMAGE = '/static/img/dish.png'
|
||||
SATELLITE_DEFAULT_IMAGE = '/static/img/sat.png'
|
||||
|
||||
# App conf
|
||||
ROOT_URLCONF = 'network.urls'
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 6.2 KiB |
|
@ -127,7 +127,7 @@
|
|||
</td>
|
||||
<td>{{ observation.satellite.name }}</td>
|
||||
<td>{{ observation.transmitter.downlink_low|frq }}</td>
|
||||
<td>{{ observation.transmitter.mode }}</td>
|
||||
<td>{{ observation.transmitter.mode|default:"-" }}</td>
|
||||
<td>
|
||||
{{ observation.start|date:"Y-m-d H:i:s" }}<br>
|
||||
{{ observation.end|date:"Y-m-d H:i:s" }}
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
{% for transmitter in transmitters %}
|
||||
<option data-satellite="{{ transmitter.satellite.norad_cat_id }}"
|
||||
value="{{ transmitter.id }}">
|
||||
{{ transmitter.description }} - {{ transmitter.downlink_low|frq }} - {{ transmitter.mode }}
|
||||
{{ transmitter.description }} - {{ transmitter.downlink_low|frq }} - {{ transmitter.mode|default:"" }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
<tr>
|
||||
<td>{{ observation.satellite.norad_cat_id }} - {{ observation.satellite.name }}</td>
|
||||
<td>{{ observation.transmitter.downlink_low|frq }}</td>
|
||||
<td>{{ observation.transmitter.mode }}</td>
|
||||
<td>{{ observation.transmitter.mode|default:"-" }}</td>
|
||||
<td>{{ observation.start|date:"Y-m-d H:i:s" }}</br>{{ observation.end|date:"Y-m-d H:i:s" }}</td>
|
||||
<td>
|
||||
<a href="{% url 'users:view_user' username=observation.author.username %}">
|
||||
|
|
|
@ -38,8 +38,8 @@
|
|||
</a>
|
||||
</td>
|
||||
<td>{{ observation.satellite.name }}</td>
|
||||
<td>{{ observation.transmitters.downlink_low|frq }}</td>
|
||||
<td>{{ observation.transmitters.mode }}</td>
|
||||
<td>{{ observation.transmitter.downlink_low|frq }}</td>
|
||||
<td>{{ observation.transmitter.mode|default:"-" }}</td>
|
||||
<td>{{ observation.start|date:"Y-m-d H:i:s" }}</br>{{ observation.end|date:"Y-m-d H:i:s" }}</td>
|
||||
<td>
|
||||
<a href="{% url 'users:view_user' username=observation.author.username %}">
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
from django.core.urlresolvers import reverse
|
||||
from django.shortcuts import render
|
||||
from django.views.generic import DetailView
|
||||
from django.views.generic import RedirectView
|
||||
from django.views.generic import UpdateView
|
||||
from django.views.generic import ListView
|
||||
|
||||
from braces.views import LoginRequiredMixin
|
||||
|
||||
|
|
Loading…
Reference in New Issue