2018-09-24 02:20:02 -06:00
|
|
|
import csv
|
2019-02-06 19:08:28 -07:00
|
|
|
import urllib
|
|
|
|
import urllib2
|
2018-09-24 02:20:02 -06:00
|
|
|
from django.http import HttpResponse
|
|
|
|
from django.core.exceptions import PermissionDenied
|
|
|
|
from django.contrib.admin.helpers import label_for_field
|
2019-02-06 19:08:28 -07:00
|
|
|
from django.conf import settings
|
|
|
|
from requests.exceptions import ReadTimeout, HTTPError
|
|
|
|
from network.base.models import DemodData
|
|
|
|
from datetime import datetime
|
2018-09-24 02:20:02 -06:00
|
|
|
|
|
|
|
|
|
|
|
def export_as_csv(modeladmin, request, queryset):
|
|
|
|
if not request.user.is_staff:
|
|
|
|
raise PermissionDenied
|
|
|
|
opts = modeladmin.model._meta
|
|
|
|
field_names = modeladmin.list_display
|
|
|
|
if 'action_checkbox' in field_names:
|
|
|
|
field_names.remove('action_checkbox')
|
|
|
|
|
|
|
|
response = HttpResponse(content_type="text/csv")
|
|
|
|
response['Content-Disposition'] = 'attachment; filename=%s.csv' % unicode(opts)\
|
|
|
|
.replace('.', '_')
|
|
|
|
|
|
|
|
writer = csv.writer(response)
|
|
|
|
headers = []
|
|
|
|
for field_name in list(field_names):
|
|
|
|
label = label_for_field(field_name, modeladmin.model, modeladmin)
|
|
|
|
if label.islower():
|
|
|
|
label = label.title()
|
|
|
|
headers.append(label)
|
|
|
|
writer.writerow(headers)
|
|
|
|
for row in queryset:
|
|
|
|
values = []
|
|
|
|
for field in field_names:
|
|
|
|
try:
|
|
|
|
value = (getattr(row, field))
|
|
|
|
except AttributeError:
|
|
|
|
value = (getattr(modeladmin, field))
|
|
|
|
if callable(value):
|
|
|
|
try:
|
|
|
|
# get value from model
|
|
|
|
value = value()
|
|
|
|
except Exception:
|
|
|
|
# get value from modeladmin e.g: admin_method_1
|
|
|
|
value = value(row)
|
|
|
|
if value is None:
|
|
|
|
value = ''
|
|
|
|
values.append(unicode(value).encode('utf-8'))
|
|
|
|
writer.writerow(values)
|
|
|
|
return response
|
2019-02-06 19:08:28 -07:00
|
|
|
|
|
|
|
|
2019-05-01 04:41:36 -06:00
|
|
|
def export_station_status(self, request, queryset):
|
|
|
|
meta = self.model._meta
|
|
|
|
field_names = ["id", "status"]
|
|
|
|
|
|
|
|
response = HttpResponse(content_type='text/csv')
|
|
|
|
response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
|
|
|
|
writer = csv.writer(response)
|
|
|
|
|
|
|
|
writer.writerow(field_names)
|
|
|
|
for obj in queryset:
|
|
|
|
writer.writerow([getattr(obj, field) for field in field_names])
|
|
|
|
|
|
|
|
return response
|
|
|
|
|
|
|
|
|
2019-02-06 19:08:28 -07:00
|
|
|
def demod_to_db(frame_id):
|
|
|
|
"""Task to send a frame from SatNOGS network to SatNOGS db"""
|
|
|
|
frame = DemodData.objects.get(id=frame_id)
|
|
|
|
obs = frame.observation
|
|
|
|
sat = obs.satellite
|
|
|
|
ground_station = obs.ground_station
|
|
|
|
|
|
|
|
# need to abstract the timestamp from the filename. hacky..
|
|
|
|
file_datetime = frame.payload_demod.name.split('/')[2].split('_')[2]
|
|
|
|
frame_datetime = datetime.strptime(file_datetime, '%Y-%m-%dT%H-%M-%S')
|
|
|
|
submit_datetime = datetime.strftime(frame_datetime,
|
|
|
|
'%Y-%m-%dT%H:%M:%S.000Z')
|
|
|
|
|
|
|
|
# SiDS parameters
|
|
|
|
params = {}
|
|
|
|
params['noradID'] = sat.norad_cat_id
|
|
|
|
params['source'] = ground_station.name
|
|
|
|
params['timestamp'] = submit_datetime
|
|
|
|
params['locator'] = 'longLat'
|
|
|
|
params['longitude'] = ground_station.lng
|
|
|
|
params['latitude'] = ground_station.lat
|
|
|
|
params['frame'] = frame.display_payload().replace(' ', '')
|
|
|
|
params['satnogs_network'] = 'True' # NOT a part of SiDS
|
|
|
|
|
|
|
|
apiurl = settings.DB_API_ENDPOINT
|
|
|
|
telemetry_url = "{0}telemetry/".format(apiurl)
|
|
|
|
|
|
|
|
try:
|
|
|
|
res = urllib2.urlopen(telemetry_url, urllib.urlencode(params))
|
|
|
|
code = str(res.getcode())
|
|
|
|
if code.startswith('2'):
|
|
|
|
frame.copied_to_db = True
|
|
|
|
frame.save()
|
|
|
|
except (ReadTimeout, HTTPError):
|
|
|
|
return
|