diff --git a/wagtail/admin/tests/pages/test_edit_page.py b/wagtail/admin/tests/pages/test_edit_page.py index ff161fedff..e4638d9988 100644 --- a/wagtail/admin/tests/pages/test_edit_page.py +++ b/wagtail/admin/tests/pages/test_edit_page.py @@ -289,7 +289,8 @@ class TestPageEdit(WagtailTestUtils, TestCase): self.assertEqual(len(actions), 0) def test_usage_count_information_shown(self): - PageChooserModel.objects.create(page=self.event_page) + with self.captureOnCommitCallbacks(execute=True): + PageChooserModel.objects.create(page=self.event_page) # Tests that the edit page loads response = self.client.get( diff --git a/wagtail/admin/tests/pages/test_page_usage.py b/wagtail/admin/tests/pages/test_page_usage.py index a0241417a6..57e899c209 100644 --- a/wagtail/admin/tests/pages/test_page_usage.py +++ b/wagtail/admin/tests/pages/test_page_usage.py @@ -19,13 +19,14 @@ class TestPageUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase): self.user = self.login() self.root_page = Page.objects.get(id=2) - page = SimplePage( - title="Hello world!", - slug="hello-world", - content="hello", - ) - self.root_page.add_child(instance=page) - page.save_revision().publish() + with self.captureOnCommitCallbacks(execute=True): + page = SimplePage( + title="Hello world!", + slug="hello-world", + content="hello", + ) + self.root_page.add_child(instance=page) + page.save_revision().publish() self.page = SimplePage.objects.get(id=page.id) def test_simple(self): @@ -69,7 +70,8 @@ class TestPageUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase): self.assertIn("button", classes) def test_has_private_usage(self): - PageChooserModel.objects.create(page=self.page) + with self.captureOnCommitCallbacks(execute=True): + PageChooserModel.objects.create(page=self.page) usage_url = reverse("wagtailadmin_pages:usage", args=(self.page.id,)) response = self.client.get(usage_url) @@ -82,16 +84,17 @@ class TestPageUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase): self.assertContains(response, "Page chooser model", html=True) def test_has_editable_usage(self): - form_page = FormPageWithRedirect( - title="Contact us", - slug="contact-us", - to_address="to@email.com", - from_address="from@email.com", - subject="The subject", - thank_you_redirect_page=self.page, - ) + with self.captureOnCommitCallbacks(execute=True): + form_page = FormPageWithRedirect( + title="Contact us", + slug="contact-us", + to_address="to@email.com", + from_address="from@email.com", + subject="The subject", + thank_you_redirect_page=self.page, + ) - form_page = self.root_page.add_child(instance=form_page) + form_page = self.root_page.add_child(instance=form_page) usage_url = reverse("wagtailadmin_pages:usage", args=(self.page.id,)) response = self.client.get(usage_url) @@ -111,8 +114,9 @@ class TestPageUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase): self.assertContains(response, "Form page with redirect", html=True) def test_pagination(self): - for _ in range(50): - PageChooserModel.objects.create(page=self.page) + with self.captureOnCommitCallbacks(execute=True): + for _ in range(50): + PageChooserModel.objects.create(page=self.page) usage_url = reverse("wagtailadmin_pages:usage", args=(self.page.id,)) response = self.client.get(f"{usage_url}?p=2") diff --git a/wagtail/admin/tests/viewsets/test_model_viewset.py b/wagtail/admin/tests/viewsets/test_model_viewset.py index 1beebf8204..ef3f1eadba 100644 --- a/wagtail/admin/tests/viewsets/test_model_viewset.py +++ b/wagtail/admin/tests/viewsets/test_model_viewset.py @@ -910,10 +910,11 @@ class TestBreadcrumbs(AdminTemplateTestUtils, WagtailTestUtils, TestCase): self.assertBreadcrumbsItemsRendered(items, response.content) def test_usage_view_pagination(self): - for i in range(25): - VariousOnDeleteModel.objects.create( - text=f"Toybox {i}", cascading_toy=self.object - ) + with self.captureOnCommitCallbacks(execute=True): + for i in range(25): + VariousOnDeleteModel.objects.create( + text=f"Toybox {i}", cascading_toy=self.object + ) usage_url = reverse( "feature_complete_toy:usage", @@ -1208,15 +1209,16 @@ class TestHistoryView(WagtailTestUtils, TestCase): class TestUsageView(WagtailTestUtils, TestCase): @classmethod def setUpTestData(cls): - cls.user = cls.create_test_user() - cls.object = FeatureCompleteToy.objects.create(name="Buzz") - cls.url = reverse( - "feature_complete_toy:usage", - args=(quote(cls.object.pk),), - ) - cls.tbx = VariousOnDeleteModel.objects.create( - text="Toybox", cascading_toy=cls.object - ) + with cls.captureOnCommitCallbacks(execute=True): + cls.user = cls.create_test_user() + cls.object = FeatureCompleteToy.objects.create(name="Buzz") + cls.url = reverse( + "feature_complete_toy:usage", + args=(quote(cls.object.pk),), + ) + cls.tbx = VariousOnDeleteModel.objects.create( + text="Toybox", cascading_toy=cls.object + ) def setUp(self): self.user = self.login(self.user) diff --git a/wagtail/documents/tests/test_admin_views.py b/wagtail/documents/tests/test_admin_views.py index 1554bfd506..dd2a3db3a6 100644 --- a/wagtail/documents/tests/test_admin_views.py +++ b/wagtail/documents/tests/test_admin_views.py @@ -1003,7 +1003,8 @@ class TestDocumentDeleteView(WagtailTestUtils, TestCase): ) def test_delete_get_with_protected_reference(self): - VariousOnDeleteModel.objects.create(protected_document=self.document) + with self.captureOnCommitCallbacks(execute=True): + VariousOnDeleteModel.objects.create(protected_document=self.document) response = self.client.get(self.delete_url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "wagtailadmin/generic/confirm_delete.html") @@ -1025,7 +1026,8 @@ class TestDocumentDeleteView(WagtailTestUtils, TestCase): ) def test_delete_post_with_protected_reference(self): - VariousOnDeleteModel.objects.create(protected_document=self.document) + with self.captureOnCommitCallbacks(execute=True): + VariousOnDeleteModel.objects.create(protected_document=self.document) response = self.client.post(self.delete_url) self.assertRedirects(response, reverse("wagtailadmin_home")) self.assertTrue( @@ -2092,21 +2094,23 @@ class TestUsageCount(WagtailTestUtils, TestCase): self.assertEqual(doc.get_usage().count(), 0) def test_used_document_usage_count(self): - doc = models.Document.objects.get(id=1) - page = EventPage.objects.get(id=4) - event_page_related_link = EventPageRelatedLink() - event_page_related_link.page = page - event_page_related_link.link_document = doc - event_page_related_link.save() + with self.captureOnCommitCallbacks(execute=True): + doc = models.Document.objects.get(id=1) + page = EventPage.objects.get(id=4) + event_page_related_link = EventPageRelatedLink() + event_page_related_link.page = page + event_page_related_link.link_document = doc + event_page_related_link.save() self.assertEqual(doc.get_usage().count(), 1) def test_usage_count_appears(self): - doc = models.Document.objects.get(id=1) - page = EventPage.objects.get(id=4) - event_page_related_link = EventPageRelatedLink() - event_page_related_link.page = page - event_page_related_link.link_document = doc - event_page_related_link.save() + with self.captureOnCommitCallbacks(execute=True): + doc = models.Document.objects.get(id=1) + page = EventPage.objects.get(id=4) + event_page_related_link = EventPageRelatedLink() + event_page_related_link.page = page + event_page_related_link.link_document = doc + event_page_related_link.save() response = self.client.get(reverse("wagtaildocs:edit", args=(1,))) self.assertContains(response, "Used 1 time") @@ -2126,12 +2130,13 @@ class TestGetUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase): self.assertEqual(list(doc.get_usage()), []) def test_used_document_get_usage(self): - doc = models.Document.objects.get(id=1) - page = EventPage.objects.get(id=4) - event_page_related_link = EventPageRelatedLink() - event_page_related_link.page = page - event_page_related_link.link_document = doc - event_page_related_link.save() + with self.captureOnCommitCallbacks(execute=True): + doc = models.Document.objects.get(id=1) + page = EventPage.objects.get(id=4) + event_page_related_link = EventPageRelatedLink() + event_page_related_link.page = page + event_page_related_link.link_document = doc + event_page_related_link.save() self.assertIsInstance(doc.get_usage()[0], tuple) self.assertIsInstance(doc.get_usage()[0][0], Page) @@ -2139,12 +2144,13 @@ class TestGetUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase): self.assertIsInstance(doc.get_usage()[0][1][0], ReferenceIndex) def test_usage_page(self): - doc = models.Document.objects.get(id=1) - page = EventPage.objects.get(id=4) - event_page_related_link = EventPageRelatedLink() - event_page_related_link.page = page - event_page_related_link.link_document = doc - event_page_related_link.save() + with self.captureOnCommitCallbacks(execute=True): + doc = models.Document.objects.get(id=1) + page = EventPage.objects.get(id=4) + event_page_related_link = EventPageRelatedLink() + event_page_related_link.page = page + event_page_related_link.link_document = doc + event_page_related_link.save() response = self.client.get(reverse("wagtaildocs:document_usage", args=(1,))) self.assertContains(response, "Christmas") self.assertContains(response, '') @@ -2174,12 +2180,13 @@ class TestGetUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase): self.assertNotContains(response, '
') def test_usage_page_with_only_change_permission(self): - doc = models.Document.objects.get(id=1) - page = EventPage.objects.get(id=4) - event_page_related_link = EventPageRelatedLink() - event_page_related_link.page = page - event_page_related_link.link_document = doc - event_page_related_link.save() + with self.captureOnCommitCallbacks(execute=True): + doc = models.Document.objects.get(id=1) + page = EventPage.objects.get(id=4) + event_page_related_link = EventPageRelatedLink() + event_page_related_link.page = page + event_page_related_link.link_document = doc + event_page_related_link.save() # Create a user with change_document permission but not add_document user = self.create_user( diff --git a/wagtail/images/tests/test_admin_views.py b/wagtail/images/tests/test_admin_views.py index ddc56aeda6..0cf5d0f150 100644 --- a/wagtail/images/tests/test_admin_views.py +++ b/wagtail/images/tests/test_admin_views.py @@ -1453,7 +1453,8 @@ class TestImageDeleteView(WagtailTestUtils, TestCase): self.assertEqual(response.status_code, 302) def test_delete_get_with_protected_reference(self): - VariousOnDeleteModel.objects.create(protected_image=self.image) + with self.captureOnCommitCallbacks(execute=True): + VariousOnDeleteModel.objects.create(protected_image=self.image) response = self.get() self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "wagtailimages/images/confirm_delete.html") @@ -1476,7 +1477,8 @@ class TestImageDeleteView(WagtailTestUtils, TestCase): ) def test_delete_post_with_protected_reference(self): - VariousOnDeleteModel.objects.create(protected_image=self.image) + with self.captureOnCommitCallbacks(execute=True): + VariousOnDeleteModel.objects.create(protected_image=self.image) response = self.post() self.assertRedirects(response, reverse("wagtailadmin_home")) self.assertTrue(Image.objects.filter(id=self.image.id).exists()) @@ -1493,18 +1495,19 @@ class TestUsage(WagtailTestUtils, TestCase): ) def test_usage_page(self): - home_page = Page.objects.get(id=2) - home_page.add_child( - instance=EventPage( - title="Christmas", - slug="christmas", - feed_image=self.image, - date_from=datetime.date.today(), - audience="private", - location="Test", - cost="Test", - ) - ).save_revision().publish() + with self.captureOnCommitCallbacks(execute=True): + home_page = Page.objects.get(id=2) + home_page.add_child( + instance=EventPage( + title="Christmas", + slug="christmas", + feed_image=self.image, + date_from=datetime.date.today(), + audience="private", + location="Test", + cost="Test", + ) + ).save_revision().publish() response = self.client.get( reverse("wagtailimages:image_usage", args=[self.image.id]) @@ -1521,9 +1524,10 @@ class TestUsage(WagtailTestUtils, TestCase): self.assertNotContains(response, '
') def test_usage_no_tags(self): - # tags should not count towards an image's references - self.image.tags.add("illustration") - self.image.save() + with self.captureOnCommitCallbacks(execute=True): + # tags should not count towards an image's references + self.image.tags.add("illustration") + self.image.save() response = self.client.get( reverse("wagtailimages:image_usage", args=[self.image.id]) ) @@ -1531,18 +1535,19 @@ class TestUsage(WagtailTestUtils, TestCase): self.assertNotContains(response, '
') def test_usage_page_with_only_change_permission(self): - home_page = Page.objects.get(id=2) - home_page.add_child( - instance=EventPage( - title="Christmas", - slug="christmas", - feed_image=self.image, - date_from=datetime.date.today(), - audience="private", - location="Test", - cost="Test", - ) - ).save_revision().publish() + with self.captureOnCommitCallbacks(execute=True): + home_page = Page.objects.get(id=2) + home_page.add_child( + instance=EventPage( + title="Christmas", + slug="christmas", + feed_image=self.image, + date_from=datetime.date.today(), + audience="private", + location="Test", + cost="Test", + ) + ).save_revision().publish() # Create a user with change_image permission but not add_image user = self.create_user( diff --git a/wagtail/images/tests/test_models.py b/wagtail/images/tests/test_models.py index 0fc2e253de..697fe914db 100644 --- a/wagtail/images/tests/test_models.py +++ b/wagtail/images/tests/test_models.py @@ -984,11 +984,12 @@ class TestUsageCount(TestCase): self.assertEqual(self.image.get_usage().count(), 0) def test_used_image_document_usage_count(self): - page = EventPage.objects.get(id=4) - event_page_carousel_item = EventPageCarouselItem() - event_page_carousel_item.page = page - event_page_carousel_item.image = self.image - event_page_carousel_item.save() + with self.captureOnCommitCallbacks(execute=True): + page = EventPage.objects.get(id=4) + event_page_carousel_item = EventPageCarouselItem() + event_page_carousel_item.page = page + event_page_carousel_item.image = self.image + event_page_carousel_item.save() self.assertEqual(self.image.get_usage().count(), 1) @@ -1005,11 +1006,12 @@ class TestGetUsage(TestCase): self.assertEqual(list(self.image.get_usage()), []) def test_used_image_document_get_usage(self): - page = EventPage.objects.get(id=4) - event_page_carousel_item = EventPageCarouselItem() - event_page_carousel_item.page = page - event_page_carousel_item.image = self.image - event_page_carousel_item.save() + with self.captureOnCommitCallbacks(execute=True): + page = EventPage.objects.get(id=4) + event_page_carousel_item = EventPageCarouselItem() + event_page_carousel_item.page = page + event_page_carousel_item.image = self.image + event_page_carousel_item.save() self.assertIsInstance(self.image.get_usage()[0], tuple) self.assertIsInstance(self.image.get_usage()[0][0], Page) diff --git a/wagtail/signal_handlers.py b/wagtail/signal_handlers.py index 6f7d020803..90c5ca736a 100644 --- a/wagtail/signal_handlers.py +++ b/wagtail/signal_handlers.py @@ -11,10 +11,11 @@ from django.db.models.signals import ( pre_delete, pre_migrate, ) -from modelcluster.fields import ParentalKey from wagtail.models import Locale, Page, ReferenceIndex, Site +from .tasks import update_reference_index_task + logger = logging.getLogger("wagtail") @@ -70,25 +71,9 @@ def update_reference_index_on_save(instance, **kwargs): if getattr(reference_index_auto_update_disabled, "value", False): return - # If the model is a child model, find the parent instance and index that instead - while True: - parental_keys = list( - filter( - lambda field: isinstance(field, ParentalKey), - instance._meta.get_fields(), - ) - ) - if not parental_keys: - break - - instance = getattr(instance, parental_keys[0].name) - if instance is None: - # parent is null, so there is no valid object to record references against - return - - if ReferenceIndex.is_indexed(instance._meta.model): - with transaction.atomic(): - ReferenceIndex.create_or_update_for_object(instance) + update_reference_index_task.enqueue( + instance._meta.app_label, instance._meta.model_name, instance.pk + ) def remove_reference_index_on_delete(instance, **kwargs): diff --git a/wagtail/snippets/tests/test_snippets.py b/wagtail/snippets/tests/test_snippets.py index f403526ee6..611d744053 100644 --- a/wagtail/snippets/tests/test_snippets.py +++ b/wagtail/snippets/tests/test_snippets.py @@ -4129,9 +4129,10 @@ class TestSnippetDelete(WagtailTestUtils, TestCase): self.assertContains(response, delete_url) def test_delete_get_with_protected_reference(self): - VariousOnDeleteModel.objects.create( - text="Undeletable", on_delete_protect=self.test_snippet - ) + with self.captureOnCommitCallbacks(execute=True): + VariousOnDeleteModel.objects.create( + text="Undeletable", on_delete_protect=self.test_snippet + ) delete_url = reverse( "wagtailsnippets_tests_advert:delete", args=[quote(self.test_snippet.pk)], @@ -4186,9 +4187,10 @@ class TestSnippetDelete(WagtailTestUtils, TestCase): self.assertEqual(Advert.objects.filter(text="test_advert").count(), 0) def test_delete_post_with_protected_reference(self): - VariousOnDeleteModel.objects.create( - text="Undeletable", on_delete_protect=self.test_snippet - ) + with self.captureOnCommitCallbacks(execute=True): + VariousOnDeleteModel.objects.create( + text="Undeletable", on_delete_protect=self.test_snippet + ) delete_url = reverse( "wagtailsnippets_tests_advert:delete", args=[quote(self.test_snippet.pk)], diff --git a/wagtail/snippets/tests/test_usage.py b/wagtail/snippets/tests/test_usage.py index cc344d0b94..b1c02d0dbd 100644 --- a/wagtail/snippets/tests/test_usage.py +++ b/wagtail/snippets/tests/test_usage.py @@ -74,15 +74,16 @@ class TestSnippetUsageView(WagtailTestUtils, TestCase): self.assertEqual(sublabel.get_text(strip=True), "Draft-enabled Bar, In Draft") def test_usage(self): - # resave so that usage count gets updated - page = Page.objects.get(pk=2) - page.save() + with self.captureOnCommitCallbacks(execute=True): + # resave so that usage count gets updated + page = Page.objects.get(pk=2) + page.save() - gfk_page = GenericSnippetPage( - title="Foobar Title", - snippet_content_object=Advert.objects.get(pk=1), - ) - page.add_child(instance=gfk_page) + gfk_page = GenericSnippetPage( + title="Foobar Title", + snippet_content_object=Advert.objects.get(pk=1), + ) + page.add_child(instance=gfk_page) response = self.client.get( reverse( @@ -124,9 +125,10 @@ class TestSnippetUsageView(WagtailTestUtils, TestCase): self.assertRedirects(response, reverse("wagtailadmin_home")) def test_usage_without_edit_permission_on_page(self): - # resave so that usage count gets updated - page = Page.objects.get(pk=2) - page.save() + with self.captureOnCommitCallbacks(execute=True): + # resave so that usage count gets updated + page = Page.objects.get(pk=2) + page.save() # Create a user with edit access to snippets but not pages user = self.create_user( @@ -157,9 +159,10 @@ class TestSnippetUsageView(WagtailTestUtils, TestCase): self.assertContains(response, "
  • Advert
  • ", html=True) def test_usage_with_describe_on_delete_cascade(self): - # resave so that usage count gets updated - page = Page.objects.get(pk=2) - page.save() + with self.captureOnCommitCallbacks(execute=True): + # resave so that usage count gets updated + page = Page.objects.get(pk=2) + page.save() response = self.client.get( reverse("wagtailsnippets_tests_advert:usage", args=["1"]) @@ -173,9 +176,10 @@ class TestSnippetUsageView(WagtailTestUtils, TestCase): self.assertContains(response, ": the advert placement will also be deleted") def test_usage_with_describe_on_delete_set_null(self): - # resave so that usage count gets updated - page = EventPage.objects.first() - page.save() + with self.captureOnCommitCallbacks(execute=True): + # resave so that usage count gets updated + page = EventPage.objects.first() + page.save() self.assertEqual(page.feed_image.get_usage().count(), 1) @@ -191,13 +195,14 @@ class TestSnippetUsageView(WagtailTestUtils, TestCase): self.assertContains(response, ": will unset the reference") def test_usage_with_describe_on_delete_gfk(self): - advert = Advert.objects.get(pk=1) + with self.captureOnCommitCallbacks(execute=True): + advert = Advert.objects.get(pk=1) - gfk_page = GenericSnippetPage( - title="Foobar Title", - snippet_content_object=advert, - ) - Page.objects.get(pk=1).add_child(instance=gfk_page) + gfk_page = GenericSnippetPage( + title="Foobar Title", + snippet_content_object=advert, + ) + Page.objects.get(pk=1).add_child(instance=gfk_page) self.assertEqual(ReferenceIndex.get_grouped_references_to(advert).count(), 1) diff --git a/wagtail/tasks.py b/wagtail/tasks.py new file mode 100644 index 0000000000..8f0c14a96c --- /dev/null +++ b/wagtail/tasks.py @@ -0,0 +1,32 @@ +from django.apps import apps +from django.db import transaction +from django_tasks import task +from modelcluster.fields import ParentalKey + +from wagtail.models import ReferenceIndex + + +@task() +def update_reference_index_task(app_label, model_name, pk): + model = apps.get_model(app_label, model_name) + instance = model.objects.get(pk=pk) + + # If the model is a child model, find the parent instance and index that instead + while True: + parental_keys = list( + filter( + lambda field: isinstance(field, ParentalKey), + instance._meta.get_fields(), + ) + ) + if not parental_keys: + break + + instance = getattr(instance, parental_keys[0].name) + if instance is None: + # parent is null, so there is no valid object to record references against + return + + if ReferenceIndex.is_indexed(instance._meta.model): + with transaction.atomic(): + ReferenceIndex.create_or_update_for_object(instance) diff --git a/wagtail/tests/test_management_commands.py b/wagtail/tests/test_management_commands.py index 4b2faff118..499be1ca22 100644 --- a/wagtail/tests/test_management_commands.py +++ b/wagtail/tests/test_management_commands.py @@ -225,8 +225,9 @@ class TestPublishScheduledPagesCommand(WagtailTestUtils, TestCase): .exclude(approved_go_live_at__isnull=True) .exists() ) - with self.assertNumQueries(44): - management.call_command("publish_scheduled_pages") + with self.assertNumQueries(48): + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled_pages") p = Page.objects.get(slug="hello-world") self.assertTrue(p.live) @@ -282,8 +283,9 @@ class TestPublishScheduledPagesCommand(WagtailTestUtils, TestCase): .exists() ) - with self.assertNumQueries(44): - management.call_command("publish_scheduled_pages") + with self.assertNumQueries(48): + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled_pages") p = Page.objects.get(slug="hello-world") self.assertTrue(p.live) @@ -318,8 +320,9 @@ class TestPublishScheduledPagesCommand(WagtailTestUtils, TestCase): page.title = "Goodbye world!" page.save_revision() - with self.assertNumQueries(44): - management.call_command("publish_scheduled_pages") + with self.assertNumQueries(48): + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled_pages") p = Page.objects.get(slug="hello-world") self.assertTrue(p.live) @@ -346,8 +349,9 @@ class TestPublishScheduledPagesCommand(WagtailTestUtils, TestCase): .exists() ) - with self.assertNumQueries(42): - management.call_command("publish_scheduled_pages") + with self.assertNumQueries(46): + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled_pages") p = Page.objects.get(slug="hello-world") self.assertFalse(p.live) @@ -382,8 +386,9 @@ class TestPublishScheduledPagesCommand(WagtailTestUtils, TestCase): p = Page.objects.get(slug="hello-world") self.assertTrue(p.live) - with self.assertNumQueries(26): - management.call_command("publish_scheduled_pages") + with self.assertNumQueries(27): + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled_pages") p = Page.objects.get(slug="hello-world") self.assertFalse(p.live) @@ -411,7 +416,8 @@ class TestPublishScheduledPagesCommand(WagtailTestUtils, TestCase): self.assertTrue(p.live) with self.assertNumQueries(6): - management.call_command("publish_scheduled_pages") + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled_pages") p = Page.objects.get(slug="hello-world") self.assertTrue(p.live) @@ -459,7 +465,8 @@ class TestPublishScheduledCommand(WagtailTestUtils, TestCase): ) with self.assertNumQueries(15): - management.call_command("publish_scheduled") + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled") self.snippet.refresh_from_db() self.assertTrue(self.snippet.live) @@ -507,7 +514,8 @@ class TestPublishScheduledCommand(WagtailTestUtils, TestCase): ) with self.assertNumQueries(15): - management.call_command("publish_scheduled") + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled") self.snippet.refresh_from_db() self.assertTrue(self.snippet.live) @@ -536,7 +544,8 @@ class TestPublishScheduledCommand(WagtailTestUtils, TestCase): self.snippet.save_revision() with self.assertNumQueries(15): - management.call_command("publish_scheduled") + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled") self.snippet.refresh_from_db() self.assertTrue(self.snippet.live) @@ -560,7 +569,8 @@ class TestPublishScheduledCommand(WagtailTestUtils, TestCase): ) with self.assertNumQueries(14): - management.call_command("publish_scheduled") + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled") self.assertFalse(self.snippet.live) self.assertTrue( @@ -588,7 +598,8 @@ class TestPublishScheduledCommand(WagtailTestUtils, TestCase): self.assertTrue(self.snippet.live) with self.assertNumQueries(10): - management.call_command("publish_scheduled") + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled") self.snippet.refresh_from_db() self.assertFalse(self.snippet.live) @@ -609,7 +620,8 @@ class TestPublishScheduledCommand(WagtailTestUtils, TestCase): self.assertTrue(self.snippet.live) with self.assertNumQueries(6): - management.call_command("publish_scheduled") + with self.captureOnCommitCallbacks(execute=True): + management.call_command("publish_scheduled") self.snippet.refresh_from_db() self.assertTrue(self.snippet.live) diff --git a/wagtail/tests/test_reference_index.py b/wagtail/tests/test_reference_index.py index 6abeff780a..263bddb54e 100644 --- a/wagtail/tests/test_reference_index.py +++ b/wagtail/tests/test_reference_index.py @@ -28,45 +28,46 @@ from wagtail.test.testapp.models import ( class TestCreateOrUpdateForObject(TestCase): def setUp(self): - image_model = get_image_model() - self.image_content_type = ContentType.objects.get_for_model(image_model) + with self.captureOnCommitCallbacks(execute=True): + image_model = get_image_model() + self.image_content_type = ContentType.objects.get_for_model(image_model) - self.test_feed_image = image_model.objects.create( - title="Test feed image", - file=get_test_image_file(), - ) - self.test_image_1 = image_model.objects.create( - title="Test image 1", - file=get_test_image_file(), - ) - self.test_image_2 = image_model.objects.create( - title="Test image 2", - file=get_test_image_file(), - ) + self.test_feed_image = image_model.objects.create( + title="Test feed image", + file=get_test_image_file(), + ) + self.test_image_1 = image_model.objects.create( + title="Test image 1", + file=get_test_image_file(), + ) + self.test_image_2 = image_model.objects.create( + title="Test image 2", + file=get_test_image_file(), + ) - # Add event page - self.event_page = EventPage( - title="Event page", - slug="event-page", - location="the moon", - audience="public", - cost="free", - date_from="2001-01-01", - feed_image=self.test_feed_image, - ) - self.event_page.carousel_items = [ - EventPageCarouselItem( - caption="1234567", image=self.test_image_1, sort_order=1 - ), - EventPageCarouselItem( - caption="7654321", image=self.test_image_2, sort_order=2 - ), - EventPageCarouselItem( - caption="abcdefg", image=self.test_image_1, sort_order=3 - ), - ] - self.root_page = Page.objects.get(id=2) - self.root_page.add_child(instance=self.event_page) + # Add event page + self.event_page = EventPage( + title="Event page", + slug="event-page", + location="the moon", + audience="public", + cost="free", + date_from="2001-01-01", + feed_image=self.test_feed_image, + ) + self.event_page.carousel_items = [ + EventPageCarouselItem( + caption="1234567", image=self.test_image_1, sort_order=1 + ), + EventPageCarouselItem( + caption="7654321", image=self.test_image_2, sort_order=2 + ), + EventPageCarouselItem( + caption="abcdefg", image=self.test_image_1, sort_order=3 + ), + ] + self.root_page = Page.objects.get(id=2) + self.root_page.add_child(instance=self.event_page) self.expected_references = { ( @@ -168,8 +169,9 @@ class TestCreateOrUpdateForObject(TestCase): ) def test_saving_base_model_does_not_remove_references(self): - page = Page.objects.get(pk=self.event_page.pk) - page.save() + with self.captureOnCommitCallbacks(execute=True): + page = Page.objects.get(pk=self.event_page.pk) + page.save() self.assertSetEqual( set( ReferenceIndex.get_references_for_object(self.event_page).values_list( @@ -180,11 +182,12 @@ class TestCreateOrUpdateForObject(TestCase): ) def test_null_parental_key(self): - obj = ModelWithNullableParentalKey( - content="""

    event page

    """ - % self.event_page.id - ) - obj.save() + with self.captureOnCommitCallbacks(execute=True): + obj = ModelWithNullableParentalKey( + content="""

    event page

    """ + % self.event_page.id + ) + obj.save() # Models with a ParentalKey are not considered indexable - references are recorded against the parent model # instead. Since the ParentalKey is null here, no reference will be recorded. @@ -192,51 +195,56 @@ class TestCreateOrUpdateForObject(TestCase): self.assertEqual(refs.count(), 0) def test_lazy_parental_key(self): - event_page_related_link = EventPageRelatedLink() - # The parent model is a lazy object - event_page_related_link.page = SimpleLazyObject(lambda: self.event_page) - event_page_related_link.link_page = self.root_page - event_page_related_link.save() + with self.captureOnCommitCallbacks(execute=True): + event_page_related_link = EventPageRelatedLink() + # The parent model is a lazy object + event_page_related_link.page = SimpleLazyObject(lambda: self.event_page) + event_page_related_link.link_page = self.root_page + event_page_related_link.save() refs = ReferenceIndex.get_references_to(self.root_page) self.assertEqual(refs.count(), 1) def test_generic_foreign_key(self): - page1 = GenericSnippetPage( - title="generic snippet page", snippet_content_object=self.event_page - ) - self.root_page.add_child(instance=page1) - page2 = GenericSnippetPage( - title="generic snippet page", snippet_content_object=None - ) - self.root_page.add_child(instance=page2) + with self.captureOnCommitCallbacks(execute=True): + page1 = GenericSnippetPage( + title="generic snippet page", snippet_content_object=self.event_page + ) + self.root_page.add_child(instance=page1) + page2 = GenericSnippetPage( + title="generic snippet page", snippet_content_object=None + ) + self.root_page.add_child(instance=page2) refs = ReferenceIndex.get_references_to(self.event_page) self.assertEqual(refs.count(), 1) def test_model_index_ignore_generic_foreign_key(self): - page1 = GenericSnippetNoIndexPage( - title="generic snippet page", snippet_content_object=self.event_page - ) - self.root_page.add_child(instance=page1) - page2 = GenericSnippetNoIndexPage( - title="generic snippet page", snippet_content_object=None - ) - self.root_page.add_child(instance=page2) + with self.captureOnCommitCallbacks(execute=True): + page1 = GenericSnippetNoIndexPage( + title="generic snippet page", snippet_content_object=self.event_page + ) + self.root_page.add_child(instance=page1) + page2 = GenericSnippetNoIndexPage( + title="generic snippet page", snippet_content_object=None + ) + self.root_page.add_child(instance=page2) # There should be no references refs = ReferenceIndex.get_references_to(self.event_page) self.assertEqual(refs.count(), 0) def test_model_field_index_ignore_generic_foreign_key(self): - content_type = ContentType.objects.get_for_model(self.event_page) - page1 = GenericSnippetNoFieldIndexPage( - title="generic snippet page", snippet_content_type_nonindexed=content_type - ) - self.root_page.add_child(instance=page1) - page2 = GenericSnippetNoFieldIndexPage( - title="generic snippet page", snippet_content_type_nonindexed=None - ) - self.root_page.add_child(instance=page2) + with self.captureOnCommitCallbacks(execute=True): + content_type = ContentType.objects.get_for_model(self.event_page) + page1 = GenericSnippetNoFieldIndexPage( + title="generic snippet page", + snippet_content_type_nonindexed=content_type, + ) + self.root_page.add_child(instance=page1) + page2 = GenericSnippetNoFieldIndexPage( + title="generic snippet page", snippet_content_type_nonindexed=None + ) + self.root_page.add_child(instance=page2) # There should be no references refs = ReferenceIndex.get_references_to(content_type) @@ -449,7 +457,8 @@ class TestDescribeOnDelete(TestCase): if "on_delete_set_default" not in init_kwargs: init_kwargs["on_delete_set_default"] = None - obj = VariousOnDeleteModel.objects.create(**init_kwargs) + with self.captureOnCommitCallbacks(execute=True): + obj = VariousOnDeleteModel.objects.create(**init_kwargs) usage = ReferenceIndex.get_references_to( referred_object ).group_by_source_object()