Move updating reference index to task

pull/12787/head
Jake Howard 2024-06-13 10:43:31 +01:00 zatwierdzone przez Matt Westcott
rodzic 79d129f8c2
commit 78cd283b9e
12 zmienionych plików z 311 dodań i 245 usunięć

Wyświetl plik

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

Wyświetl plik

@ -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, "<td>Page chooser model</td>", 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, "<td>Form page with redirect</td>", 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")

Wyświetl plik

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

Wyświetl plik

@ -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, '<table class="listing">')
@ -2174,12 +2180,13 @@ class TestGetUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
self.assertNotContains(response, '<table class="listing">')
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(

Wyświetl plik

@ -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, '<table class="listing">')
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, '<table class="listing">')
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(

Wyświetl plik

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

Wyświetl plik

@ -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):

Wyświetl plik

@ -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)],

Wyświetl plik

@ -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, "<li>Advert</li>", 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)

32
wagtail/tasks.py 100644
Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -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="""<p><a linktype="page" id="%d">event page</a></p>"""
% self.event_page.id
)
obj.save()
with self.captureOnCommitCallbacks(execute=True):
obj = ModelWithNullableParentalKey(
content="""<p><a linktype="page" id="%d">event page</a></p>"""
% 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()