1
0
Fork 0

[Fixes #150] Create model for MODES and sync them from DB

merge-requests/152/head
Nikos Roussos 2015-08-14 16:55:43 +03:00
parent 6974c55258
commit 5806f4f0c2
12 changed files with 131 additions and 30 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 %}">

View File

@ -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 %}">

View File

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