2015-05-06 02:53:48 -06:00
|
|
|
from datetime import timedelta
|
|
|
|
|
2014-09-01 14:21:53 -06:00
|
|
|
from django.core.validators import MaxValueValidator, MinValueValidator
|
|
|
|
from django.db import models
|
2014-09-08 11:36:12 -06:00
|
|
|
from django.utils.timezone import now
|
2015-02-05 17:35:27 -07:00
|
|
|
from django.conf import settings
|
2014-09-01 14:21:53 -06:00
|
|
|
|
2014-12-19 06:06:58 -07:00
|
|
|
from network.users.models import User
|
2014-09-01 14:21:53 -06:00
|
|
|
|
|
|
|
|
|
|
|
ANTENNA_BANDS = ['HF', 'VHF', 'UHF', 'L', 'S', 'C', 'X', 'KU']
|
|
|
|
ANTENNA_TYPES = (
|
|
|
|
('dipole', 'Dipole'),
|
|
|
|
('yagi', 'Yagi'),
|
|
|
|
('helical', 'Helical'),
|
|
|
|
('parabolic', 'Parabolic'),
|
|
|
|
)
|
2014-10-27 09:47:32 -06:00
|
|
|
MODE_CHOICES = ['FM', 'AFSK', 'BFSK', 'APRS', 'SSTV', 'CW', 'FMN']
|
2014-09-01 14:21:53 -06:00
|
|
|
|
|
|
|
|
|
|
|
class Antenna(models.Model):
|
|
|
|
"""Model for antennas tracked with SatNOGS."""
|
|
|
|
frequency = models.FloatField(validators=[MinValueValidator(0)])
|
|
|
|
band = models.CharField(choices=zip(ANTENNA_BANDS, ANTENNA_BANDS),
|
|
|
|
max_length=5)
|
|
|
|
antenna_type = models.CharField(choices=ANTENNA_TYPES, max_length=15)
|
|
|
|
|
2014-12-13 11:21:05 -07:00
|
|
|
def __unicode__(self):
|
|
|
|
return "%s - %s - %s" % (self.band, self.antenna_type, self.frequency)
|
|
|
|
|
2014-09-01 14:21:53 -06:00
|
|
|
|
|
|
|
class Station(models.Model):
|
|
|
|
"""Model for SatNOGS ground stations."""
|
2014-10-24 11:12:58 -06:00
|
|
|
owner = models.ForeignKey(User)
|
2014-09-01 14:21:53 -06:00
|
|
|
name = models.CharField(max_length=45)
|
2015-02-05 17:35:27 -07:00
|
|
|
image = models.ImageField(upload_to='ground_stations', blank=True)
|
2014-12-03 10:58:23 -07:00
|
|
|
alt = models.PositiveIntegerField(help_text='In meters above ground')
|
2014-09-01 14:21:53 -06:00
|
|
|
lat = models.FloatField(validators=[MaxValueValidator(90),
|
|
|
|
MinValueValidator(-90)])
|
|
|
|
lng = models.FloatField(validators=[MaxValueValidator(180),
|
|
|
|
MinValueValidator(-180)])
|
2015-04-15 06:46:33 -06:00
|
|
|
qthlocator = models.CharField(max_length=255, blank=True)
|
|
|
|
location = models.CharField(max_length=255, blank=True)
|
|
|
|
antenna = models.ManyToManyField(Antenna, blank=True,
|
2014-12-03 10:58:23 -07:00
|
|
|
help_text=('If you want to add a new Antenna '
|
|
|
|
'contact SatNOGS Team'))
|
2014-09-17 12:30:30 -06:00
|
|
|
featured_date = models.DateField(null=True, blank=True)
|
2014-12-01 13:20:38 -07:00
|
|
|
created = models.DateTimeField(auto_now_add=True)
|
2015-05-06 02:53:48 -06:00
|
|
|
active = models.BooleanField(default=False)
|
|
|
|
last_seen = models.DateTimeField(null=True, blank=True)
|
2014-09-17 12:30:30 -06:00
|
|
|
|
2015-02-05 17:35:27 -07:00
|
|
|
def get_image(self):
|
|
|
|
if self.image and hasattr(self.image, 'url'):
|
|
|
|
return self.image.url
|
|
|
|
else:
|
|
|
|
return settings.STATION_DEFAULT_IMAGE
|
|
|
|
|
2015-05-06 02:53:48 -06:00
|
|
|
@property
|
|
|
|
def online(self):
|
|
|
|
try:
|
|
|
|
heartbeat = self.last_seen + timedelta(minutes=settings.STATION_HEARTBEAT_TIME)
|
|
|
|
return self.active and heartbeat > now()
|
|
|
|
except:
|
|
|
|
return False
|
|
|
|
|
2014-10-06 06:14:55 -06:00
|
|
|
def __unicode__(self):
|
|
|
|
return "%d - %s" % (self.pk, self.name)
|
|
|
|
|
2014-09-01 14:21:53 -06:00
|
|
|
|
|
|
|
class Satellite(models.Model):
|
|
|
|
"""Model for SatNOGS satellites."""
|
|
|
|
norad_cat_id = models.PositiveIntegerField()
|
|
|
|
name = models.CharField(max_length=45)
|
2015-04-15 06:46:33 -06:00
|
|
|
tle0 = models.CharField(max_length=100, blank=True)
|
|
|
|
tle1 = models.CharField(max_length=200, blank=True)
|
|
|
|
tle2 = models.CharField(max_length=200, blank=True)
|
2015-05-06 02:53:48 -06:00
|
|
|
updated = models.DateTimeField(auto_now=True, blank=True)
|
2014-09-14 08:42:52 -06:00
|
|
|
|
2014-09-17 10:53:25 -06:00
|
|
|
def __unicode__(self):
|
|
|
|
return self.name
|
|
|
|
|
2014-09-14 08:42:52 -06:00
|
|
|
|
|
|
|
class Transponder(models.Model):
|
|
|
|
"""Model for antennas transponders."""
|
|
|
|
description = models.TextField()
|
2014-10-16 06:07:07 -06:00
|
|
|
alive = models.BooleanField(default=True)
|
2014-10-27 09:47:32 -06:00
|
|
|
uplink_low = models.PositiveIntegerField(blank=True, null=True)
|
|
|
|
uplink_high = models.PositiveIntegerField(blank=True, null=True)
|
|
|
|
downlink_low = models.PositiveIntegerField(blank=True, null=True)
|
|
|
|
downlink_high = models.PositiveIntegerField(blank=True, null=True)
|
2014-09-14 08:42:52 -06:00
|
|
|
mode = models.CharField(choices=zip(MODE_CHOICES, MODE_CHOICES),
|
2015-05-06 02:53:48 -06:00
|
|
|
max_length=10, blank=True)
|
2014-10-15 09:02:47 -06:00
|
|
|
invert = models.BooleanField(default=False)
|
2015-05-06 02:53:48 -06:00
|
|
|
baud = models.FloatField(validators=[MinValueValidator(0)], null=True, blank=True)
|
2014-09-14 08:42:52 -06:00
|
|
|
satellite = models.ForeignKey(Satellite, related_name='transponder',
|
|
|
|
null=True)
|
2014-09-01 14:21:53 -06:00
|
|
|
|
2014-10-06 06:14:55 -06:00
|
|
|
def __unicode__(self):
|
|
|
|
return self.description
|
|
|
|
|
2014-09-01 14:21:53 -06:00
|
|
|
|
|
|
|
class Observation(models.Model):
|
|
|
|
"""Model for SatNOGS observations."""
|
2014-10-24 11:12:58 -06:00
|
|
|
satellite = models.ForeignKey(Satellite)
|
2014-09-17 10:47:58 -06:00
|
|
|
transponder = models.ForeignKey(Transponder, null=True)
|
2014-10-24 11:12:58 -06:00
|
|
|
author = models.ForeignKey(User)
|
2014-09-01 14:21:53 -06:00
|
|
|
start = models.DateTimeField()
|
|
|
|
end = models.DateTimeField()
|
|
|
|
|
2014-09-08 11:36:12 -06:00
|
|
|
@property
|
|
|
|
def is_past(self):
|
|
|
|
return self.end < now()
|
|
|
|
|
|
|
|
@property
|
|
|
|
def is_future(self):
|
|
|
|
return self.end > now()
|
|
|
|
|
2014-10-06 06:14:55 -06:00
|
|
|
def __unicode__(self):
|
|
|
|
return "%d" % self.id
|
|
|
|
|
2014-09-01 14:21:53 -06:00
|
|
|
|
|
|
|
class Data(models.Model):
|
2014-09-08 11:36:12 -06:00
|
|
|
"""Model for observation data."""
|
2014-09-01 14:21:53 -06:00
|
|
|
start = models.DateTimeField()
|
|
|
|
end = models.DateTimeField()
|
2014-10-24 11:12:58 -06:00
|
|
|
observation = models.ForeignKey(Observation)
|
|
|
|
ground_station = models.ForeignKey(Station)
|
2014-10-26 19:14:26 -06:00
|
|
|
payload = models.FileField(upload_to='data_payloads', blank=True, null=True)
|