Add RangeFilterAdapter to display active RangeFilters

pull/13068/head
Sage Abdullah 2025-03-27 17:48:31 +07:00 zatwierdzone przez Matt Westcott
rodzic 4f09351bf4
commit cdb03b00d7
4 zmienionych plików z 48 dodań i 6 usunięć

Wyświetl plik

@ -122,16 +122,19 @@ class ModelMultipleChoiceFilterAdapter(BaseFilterAdapter):
)
class DateFromToRangeFilterAdapter(BaseFilterAdapter):
class RangeFilterAdapter(BaseFilterAdapter):
def format_value(self, value):
return str(value) if value is not None else ""
def get_active_filters(self):
start_date_display = date_format(self.value.start) if self.value.start else ""
end_date_display = date_format(self.value.stop) if self.value.stop else ""
start_value_display = self.format_value(self.value.start)
end_value_display = self.format_value(self.value.stop)
widget = self.filter.field.widget
yield (
ActiveFilter(
self.bound_field.auto_id,
self.filter.label,
f"{start_date_display} - {end_date_display}",
f"{start_value_display} - {end_value_display}",
self.get_url_without_filter_param(
[
widget.suffixed(self.bound_field.name, suffix)
@ -142,6 +145,11 @@ class DateFromToRangeFilterAdapter(BaseFilterAdapter):
)
class DateFromToRangeFilterAdapter(RangeFilterAdapter):
def format_value(self, value):
return date_format(value) if value is not None else ""
filter_adapter_class_registry = ObjectTypeRegistry()
@ -190,6 +198,10 @@ register_filter_adapter_class(
django_filters.ModelMultipleChoiceFilter,
ModelMultipleChoiceFilterAdapter,
)
register_filter_adapter_class(
django_filters.RangeFilter,
RangeFilterAdapter,
)
register_filter_adapter_class(
django_filters.DateFromToRangeFilter,
DateFromToRangeFilterAdapter,

Wyświetl plik

@ -425,10 +425,10 @@ class TestFilterSetClass(BaseSnippetViewSetTests):
def create_test_snippets(self):
FullFeaturedSnippet.objects.create(
text="Nasi goreng from Indonesia", country_code="ID"
text="Nasi goreng from Indonesia", country_code="ID", some_number=123
)
FullFeaturedSnippet.objects.create(
text="Fish and chips from the UK", country_code="UK"
text="Fish and chips from the UK", country_code="UK", some_number=456
)
def test_get_include_filters_form_media(self):
@ -511,6 +511,29 @@ class TestFilterSetClass(BaseSnippetViewSetTests):
self.assertEqual(url, self.get_url("list_results"))
self.assertNotIn("country_code=ID", params)
def test_range_filter(self):
self.create_test_snippets()
response = self.get({"some_number_min": 100, "some_number_max": 200})
self.assertContains(response, "Nasi goreng from Indonesia")
self.assertNotContains(response, "Fish and chips from the UK")
self.assertContains(response, "There is 1 match")
# Should render the active filters
soup = self.get_soup(response.content)
active_filters = soup.select_one(".w-active-filters")
self.assertIsNotNone(active_filters)
pill = active_filters.select_one(".w-pill")
self.assertIsNotNone(pill)
self.assertEqual(
pill.get_text(separator=" ", strip=True),
"Number range: 100 - 200",
)
clear = pill.select_one(".w-pill__remove")
self.assertIsNotNone(clear)
url, params = clear.attrs.get("data-w-swap-src-value").split("?", 1)
self.assertEqual(url, self.get_url("list_results"))
self.assertNotIn("some_number_min=100", params)
self.assertNotIn("some_number_max=200", params)
class TestFilterSetClassSearch(WagtailTestUtils, TransactionTestCase):
fixtures = ["test_empty.json"]

Wyświetl plik

@ -171,6 +171,7 @@ INSTALLED_APPS = [
"wagtail",
"taggit",
"rest_framework",
"django_filters",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",

Wyświetl plik

@ -1,5 +1,6 @@
import os
import django_filters
from django import forms
from django.http import HttpResponse
from django.utils.safestring import mark_safe
@ -262,6 +263,11 @@ def register_toy_viewset():
class FullFeaturedSnippetFilterSet(WagtailFilterSet):
some_number = django_filters.RangeFilter(
field_name="some_number",
label="Number range",
)
class Meta:
model = FullFeaturedSnippet
fields = ["country_code", "some_date"]