diff --git a/CHANGELOG.txt b/CHANGELOG.txt index d1cd8598e5..a570a26456 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -52,6 +52,7 @@ Changelog * Fix: Add missing heading and breadcrumbs in Account view (Sage Abdullah) * Fix: Reduce confusing spacing below StreamField blocks help text (Rishabh Sharma) * Fix: Prevent redundant calls to `Site.find_for_request()` from `Page.get_url_parts()` (Andy Babic) + * Fix: Prevent error on listings when searching and filtering by locale (Matt Westcott, Sage Abdullah) * Docs: Move the model reference page from reference/pages to the references section as it covers all Wagtail core models (Srishti Jaiswal) * Docs: Move the panels reference page from references/pages to the references section as panels are available for any model editing, merge panels API into this page (Srishti Jaiswal) * Docs: Move the tags documentation to standalone advanced topic, instead of being inside the reference/pages section (Srishti Jaiswal) diff --git a/docs/releases/6.4.md b/docs/releases/6.4.md index d6c7956f58..fd0301ecad 100644 --- a/docs/releases/6.4.md +++ b/docs/releases/6.4.md @@ -65,6 +65,7 @@ depth: 1 * Add missing heading and breadcrumbs in Account view (Sage Abdullah) * Reduce confusing spacing below StreamField blocks help text (Rishabh Sharma) * Prevent redundant calls to `Site.find_for_request()` from `Page.get_url_parts()` (Andy Babic) + * Prevent error on listings when searching and filtering by locale (Matt Westcott, Sage Abdullah) ### Documentation diff --git a/wagtail/admin/filters.py b/wagtail/admin/filters.py index c9d1e5b555..95089fd8c1 100644 --- a/wagtail/admin/filters.py +++ b/wagtail/admin/filters.py @@ -10,6 +10,7 @@ from wagtail.admin.models import popular_tags_for_model from wagtail.admin.utils import get_user_display_name from wagtail.admin.widgets import AdminDateInput, BooleanRadioSelect, FilteredSelect from wagtail.coreutils import get_content_languages, get_content_type_label +from wagtail.models import Locale class DateRangePickerWidget(SuffixedMultiWidget): @@ -93,7 +94,8 @@ class FilteredModelChoiceFilter(django_filters.ModelChoiceFilter): class LocaleFilter(django_filters.ChoiceFilter): def filter(self, qs, language_code): if language_code: - return qs.filter(locale__language_code=language_code) + locale = Locale.objects.filter(language_code=language_code) + return qs.filter(locale_id=locale.values_list("pk", flat=True)[:1]) return qs diff --git a/wagtail/admin/tests/pages/test_explorer_view.py b/wagtail/admin/tests/pages/test_explorer_view.py index 35d54686e6..c9d20e940a 100644 --- a/wagtail/admin/tests/pages/test_explorer_view.py +++ b/wagtail/admin/tests/pages/test_explorer_view.py @@ -653,6 +653,24 @@ class TestPageExplorer(WagtailTestUtils, TestCase): self.assertIn("Simple page", page_type_labels) self.assertNotIn("Page", page_type_labels) + @override_settings(WAGTAIL_I18N_ENABLED=True) + def test_filter_by_locale_and_search(self): + fr_locale = Locale.objects.create(language_code="fr") + self.root_page.copy_for_translation(fr_locale, copy_parents=True) + + response = self.client.get( + reverse("wagtailadmin_explore", args=(self.root_page.id,)), + {"locale": "en", "q": "hello"}, + ) + self.assertEqual(response.status_code, 200) + page_ids = {page.id for page in response.context["pages"]} + self.assertIn(self.child_page.id, page_ids) + self.assertContainsActiveFilter( + response, + "Locale: English", + "locale=en", + ) + def test_filter_by_date_updated(self): new_page_child = SimplePage( title="New page child",