8000 fix: Versioning-safe implementation of placeholder inheritance by fsbraun · Pull Request #7924 · django-cms/django-cms · GitHub
[go: up one dir, main page]

Skip to content

fix: Versioning-safe implementation of placeholder inheritance #7924

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 20, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Fix: Versioning-safe implementation of placeholder in heritance
  • Loading branch information
fsbraun committed May 17, 2024
commit 420dc5a6598e3b4b1b4cb5a2043ca95b24c732ef
33 changes: 24 additions & 9 deletions cms/plugin_rendering.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from django.utils.translation import override

from cms.cache.placeholder import get_placeholder_cache, set_placeholder_cache
from cms.models import PageContent
from cms.models import PageContent, Placeholder
from cms.toolbar.utils import (
get_placeholder_toolbar_js,
get_plugin_toolbar_js,
Expand Down Expand Up @@ -554,6 +554,28 @@ def _get_cached_placeholder_content(self, placeholder, language):
language_cache[placeholder.pk] = cached_value
return language_cache.get(placeholder.pk)


def _get_content_object(self, page, slots=None):
if self.toolbar.get_object() == page:
# Current object belongs to the page itself
page_content = self.toolbar.get_object()
placeholders = Placeholder.objects.get_for_obj(page_content)
elif slots:
# If looking for inherited placeholders, slots is specified
if self.toolbar.preview_mode_active or self.toolbar.edit_mode_active:
page_content = (page.pagecontent_set(manager="admin_manager")
.current_content(language=self.request_language).first())
else:
page_content = page.pagecontent_set.filter(language=self.request_language).first()
placeholders = Placeholder.objects.get_for_obj(page_content) if page_content else Placeholder.objects.none()
else:
page_content = page.get_content_obj(self.request_language, fallback=False)

PageContent.page.field.set_cached_value(page_content, page)
# Creates any placeholders missing on the page
placeholders = page_content.rescan_placeholders().values()
return placeholders

def _preload_placeholders_for_page(self, page, slots=None, inherit=False):
"""
Populates the internal plugin cache of each placeholder
Expand All @@ -562,14 +584,7 @@ def _preload_placeholders_for_page(self, page, slots=None, inherit=False):
"""
from cms.utils.plugins import assign_plugins

if slots:
placeholders = page.get_placeholders(self.request_language).filter(slot__in=slots)
else:
title = page.get_content_obj(self.request_language, fallback=False)

PageContent.page.field.set_cached_value(title, page)
# Creates any placeholders missing on the page
placeholders = title.rescan_placeholders().values()
placeholders = self._get_content_object(page, slots=slots)

if inherit:
# When the inherit flag is True,
Expand Down
3 changes: 3 additions & 0 deletions cms/toolbar/toolbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -578,3 +578,6 @@ class EmptyToolbar(BaseToolbar):
def __init__(self, request):
self.request = request
super().__init__()

def get_object(self):
return None
0