From eea0d49826bce7192fd7941d7b612b4e063955f8 Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Mon, 6 Oct 2025 18:03:30 -0300 Subject: [PATCH] Add province and area-councils views --- vbos/datasets/serializers.py | 18 +++++++++++++++ vbos/datasets/test/test_area_council_view.py | 23 ++++++++++++++++++++ vbos/datasets/test/test_province_view.py | 15 +++++++++++++ vbos/datasets/urls.py | 6 +++++ vbos/datasets/views.py | 22 +++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 vbos/datasets/test/test_area_council_view.py create mode 100644 vbos/datasets/test/test_province_view.py diff --git a/vbos/datasets/serializers.py b/vbos/datasets/serializers.py index 6db9219..1960544 100644 --- a/vbos/datasets/serializers.py +++ b/vbos/datasets/serializers.py @@ -2,7 +2,9 @@ from rest_framework_gis.serializers import GeoFeatureModelSerializer from .models import ( + AreaCouncil, Cluster, + Province, RasterDataset, TabularDataset, TabularItem, @@ -17,6 +19,22 @@ class Meta: fields = ["id", "name"] +class ProvinceSerializer(GeoFeatureModelSerializer): + + class Meta: + model = Province + geo_field = "geometry" + fields = "__all__" + + +class AreaCouncilSerializer(GeoFeatureModelSerializer): + + class Meta: + model = AreaCouncil + geo_field = "geometry" + fields = "__all__" + + class RasterDatasetSerializer(serializers.ModelSerializer): file = serializers.ReadOnlyField(source="file.file.url") cluster = serializers.ReadOnlyField(source="cluster.name") diff --git a/vbos/datasets/test/test_area_council_view.py b/vbos/datasets/test/test_area_council_view.py new file mode 100644 index 0000000..6dfd41a --- /dev/null +++ b/vbos/datasets/test/test_area_council_view.py @@ -0,0 +1,23 @@ +from django.urls.base import reverse +from rest_framework import status +from rest_framework.test import APITestCase + + +class TestAreaCouncilListView(APITestCase): + def test_cluster_list_view(self): + url = reverse("datasets:area-council-list", args=["TORBA"]) + req = self.client.get(url) + assert req.status_code == status.HTTP_200_OK + assert req.data.get("count") == 9 + assert req.data.get("features")[0]["properties"]["name"] == "East Gaua" + assert req.data.get("features")[0]["geometry"]["type"] == "MultiPolygon" + + # get penama councils + url = reverse("datasets:area-council-list", args=["penama"]) + req = self.client.get(url) + assert req.status_code == status.HTTP_200_OK + assert req.data.get("count") == 12 + assert ( + req.data.get("features")[0]["properties"]["name"] == "Central Pentecost 1" + ) + assert req.data.get("features")[0]["geometry"]["type"] == "MultiPolygon" diff --git a/vbos/datasets/test/test_province_view.py b/vbos/datasets/test/test_province_view.py new file mode 100644 index 0000000..810bc54 --- /dev/null +++ b/vbos/datasets/test/test_province_view.py @@ -0,0 +1,15 @@ +from django.urls.base import reverse +from rest_framework import status +from rest_framework.test import APITestCase + +from vbos.datasets.models import Cluster + + +class TestProvinceListView(APITestCase): + def test_cluster_list_view(self): + self.url = reverse("datasets:province-list") + req = self.client.get(self.url) + assert req.status_code == status.HTTP_200_OK + assert req.data.get("count") == 6 + assert req.data.get("features")[0]["properties"]["name"] == "MALAMPA" + assert req.data.get("features")[0]["geometry"]["type"] == "MultiPolygon" diff --git a/vbos/datasets/urls.py b/vbos/datasets/urls.py index 2be0ca1..6ed9456 100644 --- a/vbos/datasets/urls.py +++ b/vbos/datasets/urls.py @@ -7,6 +7,12 @@ urlpatterns = [ # raster path("cluster/", views.ClusterListView.as_view(), name="cluster-list"), + path("province/", views.ProvinceListView.as_view(), name="province-list"), + path( + "area-council//", + views.AreaCouncilListView.as_view(), + name="area-council-list", + ), path("raster/", views.RasterDatasetListView.as_view(), name="raster-list"), path( "raster//", diff --git a/vbos/datasets/views.py b/vbos/datasets/views.py index 645144d..5410ac8 100644 --- a/vbos/datasets/views.py +++ b/vbos/datasets/views.py @@ -14,7 +14,9 @@ ) from .models import ( + AreaCouncil, Cluster, + Province, RasterDataset, TabularDataset, TabularItem, @@ -23,7 +25,9 @@ ) from .pagination import StandardResultsSetPagination from .serializers import ( + AreaCouncilSerializer, ClusterSerializer, + ProvinceSerializer, RasterDatasetSerializer, TabularDatasetSerializer, TabularItemExcelSerializer, @@ -40,6 +44,24 @@ class ClusterListView(ListAPIView): pagination_class = StandardResultsSetPagination +class ProvinceListView(ListAPIView): + queryset = Province.objects.all() + serializer_class = ProvinceSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + pagination_class = GeoJsonPagination + + +class AreaCouncilListView(ListAPIView): + serializer_class = AreaCouncilSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + pagination_class = GeoJsonPagination + + def get_queryset(self): + return AreaCouncil.objects.filter( + province__name__iexact=self.kwargs.get("province") + ) + + class RasterDatasetListView(ListAPIView): queryset = RasterDataset.objects.all() serializer_class = RasterDatasetSerializer