kopia lustrzana https://github.com/wagtail/wagtail
Move updating reference index to task
rodzic
79d129f8c2
commit
78cd283b9e
|
@ -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(
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)],
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
Ładowanie…
Reference in New Issue