From 23f7d7e0bed21953e003d2ec33a1348ff2050525 Mon Sep 17 00:00:00 2001 From: Jonas Metzener Date: Wed, 23 Aug 2023 15:42:41 +0200 Subject: [PATCH] feat(category): add slug filters for category list --- alexandria/core/filters.py | 8 +++++++- alexandria/core/tests/test_filters.py | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/alexandria/core/filters.py b/alexandria/core/filters.py index 2beb967d..caf7f6cd 100644 --- a/alexandria/core/filters.py +++ b/alexandria/core/filters.py @@ -17,6 +17,10 @@ from alexandria.core import models +class CharInFilter(BaseInFilter, CharFilter): + pass + + class JSONValueFilter(Filter): field_type_by_lookup_expr = { "exact": TextField, @@ -114,10 +118,12 @@ class CategoryFilterSet(FilterSet): metainfo = JSONValueFilter(field_name="metainfo") active_group = ActiveGroupFilter() has_parent = BooleanFilter(field_name="parent", lookup_expr="isnull", exclude=True) + slug = CharFilter() + slugs = CharInFilter(field_name="slug", lookup_expr="in") class Meta: model = models.Category - fields = ["active_group", "metainfo", "has_parent"] + fields = ["active_group", "metainfo", "has_parent", "slug", "slugs"] class DocumentFilterSet(FilterSet): diff --git a/alexandria/core/tests/test_filters.py b/alexandria/core/tests/test_filters.py index 51e6a9c5..7b8a78e4 100644 --- a/alexandria/core/tests/test_filters.py +++ b/alexandria/core/tests/test_filters.py @@ -323,3 +323,24 @@ def test_has_parent(db, admin_client, category_factory, has_parent, expected_cou received_ids = set([obj["id"] for obj in result["data"]]) assert len(received_ids) == expected_count + + +@pytest.mark.parametrize( + "filters,expected_count", + [ + ({"filter[slug]": "category-1"}, 1), + ({"filter[slug]": "category-none"}, 0), + ({"filter[slugs]": "category-1,category-2"}, 2), + ({"filter[slugs]": "category-1,category-none"}, 1), + ], +) +def test_category_slug_filters( + db, admin_client, category_factory, filters, expected_count +): + category_factory(pk="category-1") + category_factory(pk="category-2") + category_factory(pk="category-3") + + response = admin_client.get(reverse("category-list"), filters) + assert response.status_code == HTTP_200_OK + assert len(response.json()["data"]) == expected_count