views.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals, division, print_function
  3. from rest_framework import viewsets
  4. from django.conf import settings
  5. from panorama.models import Point, Panorama, ReferencePoint, Reference
  6. from .serializers import *
  7. class ReferencePointViewSet(viewsets.ModelViewSet):
  8. queryset = ReferencePoint.objects.all()
  9. serializer_class = ReferencePointSerializer
  10. def get_queryset(self):
  11. """
  12. Allow to filter reference points, by only considering those in a
  13. disc around a given geographic position.
  14. Example filter:
  15. /api/v1/refpoints/?lat=42&lon=42&dist=10000
  16. returns all reference points around (42°, 42°) at less than 10
  17. kilometers.
  18. """
  19. queryset = ReferencePoint.objects.all()
  20. lat = self.request.query_params.get('lat', None)
  21. lon = self.request.query_params.get('lon', None)
  22. # In meters
  23. distance = self.request.query_params.get('dist', None)
  24. if distance is not None:
  25. distance = int(distance)
  26. else:
  27. distance = settings.PANORAMA_MAX_DISTANCE
  28. if lat is not None and lon is not None:
  29. p = Point(float(lat), float(lon), 0)
  30. # Filter refpoints based on their (great circle) distance to
  31. # the parameter point. The database can't do it, so we load
  32. # all objects and filter them in Python.
  33. refpoints = [refpoint.id for refpoint in ReferencePoint.objects.all()
  34. if p.great_circle_distance(refpoint) <= distance]
  35. queryset = queryset.filter(id__in=refpoints)
  36. return queryset
  37. class PanoramaViewSet(viewsets.ModelViewSet):
  38. queryset = Panorama.objects.all()
  39. serializer_class = PanoramaSerializer
  40. class ReferenceViewSet(viewsets.ModelViewSet):
  41. queryset = Reference.objects.all()
  42. serializer_class = ReferenceSerializer