Explorar el Código

Fix crash when accessing workflow reports with a deleted snippet

This can happen if the model does not define GenericRelations correctly
Sage Abdullah hace 1 año
padre
commit
6766f3f75e

+ 25 - 1
wagtail/admin/tests/test_workflows.py

@@ -2458,7 +2458,7 @@ class TestPageWorkflowReport(BasePageWorkflowTests):
         self.submitter.first_name = "Sebastian"
         self.submitter.last_name = "Mitter"
         self.submitter.save()
-        self.post("submit")
+        self.post("submit", follow=True)
         self.login(user=self.moderator)
 
     def setup_workflow_and_tasks(self):
@@ -2591,11 +2591,35 @@ class TestPageWorkflowReport(BasePageWorkflowTests):
                 self.assertEqual(response.status_code, 200)
                 self.assertNotIn("Hello world!", content)
 
+    def test_workflow_report_deleted(self):
+        self.object.delete()
+        response = self.client.get(reverse("wagtailadmin_reports:workflow"))
+        self.assertEqual(response.status_code, 200)
+        self.assertNotContains(response, "Hello world!")
+        # test_workflow is only rendered in the filter, not the results
+        self.assertContains(response, "test_workflow", count=1)
+        self.assertNotContains(response, "Sebastian Mitter")
+        self.assertNotContains(response, "March 31, 2020")
+
+        response = self.client.get(reverse("wagtailadmin_reports:workflow_tasks"))
+        self.assertEqual(response.status_code, 200)
+        self.assertNotContains(response, "Hello world!")
+
 
 class TestSnippetWorkflowReport(TestPageWorkflowReport, BaseSnippetWorkflowTests):
     pass
 
 
+class TestNonLockableSnippetWorkflowReport(
+    TestPageWorkflowReport, BaseSnippetWorkflowTests
+):
+    # This model does not use LockableMixin, and it also does not have a
+    # GenericRelation to WorkflowState and Revision, but it should not break
+    # the report page.
+    # See https://github.com/wagtail/wagtail/issues/11300 for more details.
+    model = ModeratedModel
+
+
 class TestPageNotificationPreferences(BasePageWorkflowTests):
     def setUp(self):
         super().setUp()

+ 6 - 0
wagtail/admin/views/reports/workflows.py

@@ -195,6 +195,9 @@ class WorkflowView(ReportView):
             .order_by("-created_at")
         )
 
+    def decorate_paginated_queryset(self, object_list):
+        return [obj for obj in object_list if obj.content_object]
+
     def dispatch(self, request, *args, **kwargs):
         if not page_permission_policy.user_has_any_permission(
             request.user, ["add", "change", "publish"]
@@ -268,3 +271,6 @@ class WorkflowTasksView(ReportView):
             )
             .order_by("-started_at")
         )
+
+    def decorate_paginated_queryset(self, object_list):
+        return [obj for obj in object_list if obj.workflow_state.content_object]

+ 3 - 1
wagtail/test/testapp/wagtail_hooks.py

@@ -304,7 +304,9 @@ class FullFeaturedSnippetViewSet(SnippetViewSet):
 
     class IndexView(SnippetViewSet.index_view_class):
         def get_add_url(self):
-            return set_query_params(super().get_add_url(), {"customised": "param"})
+            if not (add_url := super().get_add_url()):
+                return None
+            return set_query_params(add_url, {"customised": "param"})
 
     index_view_class = IndexView