Coverage for shps/api_views.py: 100%
60 statements
« prev ^ index » next coverage.py v7.6.0, created at 2024-07-27 11:19 +0000
« prev ^ index » next coverage.py v7.6.0, created at 2024-07-27 11:19 +0000
1import coreapi
2import coreschema
3from dateutil.parser import parse
4from django.contrib.gis.geos import Point
5from django_filters.rest_framework import DjangoFilterBackend
7from rest_framework.schemas import AutoSchema
8from rest_framework import generics
9from rest_framework import viewsets
10from rest_framework.filters import OrderingFilter
11from rest_framework.pagination import PageNumberPagination
12from rest_framework_gis.pagination import GeoJsonPagination
14from .models import TempSpatial, Source
15from .filters import TempSpatialListFilter, SourceListFilter
16from .api_serializers import TempSpatialSerializer, SourceSerializer, SimpleSerializer
19class SimpledResultsSetPagination(PageNumberPagination):
20 page_size = 1000
21 page_size_query_param = "page_size"
24class StandardResultsSetPagination(GeoJsonPagination):
25 page_size = 1
26 page_size_query_param = "page_size"
27 max_page_size = 25
30class TempSpatialViewSet(viewsets.ModelViewSet):
31 """
32 API endpoint that allows TempSpatial objects to be viewed or edited.
33 """
35 queryset = TempSpatial.objects.all()
36 serializer_class = TempSpatialSerializer
37 pagination_class = StandardResultsSetPagination
38 filter_backends = [DjangoFilterBackend, OrderingFilter]
39 filterset_class = TempSpatialListFilter
42class SimpleViewSet(viewsets.ModelViewSet):
43 """
44 API endpoint for TempSpatial objects (without GIS data-points)
45 """
47 queryset = TempSpatial.objects.all()
48 serializer_class = SimpleSerializer
49 pagination_class = SimpledResultsSetPagination
50 filter_backends = [DjangoFilterBackend, OrderingFilter]
51 filterset_class = TempSpatialListFilter
54class SourceViewSet(viewsets.ModelViewSet):
55 """
56 API endpoint that allows TempSpatial objects to be viewed or edited.
57 """
59 queryset = Source.objects.all()
60 serializer_class = SourceSerializer
61 filter_backends = [DjangoFilterBackend, OrderingFilter]
62 filterset_class = SourceListFilter
65class TemporalizedSpatialQuery(generics.ListAPIView):
66 """
67 API endpoint that allows to query TempSpatial objects with long/lat and temp.
68 """
70 serializer_class = TempSpatialSerializer
71 pagination_class = StandardResultsSetPagination
72 schema = AutoSchema(
73 manual_fields=[
74 coreapi.Field(
75 "page_size",
76 required=False,
77 location="query",
78 schema=coreschema.String(
79 description="Defaults to 1 due to performance reasons."
80 ),
81 ),
82 coreapi.Field(
83 "lat",
84 required=True,
85 location="query",
86 schema=coreschema.String(
87 description="Latitude of the place to query for."
88 ),
89 ),
90 coreapi.Field(
91 name="lng",
92 required=True,
93 location="query",
94 schema=coreschema.String(
95 description="Longitude of the place to query for."
96 ),
97 ),
98 coreapi.Field(
99 "when",
100 required=False,
101 location="query",
102 schema=coreschema.String(
103 description="Date the TempSpatial temporal extent has to contain."
104 ),
105 ),
106 ]
107 )
109 def get_queryset(self):
110 lat = self.request.query_params.get("lat", None)
111 lng = self.request.query_params.get("lng", None)
112 try:
113 pnt = Point(float(lng), float(lat))
114 print("good")
115 except TypeError:
116 return []
117 qs = TempSpatial.objects.filter(geom__contains=pnt)
118 when = self.request.query_params.get("when", None)
119 if when is not None:
120 try:
121 when = parse(when)
122 except ValueError:
123 when = None
124 if when:
125 qs = qs.filter(temp_extent__contains=when)
126 return qs.order_by("spatial_extent")