From f894b93d286f67654fb5d8416e6155a8501eaa8e Mon Sep 17 00:00:00 2001 From: Peter Andorfer Date: Sat, 27 Jul 2024 12:38:34 +0200 Subject: [PATCH] 69 api ignores filter params (#72) * filter_class -> filterset_class does the trick (hopefully) * tests for shapes-filter * minor --- histogis/settings.py | 1 + shps/api_views.py | 25 ++++++++----------- shps/filters.py | 3 +-- shps/tests.py | 11 ++++++++ vocabs/api_views.py | 2 +- .../templates/webpage/partials/navbar.html | 20 ++++++++++++--- 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/histogis/settings.py b/histogis/settings.py index 5a7db6b..561ee56 100644 --- a/histogis/settings.py +++ b/histogis/settings.py @@ -77,6 +77,7 @@ CRISPY_TEMPLATE_PACK = "bootstrap5" REST_FRAMEWORK = { + "DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend"], "DEFAULT_PERMISSION_CLASSES": ( "rest_framework.permissions.IsAuthenticatedOrReadOnly", ), diff --git a/shps/api_views.py b/shps/api_views.py index f0f6a1b..68ce509 100644 --- a/shps/api_views.py +++ b/shps/api_views.py @@ -1,17 +1,18 @@ import coreapi import coreschema from dateutil.parser import parse -import rest_framework from django.contrib.gis.geos import Point +from django_filters.rest_framework import DjangoFilterBackend + from rest_framework.schemas import AutoSchema from rest_framework import generics from rest_framework import viewsets +from rest_framework.filters import OrderingFilter from rest_framework.pagination import PageNumberPagination from rest_framework_gis.pagination import GeoJsonPagination -from django_filters import rest_framework as df_rest_framework from .models import TempSpatial, Source -from .filters import TempSpatialListFilter +from .filters import TempSpatialListFilter, SourceListFilter from .api_serializers import TempSpatialSerializer, SourceSerializer, SimpleSerializer @@ -34,12 +35,8 @@ class TempSpatialViewSet(viewsets.ModelViewSet): queryset = TempSpatial.objects.all() serializer_class = TempSpatialSerializer pagination_class = StandardResultsSetPagination - filter_backends = (df_rest_framework.DjangoFilterBackend,) - filter_class = TempSpatialListFilter - renderer_classes = ( - rest_framework.renderers.BrowsableAPIRenderer, - rest_framework.renderers.JSONRenderer, - ) + filter_backends = [DjangoFilterBackend, OrderingFilter] + filterset_class = TempSpatialListFilter class SimpleViewSet(viewsets.ModelViewSet): @@ -50,12 +47,8 @@ class SimpleViewSet(viewsets.ModelViewSet): queryset = TempSpatial.objects.all() serializer_class = SimpleSerializer pagination_class = SimpledResultsSetPagination - filter_backends = (df_rest_framework.DjangoFilterBackend,) - filter_class = TempSpatialListFilter - renderer_classes = ( - rest_framework.renderers.BrowsableAPIRenderer, - rest_framework.renderers.JSONRenderer, - ) + filter_backends = [DjangoFilterBackend, OrderingFilter] + filterset_class = TempSpatialListFilter class SourceViewSet(viewsets.ModelViewSet): @@ -65,6 +58,8 @@ class SourceViewSet(viewsets.ModelViewSet): queryset = Source.objects.all() serializer_class = SourceSerializer + filter_backends = [DjangoFilterBackend, OrderingFilter] + filterset_class = SourceListFilter class TemporalizedSpatialQuery(generics.ListAPIView): diff --git a/shps/filters.py b/shps/filters.py index 4bafa15..48bb777 100644 --- a/shps/filters.py +++ b/shps/filters.py @@ -1,6 +1,5 @@ import django_filters from django.db.models import Q -from rest_framework_gis.filterset import GeoFilterSet from rest_framework_gis.filters import GeometryFilter from vocabs.models import SkosConcept @@ -21,7 +20,7 @@ class Meta: ] -class TempSpatialListFilter(GeoFilterSet): +class TempSpatialListFilter(django_filters.FilterSet): all_name = django_filters.CharFilter( method="all_name_filter", label="Name", diff --git a/shps/tests.py b/shps/tests.py index 0348754..05ee3b8 100644 --- a/shps/tests.py +++ b/shps/tests.py @@ -98,3 +98,14 @@ def test_007_where_was(self): params = {"lat": "48.36", "lng": "14.3", "when": "187110-01-01"} r = client.get(url, params) self.assertTrue(r.json()["features"]) + + def test_008_shps_api_filters(self): + url = "/api/tempspatial/" + params = { + "name": "Linz", + } + r = client.get(url) + all_shapes = r.json()["count"] + r = client.get(url, params) + some_shapes = r.json()["count"] + self.assertTrue(all_shapes > some_shapes) diff --git a/vocabs/api_views.py b/vocabs/api_views.py index d961822..77f4028 100644 --- a/vocabs/api_views.py +++ b/vocabs/api_views.py @@ -42,7 +42,7 @@ class SkosConceptViewSet(viewsets.ModelViewSet): queryset = SkosConcept.objects.all() serializer_class = SkosConceptSerializer filter_backends = (DjangoFilterBackend,) - filter_class = SkosConceptFilter + filterset_class = SkosConceptFilter pagination_class = LargeResultsSetPagination renderer_classes = tuple(api_settings.DEFAULT_RENDERER_CLASSES) + (RDFRenderer,) diff --git a/webpage/templates/webpage/partials/navbar.html b/webpage/templates/webpage/partials/navbar.html index 8574814..a4ea4c4 100644 --- a/webpage/templates/webpage/partials/navbar.html +++ b/webpage/templates/webpage/partials/navbar.html @@ -20,9 +20,13 @@ Info + {% if user.is_authenticated %}