8000 Fix: Versioning-safe implementation of placeholder in heritance (#7924) · django-cms/django-cms@6493f02 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6493f02

Browse files
authored
Fix: Versioning-safe implementation of placeholder in heritance (#7924)
1 parent 4e2821d commit 6493f02

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

cms/plugin_rendering.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from django.utils.translation import override
1414

1515
from cms.cache.placeholder import get_placeholder_cache, set_placeholder_cache
16-
from cms.models import PageContent
16+
from cms.models import PageContent, Placeholder
1717
from cms.toolbar.utils import (
1818
get_placeholder_toolbar_js,
1919
get_plugin_toolbar_js,
@@ -554,6 +554,28 @@ def _get_cached_placeholder_content(self, placeholder, language):
554554
language_cache[placeholder.pk] = cached_value
555555
return language_cache.get(placeholder.pk)
556556

557+
558+
def _get_content_object(self, page, slots=None):
559+
if self.toolbar.get_object() == page:
560+
# Current object belongs to the page itself
561+
page_content = self.toolbar.get_object()
562+
placeholders = Placeholder.objects.get_for_obj(page_content)
563+
elif slots:
564+
# If looking for inherited placeholders, slots is specified
565+
if self.toolbar.preview_mode_active or self.toolbar.edit_mode_active:
566+
page_content = (page.pagecontent_set(manager="admin_manager")
567+
.current_content(language=self.request_language).first())
568+
else:
569+
page_content = page.pagecontent_set.filter(language=self.request_language).first()
570+
placeholders = Placeholder.objects.get_for_obj(page_content) if page_content else Placeholder.objects.none()
571+
else:
572+
page_content = page.get_content_obj(self.request_language, fallback=False)
573+
574+
PageContent.page.field.set_cached_value(page_content, page)
575+
# Creates any placeholders missing on the page
576+
placeholders = page_content.rescan_placeholders().values()
577+
return placeholders
578+
557579
def _preload_placeholders_for_page(self, page, slots=None, inherit=False):
558580
"""
559581
Populates the internal plugin cache of each placeholder
@@ -562,14 +584,7 @@ def _preload_placeholders_for_page(self, page, slots=None, inherit=False):
562584
"""
563585
from cms.utils.plugins import assign_plugins
564586

565-
if slots:
566-
placeholders = page.get_placeholders(self.request_language).filter(slot__in=slots)
567-
else:
568-
title = page.get_content_obj(self.request_language, fallback=False)
569-
570-
PageContent.page.field.set_cached_value(title, page)
571-
# Creates any placeholders missing on the page
572-
placeholders = title.rescan_placeholders().values()
587+
placeholders = self._get_content_object(page, slots=slots)
573588

574589
if inherit:
575590
# When the inherit flag is True,

cms/toolbar/toolbar.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,3 +578,6 @@ class EmptyToolbar(BaseToolbar):
578578
def __init__(self, request):
579579
self.request = request
580580
super().__init__()
581+
582+
def get_object(self):
583+
return None

0 commit comments

Comments
 (0)
0