8000 Fixed #6037 -- Placeholders without content in edit mode should also … · django-cms/django-cms@b5bee89 · GitHub
[go: up one dir, main page]

Skip to content

Commit b5bee89

Browse files
committed
Fixed #6037 -- Placeholders without content in edit mode should also fallback.
1 parent 8003cd2 commit b5bee89

File tree

2 files changed

+61
-21
lines changed

2 files changed

+61
-21
lines changed

cms/plugin_rendering.py

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import unicode_literals
3-
from collections import deque
3+
from collections import OrderedDict
44

55
from functools import partial
66

@@ -53,14 +53,23 @@ def _unpack_plugins(parent_plugin):
5353

5454

5555
class RenderedPlaceholder(object):
56-
__slots__ = ('placeholder', 'language', 'site_id', 'cached', 'editable')
56+
__slots__ = (
57+
'language',
58+
'site_id',
59+
'cached',
60+
'editable',
61+
'placeholder',
62+
'has_content',
63+
)
5764

58-
def __init__(self, placeholder, language, site_id, cached=False, editable=False):
59-
self.placeholder = placeholder
65+
def __init__(self, placeholder, language, site_id, cached=False,
66+
editable=False, has_content=False):
6067
self.language = language
6168
self.site_id = site_id
6269
self.cached = cached
6370
self.editable = editable
71+
self.placeholder = placeholder
72+
self.has_content = has_content
6473

6574
def __eq__(self, other):
6675
# The same placeholder rendered with different
@@ -86,8 +95,8 @@ def __init__(self, request):
8695
self._cached_plugin_classes = {}
8796
self._placeholders_content_cache = {}
8897
self._placeholders_by_page_cache = {}
89-
self._rendered_placeholders = deque()
90-
self._rendered_static_placeholders = deque()
98+
self._rendered_placeholders = OrderedDict()
99+
self._rendered_static_placeholders = OrderedDict()
91100
self._rendered_plugins_by_placeholder = {}
92101

93102
@cached_property
@@ -179,13 +188,15 @@ def get_rendered_plugins_cache(self, placeholder):
179188
return self._rendered_plugins_by_placeholder.get(placeholder.pk, blank)
180189

181190
def get_rendered_placeholders(self):
182-
return [r.placeholder for r in self._rendered_placeholders]
191+
rendered = list(self._rendered_placeholders.values())
192+
return [r.placeholder for r in rendered]
183193

184194
def get_rendered_editable_placeholders(self):
185-
return [r.placeholder for r in self._rendered_placeholders if r.editable]
195+
rendered = list(self._rendered_placeholders.values())
196+
return [r.placeholder for r in rendered if r.editable]
186197

187198
def get_rendered_static_placeholders(self):
188-
return self._rendered_static_placeholders
199+
return list(self._rendered_static_placeholders.values())
189200

190201

191202
class ContentRenderer(BaseRenderer):
@@ -289,17 +300,18 @@ def render_placeholder(self, placeholder, context, language=None, page=None,
289300
site_id=self.site_id,
290301
cached=use_cache,
291302
editable=editable,
303+
has_content=bool(placeholder_content),
292304
)
293305

294-
if rendered_placeholder not in self._rendered_placeholders:
306+
if placeholder.pk not in self._rendered_placeholders:
295307
# First time this placeholder is rendered
296308
if not self.toolbar._cache_disabled:
297309
# The toolbar middleware needs to know if the response
298310
# is to be cached.
299311
# Set the _cache_disabled flag to the value of cache_placeholder
300312
# only if the flag is False (meaning cache is enabled).
301313
self.toolbar._cache_disabled = not use_cache
302-
self._rendered_placeholders.append(rendered_placeholder)
314+
self._rendered_placeholders[placeholder.pk] = rendered_placeholder
303315

