Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions vbos/datasets/test/test_tabular_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,6 @@ def test_tabular_datasets_data(self):
assert req.data.get("results")[0]["attribute"] == "Employed Population"
assert req.data.get("results")[0]["additional_value"] == "test"

# test xlsx format
req = self.client.get(url, {"format": "xlsx"})
assert req.status_code == status.HTTP_200_OK

def test_filter_data(self):
url = reverse("datasets:tabular-data", args=[self.dataset_2.id])
req = self.client.get(url, {"date_after": "2025-01-01"})
Expand Down Expand Up @@ -199,3 +195,15 @@ def test_filter_data(self):
req = self.client.get(url, {"attribute": "population"})
assert req.status_code == status.HTTP_200_OK
assert req.data.get("count") == 4

def test_xlsx_format(self):
url = reverse("datasets:tabular-data-xlsx", args=[self.dataset_1.id])
req = self.client.get(url)
assert req.status_code == status.HTTP_200_OK
assert (
req.headers["Content-Type"]
== "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8"
)
assert req.headers[
"content-disposition"
] == "attachment; filename=vbos-mis-tabular-{}.xlsx".format(self.dataset_1.id)
5 changes: 5 additions & 0 deletions vbos/datasets/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,9 @@
views.TabularDatasetDataView.as_view(),
name="tabular-data",
),
path(
"tabular/<int:pk>/data-xlsx/",
views.TabularDatasetXSLXDataView.as_view(),
name="tabular-data-xlsx",
),
]
18 changes: 12 additions & 6 deletions vbos/datasets/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from django.shortcuts import render
import django_filters.rest_framework
from rest_framework.generics import ListAPIView, RetrieveAPIView
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework_gis.pagination import GeoJsonPagination
from rest_framework_gis.filters import InBBoxFilter
from drf_excel.mixins import XLSXFileMixin
from drf_excel.renderers import XLSXRenderer


from vbos.datasets.filters import (
RasterDatasetFilter,
Expand Down Expand Up @@ -122,12 +124,16 @@ class TabularDatasetDetailView(RetrieveAPIView):
class TabularDatasetDataView(ListAPIView):
filterset_class = TabularItemFilter
permission_classes = [IsAuthenticatedOrReadOnly]
serializer_class = TabularItemSerializer

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

def get_serializer_class(self):
# Use different serializer for Excel format
if self.request.query_params.get("format") == "xlsx":
return TabularItemExcelSerializer
return TabularItemSerializer

class TabularDatasetXSLXDataView(XLSXFileMixin, TabularDatasetDataView):
serializer_class = TabularItemExcelSerializer
renderer_classes = (XLSXRenderer,)
pagination_class = None

def get_filename(self, request, *args, **kwargs):
return f"vbos-mis-tabular-{kwargs.get('pk')}.xlsx"