Skip to content

Commit 8538217

Browse files
authored
Separate endpoint to export tabular data as xlsx file (#41)
1 parent 7a6ed07 commit 8538217

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

vbos/datasets/test/test_tabular_views.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,6 @@ def test_tabular_datasets_data(self):
163163
assert req.data.get("results")[0]["attribute"] == "Employed Population"
164164
assert req.data.get("results")[0]["additional_value"] == "test"
165165

166-
# test xlsx format
167-
req = self.client.get(url, {"format": "xlsx"})
168-
assert req.status_code == status.HTTP_200_OK
169-
170166
def test_filter_data(self):
171167
url = reverse("datasets:tabular-data", args=[self.dataset_2.id])
172168
req = self.client.get(url, {"date_after": "2025-01-01"})
@@ -199,3 +195,15 @@ def test_filter_data(self):
199195
req = self.client.get(url, {"attribute": "population"})
200196
assert req.status_code == status.HTTP_200_OK
201197
assert req.data.get("count") == 4
198+
199+
def test_xlsx_format(self):
200+
url = reverse("datasets:tabular-data-xlsx", args=[self.dataset_1.id])
201+
req = self.client.get(url)
202+
assert req.status_code == status.HTTP_200_OK
203+
assert (
204+
req.headers["Content-Type"]
205+
== "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8"
206+
)
207+
assert req.headers[
208+
"content-disposition"
209+
] == "attachment; filename=vbos-mis-tabular-{}.xlsx".format(self.dataset_1.id)

vbos/datasets/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@
4343
views.TabularDatasetDataView.as_view(),
4444
name="tabular-data",
4545
),
46+
path(
47+
"tabular/<int:pk>/data-xlsx/",
48+
views.TabularDatasetXSLXDataView.as_view(),
49+
name="tabular-data-xlsx",
50+
),
4651
]

vbos/datasets/views.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
from django.shortcuts import render
21
import django_filters.rest_framework
32
from rest_framework.generics import ListAPIView, RetrieveAPIView
43
from rest_framework.permissions import IsAuthenticatedOrReadOnly
54
from rest_framework_gis.pagination import GeoJsonPagination
65
from rest_framework_gis.filters import InBBoxFilter
6+
from drf_excel.mixins import XLSXFileMixin
7+
from drf_excel.renderers import XLSXRenderer
8+
79

810
from vbos.datasets.filters import (
911
RasterDatasetFilter,
@@ -122,12 +124,16 @@ class TabularDatasetDetailView(RetrieveAPIView):
122124
class TabularDatasetDataView(ListAPIView):
123125
filterset_class = TabularItemFilter
124126
permission_classes = [IsAuthenticatedOrReadOnly]
127+
serializer_class = TabularItemSerializer
125128

126129
def get_queryset(self):
127130
return TabularItem.objects.filter(dataset=self.kwargs.get("pk"))
128131

129-
def get_serializer_class(self):
130-
# Use different serializer for Excel format
131-
if self.request.query_params.get("format") == "xlsx":
132-
return TabularItemExcelSerializer
133-
return TabularItemSerializer
132+
133+
class TabularDatasetXSLXDataView(XLSXFileMixin, TabularDatasetDataView):
134+
serializer_class = TabularItemExcelSerializer
135+
renderer_classes = (XLSXRenderer,)
136+
pagination_class = None
137+
138+
def get_filename(self, request, *args, **kwargs):
139+
return f"vbos-mis-tabular-{kwargs.get('pk')}.xlsx"

0 commit comments

Comments
 (0)