2015-07-17 11:23:23 -06:00
|
|
|
import logging
|
2017-03-31 02:32:03 -06:00
|
|
|
from socket import error as socket_error
|
2015-07-17 11:23:23 -06:00
|
|
|
|
2017-03-31 02:32:03 -06:00
|
|
|
from django.conf.urls import url
|
|
|
|
from django.contrib import admin, messages
|
2015-05-09 02:39:14 -06:00
|
|
|
from django.core.urlresolvers import reverse
|
2015-07-17 11:23:23 -06:00
|
|
|
from django.template.loader import render_to_string
|
|
|
|
from django.conf import settings
|
|
|
|
from django.contrib.sites.shortcuts import get_current_site
|
2017-03-31 02:32:03 -06:00
|
|
|
from django.http import HttpResponseRedirect
|
2018-08-18 18:43:02 -06:00
|
|
|
from django.shortcuts import redirect
|
2015-04-22 05:05:30 -06:00
|
|
|
|
2017-03-02 10:54:27 -07:00
|
|
|
from db.base.models import Mode, Satellite, Transmitter, Suggestion, DemodData, Telemetry
|
2018-08-18 18:43:02 -06:00
|
|
|
from db.base.tasks import check_celery, reset_decoded_data, decode_all_data
|
2017-03-31 02:32:03 -06:00
|
|
|
|
2015-04-22 05:05:30 -06:00
|
|
|
|
2015-07-17 11:23:23 -06:00
|
|
|
logger = logging.getLogger('db')
|
|
|
|
|
2015-07-17 11:59:23 -06:00
|
|
|
|
2015-08-13 06:36:02 -06:00
|
|
|
@admin.register(Mode)
|
|
|
|
class ModeAdmin(admin.ModelAdmin):
|
|
|
|
list_display = ('name',)
|
|
|
|
|
|
|
|
|
2015-04-25 10:47:22 -06:00
|
|
|
@admin.register(Satellite)
|
2015-04-22 05:05:30 -06:00
|
|
|
class SatelliteAdmin(admin.ModelAdmin):
|
2019-01-07 09:09:57 -07:00
|
|
|
list_display = ('name', 'norad_cat_id', 'status')
|
|
|
|
search_fields = ('name', 'norad_cat_id')
|
|
|
|
list_filter = ('status',)
|
2015-04-22 05:05:30 -06:00
|
|
|
|
2017-03-31 02:32:03 -06:00
|
|
|
def get_urls(self):
|
|
|
|
urls = super(SatelliteAdmin, self).get_urls()
|
|
|
|
my_urls = [
|
|
|
|
url(r'^check_celery/$', self.check_celery, name='check_celery'),
|
2018-08-18 18:43:02 -06:00
|
|
|
url(r'^reset_data/(?P<norad>[0-9]+)/$', self.reset_data,
|
|
|
|
name='reset_data'),
|
|
|
|
url(r'^decode_all_data/(?P<norad>[0-9]+)/$', self.decode_all_data,
|
|
|
|
name='decode_all_data'),
|
2017-03-31 02:32:03 -06:00
|
|
|
]
|
|
|
|
return my_urls + urls
|
|
|
|
|
|
|
|
def check_celery(self, request):
|
|
|
|
try:
|
|
|
|
investigator = check_celery.delay()
|
|
|
|
except socket_error as e:
|
|
|
|
messages.error(request, 'Cannot connect to broker: %s' % e)
|
|
|
|
return HttpResponseRedirect(reverse('admin:index'))
|
|
|
|
|
|
|
|
try:
|
|
|
|
investigator.get(timeout=5)
|
|
|
|
except investigator.TimeoutError as e:
|
|
|
|
messages.error(request, 'Worker timeout: %s' % e)
|
|
|
|
else:
|
|
|
|
messages.success(request, 'Celery is OK')
|
|
|
|
finally:
|
|
|
|
return HttpResponseRedirect(reverse('admin:index'))
|
|
|
|
|
2018-08-18 18:43:02 -06:00
|
|
|
# resets all decoded data and changes the is_decoded flag back to False
|
|
|
|
# THIS IS VERY DISTRUCTIVE, but the expectation is that a decode_all_data
|
|
|
|
# would follow.
|
|
|
|
def reset_data(self, request, norad):
|
|
|
|
reset_decoded_data.delay(norad)
|
|
|
|
messages.success(request, 'Data reset task was triggered successfully!')
|
|
|
|
return redirect(reverse('admin:index'))
|
|
|
|
|
|
|
|
# force a decode of all data for a norad ID. This could be very resource
|
|
|
|
# intensive but necessary when catching a satellite up with a new decoder
|
|
|
|
def decode_all_data(self, request, norad):
|
|
|
|
decode_all_data.delay(norad)
|
|
|
|
messages.success(request, 'Decode task was triggered successfully!')
|
|
|
|
return redirect(reverse('admin:index'))
|
|
|
|
|
2015-04-22 05:05:30 -06:00
|
|
|
|
2015-07-23 06:48:58 -06:00
|
|
|
@admin.register(Transmitter)
|
|
|
|
class TransmitterAdmin(admin.ModelAdmin):
|
2018-12-09 01:51:24 -07:00
|
|
|
list_display = ('uuid', 'description', 'satellite', 'type', 'alive', 'mode', 'uplink_low',
|
|
|
|
'uplink_high', 'uplink_drift', 'downlink_low', 'downlink_high',
|
|
|
|
'downlink_drift', 'baud',)
|
|
|
|
search_fields = ('satellite__id', 'uuid', 'satellite__name', 'satellite__norad_cat_id')
|
|
|
|
list_filter = ('type', 'alive', 'mode', 'baud',)
|
2015-05-09 02:38:39 -06:00
|
|
|
readonly_fields = ('uuid', 'satellite', 'approved',)
|
2015-04-22 05:05:30 -06:00
|
|
|
|
|
|
|
|
2015-04-25 10:47:22 -06:00
|
|
|
@admin.register(Suggestion)
|
|
|
|
class SuggestionAdmin(admin.ModelAdmin):
|
2018-12-09 01:51:24 -07:00
|
|
|
list_display = ('uuid', 'description', 'transmitter_uuid', 'user', 'type', 'satellite',
|
|
|
|
'uplink_low', 'uplink_high', 'uplink_drift', 'downlink_low', 'downlink_high',
|
|
|
|
'downlink_drift',)
|
2015-05-09 02:38:39 -06:00
|
|
|
search_fields = ('satellite', 'uuid',)
|
2018-12-09 01:51:24 -07:00
|
|
|
list_filter = ('type', 'mode',)
|
2015-07-23 06:48:58 -06:00
|
|
|
readonly_fields = ('uuid', 'satellite', 'transmitter', 'approved', 'user',
|
|
|
|
'citation', 'transmitter_data')
|
2015-07-07 06:09:34 -06:00
|
|
|
actions = ['approve_suggestion']
|
|
|
|
|
|
|
|
def approve_suggestion(self, request, queryset):
|
|
|
|
for obj in queryset:
|
2015-09-27 13:32:03 -06:00
|
|
|
try:
|
|
|
|
transmitter = Transmitter.objects.get(id=obj.transmitter.id)
|
|
|
|
transmitter.update_from_suggestion(obj)
|
|
|
|
obj.delete()
|
|
|
|
except (Transmitter.DoesNotExist, AttributeError):
|
2016-05-06 11:19:02 -06:00
|
|
|
obj.approved = True
|
|
|
|
obj.citation = ''
|
|
|
|
obj.user = None
|
2015-09-27 13:32:03 -06:00
|
|
|
obj.save()
|
2015-07-17 11:23:23 -06:00
|
|
|
|
|
|
|
# Notify user
|
|
|
|
current_site = get_current_site(request)
|
|
|
|
subject = '[{0}] Your suggestion was approved'.format(current_site.name)
|
|
|
|
template = 'emails/suggestion_approved.txt'
|
|
|
|
data = {
|
2017-04-30 14:39:46 -06:00
|
|
|
'satname': obj.satellite.name
|
2015-07-17 11:23:23 -06:00
|
|
|
}
|
|
|
|
message = render_to_string(template, {'data': data})
|
|
|
|
try:
|
|
|
|
obj.user.email_user(subject, message, from_email=settings.DEFAULT_FROM_EMAIL)
|
2018-07-14 11:42:17 -06:00
|
|
|
except Exception:
|
2015-07-17 11:23:23 -06:00
|
|
|
logger.error(
|
|
|
|
'Could not send email to user',
|
|
|
|
exc_info=True
|
|
|
|
)
|
|
|
|
|
2015-07-07 06:09:34 -06:00
|
|
|
rows_updated = queryset.count()
|
|
|
|
|
|
|
|
# Print a message
|
|
|
|
if rows_updated == 1:
|
|
|
|
message_bit = '1 suggestion was'
|
|
|
|
else:
|
|
|
|
message_bit = '{0} suggestions were'.format(rows_updated)
|
|
|
|
self.message_user(request, '{0} successfully approved.'.format(message_bit))
|
|
|
|
|
|
|
|
approve_suggestion.short_description = 'Approve selected suggestions'
|
2015-05-09 02:38:39 -06:00
|
|
|
|
2015-07-23 06:48:58 -06:00
|
|
|
def transmitter_uuid(self, obj):
|
2015-05-09 02:38:39 -06:00
|
|
|
try:
|
2015-07-23 06:48:58 -06:00
|
|
|
return obj.transmitter.uuid
|
2018-07-14 11:42:17 -06:00
|
|
|
except Exception:
|
2015-05-09 02:38:39 -06:00
|
|
|
return '-'
|
2015-05-09 02:39:14 -06:00
|
|
|
|
2015-07-23 06:48:58 -06:00
|
|
|
def transmitter_data(self, obj):
|
|
|
|
if obj.transmitter:
|
|
|
|
redirect_url = reverse('admin:base_transmitter_changelist')
|
|
|
|
extra = '{0}'.format(obj.transmitter.pk)
|
|
|
|
return '<a href="{0}">Transmitter Initial Data</a>'.format(
|
2015-05-09 02:39:14 -06:00
|
|
|
redirect_url + extra)
|
|
|
|
else:
|
|
|
|
return '-'
|
2015-07-23 06:48:58 -06:00
|
|
|
transmitter_data.allow_tags = True
|
2016-05-06 11:20:09 -06:00
|
|
|
|
|
|
|
|
2017-03-02 10:54:27 -07:00
|
|
|
@admin.register(Telemetry)
|
|
|
|
class TelemetryAdmin(admin.ModelAdmin):
|
|
|
|
list_display = ('name', 'decoder')
|
|
|
|
|
|
|
|
|
2016-05-06 11:20:09 -06:00
|
|
|
@admin.register(DemodData)
|
|
|
|
class DemodDataAdmin(admin.ModelAdmin):
|
2017-03-14 13:21:17 -06:00
|
|
|
list_display = ('id', 'satellite', 'source', 'observer')
|
2017-03-02 10:54:27 -07:00
|
|
|
search_fields = ('transmitter__uuid', 'satellite__norad_cat_id', 'observer')
|
2016-05-06 11:20:09 -06:00
|
|
|
|
|
|
|
def satellite(self, obj):
|
2017-03-02 10:54:27 -07:00
|
|
|
return obj.satellite
|