11import django_filters .rest_framework
2+ from django .utils .decorators import method_decorator
3+ from django .views .decorators .cache import cache_control
24from drf_excel .mixins import XLSXFileMixin
35from drf_excel .renderers import XLSXRenderer
46from rest_framework .generics import ListAPIView , RetrieveAPIView
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