diff --git a/network/base/admin.py b/network/base/admin.py index a0de703..a0d1d01 100644 --- a/network/base/admin.py +++ b/network/base/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin from network.base.models import (Antenna, Satellite, Station, Transmitter, - Observation, Data, Mode) + Observation, Data, Mode, Tle) @admin.register(Mode) @@ -28,7 +28,16 @@ class StationAdmin(admin.ModelAdmin): @admin.register(Satellite) class SatelliteAdmin(admin.ModelAdmin): list_display = ('name', 'norad_cat_id', 'updated_date') - readonly_fields = ('name', 'names', 'image', 'tle0', 'tle1', 'tle2') + readonly_fields = ('name', 'names', 'image') + + def updated_date(self, obj): + return obj.updated.strftime('%d.%m.%Y, %H:%M') + + +@admin.register(Tle) +class TleAdmin(admin.ModelAdmin): + list_display = ('tle0', 'tle1', 'updated_date') + readonly_fields = ('tle0', 'tle1', 'tle2') def updated_date(self, obj): return obj.updated.strftime('%d.%m.%Y, %H:%M') diff --git a/network/base/helpers.py b/network/base/helpers.py new file mode 100644 index 0000000..00b63b7 --- /dev/null +++ b/network/base/helpers.py @@ -0,0 +1,6 @@ +from network.base.models import Satellite, Tle + + +def get_latest_tle(satellite): + latest_tle = Tle.objects.filter(satellite=satellite).latest('updated') + return latest_tle diff --git a/network/base/management/commands/update_all_tle.py b/network/base/management/commands/update_all_tle.py index d3d05ba..9f7ccd7 100644 --- a/network/base/management/commands/update_all_tle.py +++ b/network/base/management/commands/update_all_tle.py @@ -2,7 +2,8 @@ from orbit import satellite from django.core.management.base import BaseCommand -from network.base.models import Satellite +from network.base.models import Satellite, Tle +from network.base.helpers import get_latest_tle class Command(BaseCommand): @@ -21,10 +22,20 @@ class Command(BaseCommand): continue obj.name = sat.name() - tle = sat.tle() - obj.tle0 = tle[0] - obj.tle1 = tle[1] - obj.tle2 = tle[2] obj.save() + + # Get latest satellite TLE and check if it changed + tle = sat.tle() + try: + latest_tle = get_latest_tle + if latest_tle.tle1 == tle[1]: + self.stdout.write(('Satellite {} with Identifier {} ' + 'found [defer]').format(obj.name, obj.norad_cat_id)) + continue + except Tle.DoesNotExist: + pass + + Tle.objects.create(tle0=tle[0], tle1=tle[1], tle2=tle[2], satellite=obj) + self.stdout.write(('Satellite {} with Identifier {} ' 'found [updated]').format(obj.name, obj.norad_cat_id)) diff --git a/network/base/migrations/0003_auto_20160119_1856.py b/network/base/migrations/0003_auto_20160119_1856.py new file mode 100644 index 0000000..966fb49 --- /dev/null +++ b/network/base/migrations/0003_auto_20160119_1856.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0002_auto_20151011_1406'), + ] + + operations = [ + migrations.CreateModel( + name='Tle', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=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)), + ('updated', models.DateTimeField(auto_now=True)), + ], + options={ + 'ordering': ['tle0'], + }, + ), + migrations.RemoveField( + model_name='satellite', + name='tle0', + ), + migrations.RemoveField( + model_name='satellite', + name='tle1', + ), + migrations.RemoveField( + model_name='satellite', + name='tle2', + ), + migrations.RemoveField( + model_name='satellite', + name='updated', + ), + migrations.AddField( + model_name='tle', + name='satellite', + field=models.ForeignKey(related_name='tles', to='base.Satellite', null=True), + ), + migrations.AddField( + model_name='observation', + name='tle', + field=models.ForeignKey(to='base.Tle', null=True), + ), + ] diff --git a/network/base/models.py b/network/base/models.py index 73cb412..08e292c 100644 --- a/network/base/models.py +++ b/network/base/models.py @@ -100,10 +100,6 @@ class Satellite(models.Model): 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) - updated = models.DateTimeField(auto_now=True, blank=True) class Meta: ordering = ['norad_cat_id'] @@ -118,6 +114,20 @@ class Satellite(models.Model): return self.name +class Tle(models.Model): + tle0 = models.CharField(max_length=100, blank=True) + tle1 = models.CharField(max_length=200, blank=True) + tle2 = models.CharField(max_length=200, blank=True) + updated = models.DateTimeField(auto_now=True, blank=True) + satellite = models.ForeignKey(Satellite, related_name='tles', null=True) + + class Meta: + ordering = ['tle0'] + + def __unicode__(self): + return self.tle0 + + class Transmitter(models.Model): """Model for antennas transponders.""" uuid = ShortUUIDField(db_index=True) @@ -141,6 +151,7 @@ class Observation(models.Model): """Model for SatNOGS observations.""" satellite = models.ForeignKey(Satellite) transmitter = models.ForeignKey(Transmitter, null=True, related_name='observations') + tle = models.ForeignKey(Tle, null=True) author = models.ForeignKey(User) start = models.DateTimeField() end = models.DateTimeField() diff --git a/network/base/views.py b/network/base/views.py index 2b6c670..4a2a0a4 100644 --- a/network/base/views.py +++ b/network/base/views.py @@ -22,6 +22,7 @@ from network.base.models import (Station, Transmitter, Observation, Data, Satellite, Antenna) from network.base.forms import StationForm from network.base.decorators import admin_required +from network.base.helpers import get_latest_tle class StationSerializer(serializers.ModelSerializer): @@ -173,7 +174,11 @@ def prediction_windows(request, sat_id, start_date, end_date): 'error': 'You should select a Satellite first.' } return JsonResponse(data, safe=False) - satellite = ephem.readtle(str(sat.tle0), str(sat.tle1), str(sat.tle2)) + + latest_tle = get_latest_tle(sat) + satellite = ephem.readtle(str(latest_tle.tle0), + str(latest_tle.tle1), + str(latest_tle.tle2)) end_date = datetime.strptime(end_date, '%Y-%m-%d %H:%M') @@ -325,11 +330,12 @@ def station_view(request, id): for satellite in satellites: observer.date = ephem.date(datetime.today()) + latest_tle = get_latest_tle(satellite) try: - sat_ephem = ephem.readtle(str(satellite.tle0), - str(satellite.tle1), - str(satellite.tle2)) + sat_ephem = ephem.readtle(str(latest_tle.tle0), + str(latest_tle.tle1), + str(latest_tle.tle2)) # Here we are going to iterate over each satellite to # find its appropriate passes within a given time constraint