1
0
Fork 0
satnogs-network/network/base/utils.py

106 lines
3.5 KiB
Python

import csv
import urllib
import urllib2
from datetime import datetime
from django.conf import settings
from django.contrib.admin.helpers import label_for_field
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
from requests.exceptions import HTTPError, ReadTimeout
from network.base.models import DemodData
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
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
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