1
0
Fork 0
satnogs-db/db/base/admin.py

160 lines
6.8 KiB
Python
Raw Normal View History

from datetime import datetime
import logging
from socket import error as socket_error
from django.conf.urls import url
from django.contrib import admin, messages
from django.urls import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
2015-04-22 05:05:30 -06:00
from db.base.models import (Mode, Satellite, TransmitterEntry, TransmitterSuggestion,
Transmitter, DemodData, Telemetry)
from db.base.tasks import check_celery, reset_decoded_data, decode_all_data
2015-04-22 05:05:30 -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-19 10:27:48 -07:00
list_display = ('name', 'norad_cat_id', 'status', 'decayed')
search_fields = ('name', 'norad_cat_id')
2019-01-19 10:27:48 -07:00
list_filter = ('status', 'decayed')
2015-04-22 05:05:30 -06:00
def get_urls(self):
urls = super(SatelliteAdmin, self).get_urls()
my_urls = [
url(r'^check_celery/$', self.check_celery, name='check_celery'),
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'),
]
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'))
# 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
@admin.register(TransmitterEntry)
class TransmitterEntryAdmin(admin.ModelAdmin):
list_display = ('uuid', 'description', 'satellite', 'type', 'mode', 'baud', 'downlink_low',
'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high', 'uplink_drift',
'reviewed', 'approved', 'status', 'created', 'citation', 'user')
search_fields = ('satellite__id', 'uuid', 'satellite__name', 'satellite__norad_cat_id')
list_filter = ('reviewed', 'approved', 'type', 'status', 'mode', 'baud',)
readonly_fields = ('uuid', 'satellite')
2015-04-22 05:05:30 -06:00
@admin.register(TransmitterSuggestion)
class TransmitterSuggestionAdmin(admin.ModelAdmin):
list_display = ('uuid', 'description', 'satellite', 'type', 'mode', 'baud', 'downlink_low',
'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high', 'uplink_drift',
'status', 'created', 'citation', 'user')
search_fields = ('satellite__id', 'uuid', 'satellite__name', 'satellite__norad_cat_id')
list_filter = ('type', 'mode', 'baud',)
readonly_fields = ('uuid', 'description', 'status', 'type', 'uplink_low', 'uplink_high',
'uplink_drift', 'downlink_low', 'downlink_high', 'downlink_drift', 'mode',
'invert', 'baud', 'satellite', 'reviewed', 'approved', 'created',
'citation', 'user')
actions = ['approve_suggestion', 'reject_suggestion']
def get_actions(self, request):
actions = super(TransmitterSuggestionAdmin, self).get_actions(request)
if not request.user.has_perm('base.delete_transmittersuggestion'):
if 'delete_selected' in actions:
del actions['delete_selected']
return actions
2015-07-07 06:09:34 -06:00
def approve_suggestion(self, request, queryset):
queryset_size = len(queryset)
for entry in queryset:
entry.approved = True
entry.reviewed = True
entry.created = datetime.utcnow()
entry.user = request.user
entry.save()
# After creating the new approved entries, we update the suggestion entries as reviewed
# Note that queryset.update doesn't use model's save() that creates new entries
queryset.update(reviewed=True, approved=True)
if queryset_size == 1:
self.message_user(request, "Transmitter suggestion was successfully approved")
2015-07-07 06:09:34 -06:00
else:
self.message_user(request, "Transmitter suggestions were successfully approved")
approve_suggestion.short_description = 'Approve selected transmitter suggestions'
def reject_suggestion(self, request, queryset):
queryset_size = len(queryset)
for entry in queryset:
entry.created = datetime.utcnow()
entry.user = request.user
entry.approved = False
entry.reviewed = True
entry.save()
# After creating the new approved entries, we update the suggestion entries as reviewed
# Note that queryset.update doesn't use model's save() that creates new entries
queryset.update(reviewed=True, approved=False)
if queryset_size == 1:
self.message_user(request, "Transmitter suggestion was successfully rejected")
else:
self.message_user(request, "Transmitter suggestions were successfully rejected")
reject_suggestion.short_description = 'Reject selected transmitter suggestions'
2015-07-07 06:09:34 -06:00
2015-05-09 02:38:39 -06:00
@admin.register(Transmitter)
class TransmitterAdmin(admin.ModelAdmin):
list_display = ('uuid', 'description', 'satellite', 'type', 'mode', 'baud', 'downlink_low',
'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high', 'uplink_drift',
'status', 'created', 'citation', 'user')
search_fields = ('satellite__id', 'uuid', 'satellite__name', 'satellite__norad_cat_id')
list_filter = ('type', 'status', 'mode', 'baud',)
readonly_fields = ('uuid', 'satellite')
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):
list_display = ('id', 'satellite', 'app_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