Skip to content

Commit 17a0bac

Browse files
authored
Add CachedAPIViewMixin to all API endpoints (#62)
1 parent 0ca8f04 commit 17a0bac

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

vbos/datasets/views.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import django_filters.rest_framework
2+
from django.utils.decorators import method_decorator
3+
from django.views.decorators.cache import cache_control
24
from drf_excel.mixins import XLSXFileMixin
35
from drf_excel.renderers import XLSXRenderer
46
from rest_framework.generics import ListAPIView, RetrieveAPIView
@@ -41,21 +43,35 @@
4143
)
4244

4345

44-
class ClusterListView(ListAPIView):
46+
class CachedAPIViewMixin:
47+
"""
48+
Mixin to add cache headers to list and retrieve API views
49+
"""
50+
51+
@method_decorator(cache_control(public=True, max_age=86400))
52+
def list(self, request, *args, **kwargs):
53+
return super().list(request, *args, **kwargs)
54+
55+
@method_decorator(cache_control(public=True, max_age=86400))
56+
def retrieve(self, request, *args, **kwargs):
57+
return super().retrieve(request, *args, **kwargs)
58+
59+
60+
class ClusterListView(CachedAPIViewMixin, ListAPIView):
4561
queryset = Cluster.objects.all()
4662
serializer_class = ClusterSerializer
4763
permission_classes = [IsAuthenticatedOrReadOnly]
4864
pagination_class = StandardResultsSetPagination
4965

5066

51-
class ProvinceListView(ListAPIView):
67+
class ProvinceListView(CachedAPIViewMixin, ListAPIView):
5268
queryset = Province.objects.all()
5369
serializer_class = ProvinceSerializer
5470
permission_classes = [IsAuthenticatedOrReadOnly]
5571
pagination_class = GeoJsonPagination
5672

5773

58-
class AreaCouncilListView(ListAPIView):
74+
class AreaCouncilListView(CachedAPIViewMixin, ListAPIView):
5975
serializer_class = AreaCouncilSerializer
6076
permission_classes = [IsAuthenticatedOrReadOnly]
6177
pagination_class = GeoJsonPagination
@@ -66,49 +82,49 @@ def get_queryset(self):
6682
).select_related("province")
6783

6884

69-
class RasterDatasetListView(ListAPIView):
85+
class RasterDatasetListView(CachedAPIViewMixin, ListAPIView):
7086
queryset = RasterDataset.objects.all().select_related("cluster")
7187
serializer_class = RasterDatasetSerializer
7288
permission_classes = [IsAuthenticatedOrReadOnly]
7389
pagination_class = StandardResultsSetPagination
7490
filterset_class = RasterDatasetFilter
7591

7692

77-
class RasterDatasetDetailView(RetrieveAPIView):
93+
class RasterDatasetDetailView(CachedAPIViewMixin, RetrieveAPIView):
7894
queryset = RasterDataset.objects.all()
7995
serializer_class = RasterDatasetSerializer
8096
permission_classes = [IsAuthenticatedOrReadOnly]
8197

8298

83-
class PMTilesDatasetListView(ListAPIView):
99+
class PMTilesDatasetListView(CachedAPIViewMixin, ListAPIView):
84100
queryset = PMTilesDataset.objects.all().select_related("cluster")
85101
serializer_class = PMTilesDatasetSerializer
86102
permission_classes = [IsAuthenticatedOrReadOnly]
87103
pagination_class = StandardResultsSetPagination
88104
filterset_class = PMTilesDatasetFilter
89105

90106

91-
class PMTilesDatasetDetailView(RetrieveAPIView):
107+
class PMTilesDatasetDetailView(CachedAPIViewMixin, RetrieveAPIView):
92108
queryset = PMTilesDataset.objects.all()
93109
serializer_class = PMTilesDatasetSerializer
94110
permission_classes = [IsAuthenticatedOrReadOnly]
95111

96112

97-
class VectorDatasetListView(ListAPIView):
113+
class VectorDatasetListView(CachedAPIViewMixin, ListAPIView):
98114
queryset = VectorDataset.objects.all().select_related("cluster")
99115
serializer_class = VectorDatasetSerializer
100116
permission_classes = [IsAuthenticatedOrReadOnly]
101117
pagination_class = StandardResultsSetPagination
102118
filterset_class = VectorDatasetFilter
103119

104120

105-
class VectorDatasetDetailView(RetrieveAPIView):
121+
class VectorDatasetDetailView(CachedAPIViewMixin, RetrieveAPIView):
106122
queryset = VectorDataset.objects.all()
107123
serializer_class = VectorDatasetSerializer
108124
permission_classes = [IsAuthenticatedOrReadOnly]
109125

110126

111-
class VectorDatasetDataView(ListAPIView):
127+
class VectorDatasetDataView(CachedAPIViewMixin, ListAPIView):
112128
serializer_class = VectorItemSerializer
113129
permission_classes = [IsAuthenticatedOrReadOnly]
114130
pagination_class = GeoJsonPagination
@@ -125,21 +141,21 @@ def get_queryset(self):
125141
)
126142

127143

128-
class TabularDatasetListView(ListAPIView):
144+
class TabularDatasetListView(CachedAPIViewMixin, ListAPIView):
129145
queryset = TabularDataset.objects.all().select_related("cluster")
130146
serializer_class = TabularDatasetSerializer
131147
permission_classes = [IsAuthenticatedOrReadOnly]
132148
pagination_class = StandardResultsSetPagination
133149
filterset_class = TabularDatasetFilter
134150

135151

136-
class TabularDatasetDetailView(RetrieveAPIView):
152+
class TabularDatasetDetailView(CachedAPIViewMixin, RetrieveAPIView):
137153
queryset = TabularDataset.objects.all()
138154
serializer_class = TabularDatasetSerializer
139155
permission_classes = [IsAuthenticatedOrReadOnly]
140156

141157

142-
class TabularDatasetDataView(ListAPIView):
158+
class TabularDatasetDataView(CachedAPIViewMixin, ListAPIView):
143159
filterset_class = TabularItemFilter
144160
permission_classes = [IsAuthenticatedOrReadOnly]
145161
serializer_class = TabularItemSerializer

0 commit comments

Comments
 (0)