瀏覽代碼

Limit the redirect to page filter to only pages used in redirects

zerolab 11 月之前
父節點
當前提交
e9a349c95d
共有 2 個文件被更改,包括 32 次插入1 次删除
  1. 15 1
      wagtail/contrib/redirects/filters.py
  2. 17 0
      wagtail/contrib/redirects/tests/test_redirects.py

+ 15 - 1
wagtail/contrib/redirects/filters.py

@@ -1,13 +1,27 @@
 import django_filters
 from django import forms
+from django.db.models import QuerySet
 from django.utils.translation import gettext as _
 
 from wagtail.admin.filters import WagtailFilterSet
 from wagtail.contrib.redirects.models import Redirect
-from wagtail.models import Site
+from wagtail.models import Page, Site
+
+
+def get_redirect_pages_queryset(request) -> QuerySet[Page]:
+    redirect_page_pks = (
+        Redirect.objects.filter(redirect_page__isnull=False)
+        .order_by()
+        .values_list("redirect_page", flat=True)
+        .distinct()
+    )
+    return Page.objects.filter(pk__in=redirect_page_pks)
 
 
 class RedirectsReportFilterSet(WagtailFilterSet):
+    redirect_page = django_filters.ModelChoiceFilter(
+        field_name="redirect_page", queryset=get_redirect_pages_queryset
+    )
     is_permanent = django_filters.ChoiceFilter(
         label=_("Type"),
         method="filter_type",

+ 17 - 0
wagtail/contrib/redirects/tests/test_redirects.py

@@ -773,6 +773,23 @@ class TestRedirectsIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase)
 
         self.assertEqual(len(csv_data), 10)
 
+    def test_redirect_page_filter_only_includes_relevant_pages(self):
+        """
+        The redirect_page filter should only include pages referenced by Redirect objects.
+        """
+        response = self.get()
+        request = response.context["request"]
+        qs = response.context["filters"].filters["redirect_page"].queryset(request)
+        self.assertQuerySetEqual(qs, Page.objects.none())
+
+        page = Page.objects.get(id=2)
+        models.Redirect.add_redirect("/to-page", page, False)
+
+        response = self.get()
+        request = response.context["request"]
+        qs = response.context["filters"].filters["redirect_page"].queryset(request)
+        self.assertQuerySetEqual(qs, Page.objects.filter(pk=2))
+
 
 class TestRedirectsAddView(WagtailTestUtils, TestCase):
     fixtures = ["test.json"]