kopia lustrzana https://github.com/wagtail/wagtail
Add RangeFilterAdapter to display active RangeFilters
rodzic
4f09351bf4
commit
cdb03b00d7
|
@ -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,
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -171,6 +171,7 @@ INSTALLED_APPS = [
|
|||
"wagtail",
|
||||
"taggit",
|
||||
"rest_framework",
|
||||
"django_filters",
|
||||
"django.contrib.admin",
|
||||
"django.contrib.auth",
|
||||
"django.contrib.contenttypes",
|
||||
|
|
|
@ -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"]
|
||||
|
|
Ładowanie…
Reference in New Issue