From d6ef9b57529d2fdd3a1379837a08809a58410dd5 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Mon, 23 Sep 2024 21:34:41 +0100 Subject: [PATCH] Stop PopularTagsFilter from applying an IN clause when not filtering Fixes #12349 --- wagtail/admin/filters.py | 2 +- wagtail/images/tests/test_admin_views.py | 26 +++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/wagtail/admin/filters.py b/wagtail/admin/filters.py index 9f00956789..c9d1e5b555 100644 --- a/wagtail/admin/filters.py +++ b/wagtail/admin/filters.py @@ -223,7 +223,7 @@ class PopularTagsFilter(django_filters.MultipleChoiceFilter): def filter(self, qs, value): filtered = super().filter(qs, value) - if not self.use_subquery: + if not self.use_subquery or not value: return filtered # Workaround for https://github.com/wagtail/wagtail/issues/6616 diff --git a/wagtail/images/tests/test_admin_views.py b/wagtail/images/tests/test_admin_views.py index 4211a9a284..2614fc2fc8 100644 --- a/wagtail/images/tests/test_admin_views.py +++ b/wagtail/images/tests/test_admin_views.py @@ -7,6 +7,7 @@ from django.conf import settings from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType from django.core.files.uploadedfile import SimpleUploadedFile, TemporaryUploadedFile +from django.db.models.lookups import In from django.template.defaultfilters import filesizeformat from django.template.loader import render_to_string from django.test import RequestFactory, TestCase, TransactionTestCase, override_settings @@ -22,6 +23,7 @@ from willow.registry import registry from wagtail.admin.admin_url_finder import AdminURLFinder from wagtail.images import get_image_model from wagtail.images.utils import generate_signature +from wagtail.images.views.images import ImagesFilterSet from wagtail.models import ( Collection, GroupCollectionPermission, @@ -47,7 +49,7 @@ urlquote_safechars = RFC3986_SUBDELIMS + "/~:@" class TestImageIndexView(WagtailTestUtils, TestCase): def setUp(self): - self.login() + self.user = self.login() self.kitten_image = Image.objects.create( title="a cute kitten", file=get_test_image_file(size=(1, 1)), @@ -374,6 +376,28 @@ class TestImageIndexView(WagtailTestUtils, TestCase): # the prefetched objects cache. self.get() + def test_empty_tag_filter_does_not_perform_id_filtering(self): + image_one_tag = Image.objects.create( + title="Test image with one tag", + file=get_test_image_file(), + ) + image_one_tag.tags.add("one") + + request = RequestFactory().get(reverse("wagtailimages:index")) + request.user = self.user + filterset = ImagesFilterSet( + data={}, queryset=Image.objects.all(), request=request, is_searching=True + ) + + # Filtering on tags during a search would normally apply a `pk__in` filter, but this should not happen + # when the tag filter is empty. + in_clauses = [ + clause + for clause in filterset.qs.query.where.children + if isinstance(clause, In) + ] + self.assertEqual(len(in_clauses), 0) + class TestImageIndexViewSearch(WagtailTestUtils, TransactionTestCase): fixtures = ["test_empty.json"]