Prevent error when searching and filtering by locale (#12772)

Ref: https://github.com/wagtail/wagtail/issues/6616#issuecomment-2590737050

The current locale filter logic performs a related field filter on `locale__language_code` which isn't supported when searching, as per #6616. Change this to look up the locale object in a separate query.
pull/12783/head
Matt Westcott 2025-01-14 19:54:37 +00:00
rodzic b2958e2b4c
commit 7e1832a4eb
4 zmienionych plików z 23 dodań i 1 usunięć

Wyświetl plik

@ -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)

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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",