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

1import coreapi 

2import coreschema 

3from dateutil.parser import parse 

4from django.contrib.gis.geos import Point 

5from django_filters.rest_framework import DjangoFilterBackend 

6 

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 

13 

14from .models import TempSpatial, Source 

15from .filters import TempSpatialListFilter, SourceListFilter 

16from .api_serializers import TempSpatialSerializer, SourceSerializer, SimpleSerializer 

17 

18 

19class SimpledResultsSetPagination(PageNumberPagination): 

20 page_size = 1000 

21 page_size_query_param = "page_size" 

22 

23 

24class StandardResultsSetPagination(GeoJsonPagination): 

25 page_size = 1 

26 page_size_query_param = "page_size" 

27 max_page_size = 25 

28 

29 

30class TempSpatialViewSet(viewsets.ModelViewSet): 

31 """ 

32 API endpoint that allows TempSpatial objects to be viewed or edited. 

33 """ 

34 

35 queryset = TempSpatial.objects.all() 

36 serializer_class = TempSpatialSerializer 

37 pagination_class = StandardResultsSetPagination 

38 filter_backends = [DjangoFilterBackend, OrderingFilter] 

39 filterset_class = TempSpatialListFilter 

40 

41 

42class SimpleViewSet(viewsets.ModelViewSet): 

43 """ 

44 API endpoint for TempSpatial objects (without GIS data-points) 

45 """ 

46 

47 queryset = TempSpatial.objects.all() 

48 serializer_class = SimpleSerializer 

49 pagination_class = SimpledResultsSetPagination 

50 filter_backends = [DjangoFilterBackend, OrderingFilter] 

51 filterset_class = TempSpatialListFilter 

52 

53 

54class SourceViewSet(viewsets.ModelViewSet): 

55 """ 

56 API endpoint that allows TempSpatial objects to be viewed or edited. 

57 """ 

58 

59 queryset = Source.objects.all() 

60 serializer_class = SourceSerializer 

61 filter_backends = [DjangoFilterBackend, OrderingFilter] 

62 filterset_class = SourceListFilter 

63 

64 

65class TemporalizedSpatialQuery(generics.ListAPIView): 

66 """ 

67 API endpoint that allows to query TempSpatial objects with long/lat and temp. 

68 """ 

69 

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 ) 

108 

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")