1
0
Fork 0

Add Tle and LatestTle models

Signed-off-by: Alfredos-Panagiotis Damkalis <fredy@fredy.gr>
spacecruft
Alfredos-Panagiotis Damkalis 2020-08-03 05:17:30 +03:00
parent fda7defc8b
commit ce1c189f02
3 changed files with 134 additions and 3 deletions

View File

@ -9,7 +9,7 @@ from django.shortcuts import redirect
from django.urls import reverse
from db.base.models import Artifact, DemodData, ExportedFrameset, Mode, \
Operator, Satellite, Telemetry, Transmitter, TransmitterEntry, \
Operator, Satellite, Telemetry, Tle, Transmitter, TransmitterEntry, \
TransmitterSuggestion
from db.base.tasks import check_celery, decode_all_data
@ -219,6 +219,17 @@ class TransmitterAdmin(admin.ModelAdmin):
readonly_fields = ('uuid', 'satellite')
@admin.register(Tle)
class TleAdmin(admin.ModelAdmin):
"""Define TLE view in django admin UI"""
list_display = ('satellite_name', 'tle0', 'tle1', 'updated', 'tle_source')
list_filter = ('tle_source', 'satellite__name')
def satellite_name(self, obj): # pylint: disable=no-self-use
"""Return the satellite name"""
return obj.satellite.name
@admin.register(Telemetry)
class TelemetryAdmin(admin.ModelAdmin):
"""Defines Telemetry view in django admin UI"""

View File

@ -0,0 +1,53 @@
# Generated by Django 2.2.14 on 2020-08-03 02:04
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('base', '0021_auto_20200808_1725'),
]
operations = [
migrations.CreateModel(
name='Tle',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tle0', models.CharField(blank=True, max_length=69, validators=[django.core.validators.MinLengthValidator(1), django.core.validators.MaxLengthValidator(69)])),
('tle1', models.CharField(blank=True, max_length=69, validators=[django.core.validators.MinLengthValidator(69), django.core.validators.MaxLengthValidator(69)])),
('tle2', models.CharField(blank=True, max_length=69, validators=[django.core.validators.MinLengthValidator(69), django.core.validators.MaxLengthValidator(69)])),
('tle_source', models.CharField(blank=True, max_length=300)),
('updated', models.DateTimeField(auto_now=True)),
('satellite', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tles', to='base.Satellite')),
],
options={
'ordering': ['-updated'],
},
),
migrations.CreateModel(
name='LatestTle',
fields=[
],
options={
'proxy': True,
'indexes': [],
'constraints': [],
},
bases=('base.tle',),
),
migrations.AddIndex(
model_name='tle',
index=models.Index(fields=['-updated'], name='base_tle_updated_8936f7_idx'),
),
migrations.AddIndex(
model_name='tle',
index=models.Index(fields=['tle1', 'tle2', 'tle_source', 'satellite'], name='base_tle_tle1_30ea48_idx'),
),
migrations.AddConstraint(
model_name='tle',
constraint=models.UniqueConstraint(fields=('tle1', 'tle2', 'tle_source', 'satellite'), name='unique_entry_from_source_for_satellite'),
),
]

View File

@ -9,8 +9,8 @@ from django.conf import settings
from django.contrib.auth.models import User
from django.core.cache import cache
from django.core.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator, \
URLValidator
from django.core.validators import MaxLengthValidator, MaxValueValidator, \
MinLengthValidator, MinValueValidator, URLValidator
from django.db import models
from django.db.models import OuterRef, Subquery
from django.db.models.signals import post_save, pre_save
@ -496,6 +496,73 @@ class Transmitter(TransmitterEntry):
proxy = True
class Tle(models.Model):
"""Model for TLEs."""
tle0 = models.CharField(
max_length=69, blank=True, validators=[MinLengthValidator(1),
MaxLengthValidator(69)]
)
tle1 = models.CharField(
max_length=69, blank=True, validators=[MinLengthValidator(69),
MaxLengthValidator(69)]
)
tle2 = models.CharField(
max_length=69, blank=True, validators=[MinLengthValidator(69),
MaxLengthValidator(69)]
)
tle_source = models.CharField(max_length=300, blank=True)
updated = models.DateTimeField(auto_now=True, blank=True)
satellite = models.ForeignKey(
Satellite, related_name='tles', on_delete=models.CASCADE, null=True, blank=True
)
class Meta:
ordering = ['-updated']
constraints = [
models.UniqueConstraint(
fields=['tle1', 'tle2', 'tle_source', 'satellite'],
name='unique_entry_from_source_for_satellite'
),
]
indexes = [
models.Index(fields=['-updated']),
models.Index(fields=['tle1', 'tle2', 'tle_source', 'satellite'])
]
def __str__(self):
return '{:d} - {:s}'.format(self.id, self.tle0)
@property
def str_array(self):
"""Return TLE in string array format"""
# tle fields are unicode, pyephem and others expect python strings
return [str(self.tle0), str(self.tle1), str(self.tle2)]
class LatestTleManager(models.Manager): # pylint: disable=R0903
"""Django Manager for latest Tle objects"""
def get_queryset(self):
"""Returns query of latest Tle
:returns: the latest Tle for each Satellite
"""
subquery = Tle.objects.filter(satellite=OuterRef('satellite')).order_by('-updated')
return super(LatestTleManager,
self).get_queryset().filter(updated=Subquery(subquery.values('updated')[:1]))
class LatestTle(Tle):
"""LatestTle is the latest entry of a Satellite Tle objects
"""
objects = LatestTleManager()
class Meta:
proxy = True
def __str__(self):
return '{:d} - {:s}'.format(self.id, self.tle0)
class Telemetry(models.Model):
"""Model for satellite telemetry decoders."""
satellite = models.ForeignKey(