8000 Fixed #6037 -- Placeholders without content in edit mode should also fallback by czpython · Pull Request #6066 · django-cms/django-cms · GitHub
[go: up one dir, main page]

Skip to content

Fixed #6037 -- Placeholders without content in edit mode should also fallback #6066

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 1 commit into from
Sep 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
< 8000 div data-show-on-forbidden-error hidden>

Uh oh!

There was an error while loading. Please reload this page.

Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Fixed #6037 -- Placeholders without content in edit mode should also …
…fallback.
  • Loading branch information
czpython committed Sep 7, 2017
commit b5bee899cc448686d0391eac321a63bb6c69f982
59 changes: 41 additions & 18 deletions cms/plugin_rendering.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from collections import deque
from collections import OrderedDict

from functools import partial

Expand Down Expand Up @@ -53,14 +53,23 @@ def _unpack_plugins(parent_plugin):


class RenderedPlaceholder(object):
__slots__ = ('placeholder', 'language', 'site_id', 'cached', 'editable')
__slots__ = (
'language',
'site_id',
'cached',
'editable',
'placeholder',
'has_content',
)

def __init__(self, placeholder, language, site_id, cached=False, editable=False):
self.placeholder = placeholder
def __init__(self, placeholder, language, site_id, cached=False,
editable=False, has_content=False):
self.language = language
self.site_id = site_id
self.cached = cached
self.editable = editable
self.placeholder = placeholder
self.has_content = has_content

def __eq__(self, other):
# The same placeholder rendered with different
Expand All @@ -86,8 +95,8 @@ def __init__(self, request):
self._cached_plugin_classes = {}
self._placeholders_content_cache = {}
self._placeholders_by_page_cache = {}
self._rendered_placeholders = deque()
self._rendered_static_placeholders = deque()
self._rendered_placeholders = OrderedDict()
self._rendered_static_placeholders = OrderedDict()
self._rendered_plugins_by_placeholder = {}

@cached_property
Expand Down Expand Up @@ -179,13 +188,15 @@ def get_rendered_plugins_cache(self, placeholder):
return self._rendered_plugins_by_placeholder.get(placeholder.pk, blank)

def get_rendered_placeholders(self):
return [r.placeholder for r in self._rendered_placeholders]
rendered = list(self._rendered_placeholders.values())
return [r.placeholder for r in rendered]

def get_rendered_editable_placeholders(self):
return [r.placeholder for r in self._rendered_placeholders if r.editable]
rendered = list(self._rendered_placeholders.values())
return [r.placeholder for r in rendered if r.editable]

def get_rendered_static_placeholders(self):
return self._rendered_static_placeholders
return list(self._rendered_static_placeholders.values())


class ContentRenderer(BaseRenderer):
Expand Down Expand Up @@ -289,17 +300,18 @@ def render_placeholder(self, placeholder, context, language=None, page=None,
site_id=self.site_id,
cached=use_cache,
editable=editable,
has_content=bool(placeholder_content),
)

if rendered_placeholder not in self._rendered_placeholders:
if placeholder.pk not in self._rendered_placeholders:
# First time this placeholder is rendered
if not self.toolbar._cache_disabled:
# The toolbar middleware needs to know if the response
# is to be cached.
# Set the _cache_disabled flag to the value of cache_placeholder
# only if the flag is False (meaning cache is enabled).
self.toolbar._cache_disabled = not use_cache
self._rendered_placeholders.append(rendered_placeholder)
self._rendered_placeholders[placeholder.pk] = rendered_placeholder

if editable:
data = self.get_editable_placeholder_context(placeholder, language, page=page)
Expand Down Expand Up @@ -343,6 +355,7 @@ def render_page_placeholder(self, slot, context, inherit,
placeholder = placeholder_cache[current_page.pk][slot]
except KeyError:
content = ''
placeholder = None
else:
content = self.render_placeholder(
placeholder,
Expand Down Expand Up @@ -378,7 +391,17 @@ def render_page_placeholder(self, slot, context, inherit,
editable=False,
)

if not content and nodelist:
if placeholder and (editable and self._placeholders_are_editable):
# In edit mode, the contents of the placeholder are mixed with our
# internal toolbar markup, so the content variabl 8000 e will always be True.
# Use the rendered placeholder has_content flag instead.
has_content = self._rendered_placeholders[placeholder.pk].has_content
else:
# User is not in edit mode or the placeholder doesn't exist.
# Either way, we can trust the content variable.
has_content = bool(content)

if not has_content and nodelist:
return nodelist.render(context)
return content

Expand All @@ -405,9 +428,9 @@ def render_static_placeholder(self, static_placeholder, context, nodelist=None):
nodelist=nodelist,
)

if static_placeholder not in self._rendered_static_placeholders:
if static_placeholder.pk not in self._rendered_static_placeholders:
# First time this static placeholder is rendered
self._rendered_static_placeholders.append(static_placeholder)
self._rendered_static_placeholders[static_placeholder.pk] = static_placeholder
return content

def render_plugin(self, instance, context, placeholder=None, editable=False):
Expand Down Expand Up @@ -594,8 +617,8 @@ def render_placeholder(self, placeholder, language, page=None):
editable=True,
)

if rendered_placeholder not in self._rendered_placeholders:
self._rendered_placeholders.append(rendered_placeholder)
if placeholder.pk not in self._rendered_placeholders:
self._rendered_placeholders[placeholder.pk] = rendered_placeholder

placeholder_structure_is = self.placeholder_edit_template.format(
placeholder_id=placeholder.pk,
Expand All @@ -622,9 +645,9 @@ def render_static_placeholder(self, static_placeholder, language=None):

content = self.render_placeholder(placeholder, language=language)

if static_placeholder not in self._rendered_static_placeholders:
if static_placeholder.pk not in self._rendered_static_placeholders:
# First time this static placeholder is rendered
self._rendered_static_placeholders.append(st 8000 atic_placeholder)
self._rendered_static_placeholders[static_placeholder.pk] = static_placeholder
return content

def render_plugin(self, instance, page=None):
Expand Down
23 changes: 20 additions & 3 deletions cms/tests/test_rendering.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,10 @@ def strip_rendered(self, content):
return content.strip().replace(u"\n", u"")

@override_settings(CMS_TEMPLATES=[(TEMPLATE_NAME, '')])
def render(self, page, template=None, context_vars=None):
request = self.get_request(page=page)
request.toolbar = CMSToolbar(request)
def render(self, page, template=None, context_vars=None, request=None):
if request is None:
request = self.get_request(page=page)
request.toolbar = CMSToolbar(request)

if context_vars is None:
context_vars = {}
Expand Down Expand Up @@ -316,6 +317,22 @@ def test_placeholder_or(self):
r = self.render(self.test_page, template=t)
self.assertEqual(r, u'|No content')

def test_placeholder_or_in_edit_mode(self):
"""
Tests the {% placeholder or %} templatetag in edit mode.
"""
t = u'{% load cms_tags %}' + \
u'|{% placeholder "empty" or %}No content{% endplaceholder %}'
superuser = self.get_superuser()

with self.login_user_context(superuser):
endpoint = self.test_page.get_absolute_url() + '?edit'
request = self.get_request(endpoint, page=self.test_page)
request.session['cms_edit'] = True
request.toolbar = CMSToolbar(request)
r = self.render(self.test_page, template=t, request=request)
self.assertEqual(r, u'|No content')

def test_render_placeholder_tag(self):
"""
Tests the {% render_placeholder %} templatetag.
Expand Down
0