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