304316
if editable:
305317
data = self.get_editable_placeholder_context(placeholder, language, page=page)
@@ -343,6 +355,7 @@ def render_page_placeholder(self, slot, context, inherit,
343355
placeholder = placeholder_cache[current_page.pk][slot]
344356
except KeyError:
345357
content = ''
358+
placeholder = None
346359
else:
347360
content = self.render_placeholder(
348361
placeholder,
@@ -378,7 +391,17 @@ def render_page_placeholder(self, slot, context, inherit,
378391
editable=False,
379392
)
380393

381-
if not content and nodelist:
394+
if placeholder and (editable and self._placeholders_are_editable):
395+
# In edit mode, the contents of the placeholder are mixed with our
396+
# internal toolbar markup, so the content variable will always be True.
397+
# Use the rendered placeholder has_content flag instead.
398+
has_content = self._rendered_placeholders[placeholder.pk].has_content
399+
else:
400+
# User is not in edit mode or the placeholder doesn't exist.
401+
# Either way, we can trust the content variable.
402+
has_content = bool(content)
403+
404+
if not has_content and nodelist:
382405
return nodelist.render(context)
383406
return content
384407

@@ -405,9 +428,9 @@ def render_static_placeholder(self, static_placeholder, context, nodelist=None):
405428
nodelist=nodelist,
406429
)
407430

408-
if static_placeholder not in self._rendered_static_placeholders:
431+
if static_placeholder.pk not in self._rendered_static_placeholders:
409432
# First time this static placeholder is rendered
410-
self._rendered_static_placeholders.append(static_placeholder)
433+
self._rendered_static_placeholders[static_placeholder.pk] = static_placeholder
411434
return content
412435

413436
def render_plugin(self, instance, context, placeholder=None, editable=False):
@@ -594,8 +617,8 @@ def render_placeholder(self, placeholder, language, page=None):
594617
editable=True,
595618
)
596619

597-
if rendered_placeholder not in self._rendered_placeholders:
598-
self._rendered_placeholders.append(rendered_placeholder)
620+
if placeholder.pk not in self._rendered_placeholders:
621+
self._rendered_placeholders[placeholder.pk] = rendered_placeholder
599622

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

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

625-
if static_placeholder not in self._rendered_static_placeholders:
648+
if static_placeholder.pk not in self._rendered_static_placeholders:
626649
# First time this static placeholder is rendered
627-
self._rendered_static_placeholders.append(static_placeholder)
650+
self._rendered_static_placeholders[static_placeholder.pk] = static_placeholder
628651
return content
629652

630653
def render_plugin(self, instance, page=None):

cms/tests/test_rendering.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,10 @@ def strip_rendered(self, content):
219219
return content.strip().replace(u"\n", u"")
220220

221221
@override_settings(CMS_TEMPLATES=[(TEMPLATE_NAME, '')])
222-
def render(self, page, template=None, context_vars=None):
223-
request = self.get_request(page=page)
224-
request.toolbar = CMSToolbar(request)
222+
def render(self, page, template=None, context_vars=None, request=None):
223+
if request is None:
224+
request = self.get_request(page=page)
225+
request.toolbar = CMSToolbar(request)
225226

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

320+
def test_placeholder_or_in_edit_mode(self):
321+
"""
322+
Tests the {% placeholder or %} templatetag in edit mode.
323+
"""
324+
t = u'{% load cms_tags %}' + \
325+
u'|{% placeholder "empty" or %}No content{% endplaceholder %}'
326+
superuser = self.get_superuser()
327+
328+
with self.login_user_context(superuser):
329+
endpoint = self.test_page.get_absolute_url() + '?edit'
330+
request = self.get_request(endpoint, page=self.test_page)
331+
request.session['cms_edit'] = True
332+
request.toolbar = CMSToolbar(request)
333+
r = self.render(self.test_page, template=t, request=request)
334+
self.assertEqual(r, u'|No content')
335+
319336
def test_render_placeholder_tag(self):
320337
"""
321338
Tests the {% render_placeholder %} templatetag.

0 commit comments

Comments
 (0)
0