1
0
Fork 0
satnogs-db/db/api/views.py

182 lines
7.2 KiB
Python
Raw Normal View History

"""SatNOGS DB API django rest framework Views"""
2017-03-02 10:55:10 -07:00
from django.core.files.base import ContentFile
from django.db.models import F
from rest_framework import mixins, status, viewsets
from rest_framework.parsers import FileUploadParser, FormParser, \
MultiPartParser
from rest_framework.permissions import IsAuthenticated
from rest_framework.renderers import BrowsableAPIRenderer, JSONRenderer
from rest_framework.response import Response
from rest_framework.serializers import ValidationError
2015-04-22 05:05:30 -06:00
from db.api import filters, pagination, serializers
from db.api.perms import SafeMethodsWithPermission
from db.api.renderers import BrowserableJSONLDRenderer, JSONLDRenderer
from db.base.helpers import gridsquare
from db.base.models import Artifact, DemodData, LatestTleSet, Mode, \
Satellite, Transmitter
from db.base.tasks import update_satellite
2015-04-22 05:05:30 -06:00
class ModeView(viewsets.ReadOnlyModelViewSet): # pylint: disable=R0901
"""SatNOGS DB Mode API view class"""
renderer_classes = [
JSONRenderer, BrowsableAPIRenderer, JSONLDRenderer, BrowserableJSONLDRenderer
]
2015-08-13 06:57:04 -06:00
queryset = Mode.objects.all()
serializer_class = serializers.ModeSerializer
class SatelliteView(viewsets.ReadOnlyModelViewSet): # pylint: disable=R0901
"""SatNOGS DB Satellite API view class"""
renderer_classes = [
JSONRenderer, BrowsableAPIRenderer, JSONLDRenderer, BrowserableJSONLDRenderer
]
2015-05-03 15:23:07 -06:00
queryset = Satellite.objects.all()
serializer_class = serializers.SatelliteSerializer
filterset_class = filters.SatelliteViewFilter
lookup_field = 'norad_cat_id'
2015-05-03 15:23:07 -06:00
class TransmitterView(viewsets.ReadOnlyModelViewSet): # pylint: disable=R0901
"""SatNOGS DB Transmitter API view class"""
renderer_classes = [
JSONRenderer, BrowsableAPIRenderer, JSONLDRenderer, BrowserableJSONLDRenderer
]
2015-07-23 06:48:58 -06:00
queryset = Transmitter.objects.all()
serializer_class = serializers.TransmitterSerializer
filterset_class = filters.TransmitterViewFilter
lookup_field = 'uuid'
class LatestTleSetView(viewsets.ReadOnlyModelViewSet): # pylint: disable=R0901
"""SatNOGS DB Tle API view class"""
renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
queryset = LatestTleSet.objects.all().select_related('satellite').exclude(
latest_distributable__isnull=True
).annotate(
tle0=F('latest_distributable__tle0'),
tle1=F('latest_distributable__tle1'),
tle2=F('latest_distributable__tle2'),
tle_source=F('latest_distributable__tle_source'),
updated=F('latest_distributable__updated')
)
serializer_class = serializers.LatestTleSetSerializer
filterset_class = filters.LatestTleSetViewFilter
def get_queryset(self):
"""
Returns latest TLE queryset depending on user permissions
"""
if self.request.user.has_perm('base.access_all_tles'):
return LatestTleSet.objects.all().select_related('satellite').exclude(
latest__isnull=True
).annotate(
tle0=F('latest__tle0'),
tle1=F('latest__tle1'),
tle2=F('latest__tle2'),
tle_source=F('latest__tle_source'),
updated=F('latest__updated')
)
return self.queryset
class TelemetryView( # pylint: disable=R0901
mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin,
viewsets.GenericViewSet):
"""SatNOGS DB Telemetry API view class"""
renderer_classes = [
JSONRenderer, BrowsableAPIRenderer, JSONLDRenderer, BrowserableJSONLDRenderer
]
queryset = DemodData.objects.all()
serializer_class = serializers.TelemetrySerializer
filterset_class = filters.TelemetryViewFilter
permission_classes = [SafeMethodsWithPermission]
2017-03-02 10:55:10 -07:00
parser_classes = (FormParser, FileUploadParser)
pagination_class = pagination.LinkedHeaderPageNumberPagination
2017-03-02 10:55:10 -07:00
def create(self, request, *args, **kwargs):
data = {}
2017-11-24 14:58:09 -07:00
norad_cat_id = request.data.get('noradID')
if not Satellite.objects.filter(norad_cat_id=norad_cat_id).exists():
2017-11-24 14:58:09 -07:00
try:
update_satellite(norad_cat_id, update_name=True)
except LookupError:
2017-11-24 14:58:09 -07:00
return Response(status=status.HTTP_400_BAD_REQUEST)
data['satellite'] = Satellite.objects.get(norad_cat_id=norad_cat_id).id
2017-03-02 10:55:10 -07:00
data['station'] = request.data.get('source')
timestamp = request.data.get('timestamp')
data['timestamp'] = timestamp
# Convert coordinates to omit N-S and W-E designators
lat = request.data.get('latitude')
lng = request.data.get('longitude')
2017-04-05 11:28:04 -06:00
if any(x.isalpha() for x in lat):
2017-11-13 03:33:17 -07:00
data['lat'] = (-float(lat[:-1]) if ('S' in lat) else float(lat[:-1]))
2017-04-05 11:28:04 -06:00
else:
data['lat'] = float(lat)
if any(x.isalpha() for x in lng):
2017-11-13 03:33:17 -07:00
data['lng'] = (-float(lng[:-1]) if ('W' in lng) else float(lng[:-1]))
2017-04-05 11:28:04 -06:00
else:
data['lng'] = float(lng)
2017-03-02 10:55:10 -07:00
# Network or SiDS submission?
if request.data.get('satnogs_network'):
data['app_source'] = 'network'
else:
data['app_source'] = 'sids'
2017-03-02 10:55:10 -07:00
# Create file out of frame string
frame = ContentFile(request.data.get('frame'), name='sids')
data['payload_frame'] = frame
# Create observer
try:
qth = gridsquare(data['lat'], data['lng'])
except Exception: # pylint: disable=W0703
data['observer'] = 'Unknown'
else:
observer = '{0}-{1}'.format(data['station'], qth)
data['observer'] = observer
2017-03-02 10:55:10 -07:00
serializer = serializers.SidsSerializer(data=data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(status=status.HTTP_201_CREATED, headers=headers)
class ArtifactView( # pylint: disable=R0901
mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin,
viewsets.GenericViewSet):
"""SatNOGS DB Artifact API view class"""
queryset = Artifact.objects.all()
filterset_class = filters.ArtifactViewFilter
permission_classes = [IsAuthenticated]
parser_classes = (FormParser, MultiPartParser)
pagination_class = pagination.LinkedHeaderPageNumberPagination
def get_serializer_class(self):
"""Returns the right serializer depending on http method that is used"""
if self.action == 'create':
return serializers.NewArtifactSerializer
return serializers.ArtifactSerializer
def create(self, request, *args, **kwargs):
"""Creates artifact"""
serializer = self.get_serializer(data=request.data)
try:
if serializer.is_valid():
data = serializer.save()
http_response = {}
http_response['id'] = data.id
response = Response(http_response, status=status.HTTP_200_OK)
else:
data = serializer.errors
response = Response(data, status=status.HTTP_400_BAD_REQUEST)
except (ValidationError, ValueError, OSError) as error:
response = Response(str(error), status=status.HTTP_400_BAD_REQUEST)
return response