1
1
# -*- coding: utf-8 -*-
2
2
from __future__ import unicode_literals
3
- from collections import deque
3
+ from collections import OrderedDict
4
4
5
5
from functools import partial
6
6
@@ -53,14 +53,23 @@ def _unpack_plugins(parent_plugin):
53
53
54
54
55
55
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
+ )
57
64
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 ):
60
67
self .language = language
61
68
self .site_id = site_id
62
69
self .cached = cached
63
70
self .editable = editable
71
+ self .placeholder = placeholder
72
+ self .has_content = has_content
64
73
65
74
def __eq__ (self , other ):
66
75
# The same placeholder rendered with different
@@ -86,8 +95,8 @@ def __init__(self, request):
86
95
self ._cached_plugin_classes = {}
87
96
self ._placeholders_content_cache = {}
88
97
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 ()
91
100
self ._rendered_plugins_by_placeholder = {}
92
101
93
102
@cached_property
@@ -179,13 +188,15 @@ def get_rendered_plugins_cache(self, placeholder):
179
188
return self ._rendered_plugins_by_placeholder .get (placeholder .pk , blank )
180
189
181
190
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 ]
183
193
184
194
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 ]
186
197
187
198
def get_rendered_static_placeholders (self ):
188
- return self ._rendered_static_placeholders
199
+ return list ( self ._rendered_static_placeholders . values ())
189
200
190
201
191
202
class ContentRenderer (BaseRenderer ):
@@ -289,17 +300,18 @@ def render_placeholder(self, placeholder, context, language=None, page=None,
289
300
site_id = self .site_id ,
290
301
cached = use_cache ,
291
302
editable = editable ,
303
+ has_content = bool (placeholder_content ),
292
304
)
293
305
294
- if rendered_placeholder not in self ._rendered_placeholders :
306
+ if placeholder . pk not in self ._rendered_placeholders :
295
307
# First time this placeholder is rendered
296
308
if not self .toolbar ._cache_disabled :
297
309
# The toolbar middleware needs to know if the response
298
310
# is to be cached.
299
311
# Set the _cache_disabled flag to the value of cache_placeholder
300
312
# only if the flag is False (meaning cache is enabled).
301
313
self .toolbar ._cache_disabled = not use_cache
302
- self ._rendered_placeholders . append ( rendered_placeholder )
314
+ self ._rendered_placeholders [ placeholder . pk ] = rendered_placeholder
303
315
304
316
if editable :
305
317
data = self .get_editable_placeholder_context (placeholder , language , page = page )
@@ -343,6 +355,7 @@ def render_page_placeholder(self, slot, context, inherit,
343
355
placeholder = placeholder_cache [current_page .pk ][slot ]
344
356
except KeyError :
345
357
content = ''
358
+ placeholder = None
346
359
else :
347
360
content = self .render_placeholder (
348
361
placeholder ,
@@ -378,7 +391,17 @@ def render_page_placeholder(self, slot, context, inherit,
378
391
editable = False ,
379
392
)
380
393
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 :
382
405
return nodelist .render (context )
383
406
return content
384
407
@@ -405,9 +428,9 @@ def render_static_placeholder(self, static_placeholder, context, nodelist=None):
405
428
nodelist = nodelist ,
406
429
)
407
430
408
- if static_placeholder not in self ._rendered_static_placeholders :
431
+ if static_placeholder . pk not in self ._rendered_static_placeholders :
409
432
# 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
411
434
return content
412
435
413
436
def render_plugin (self , instance , context , placeholder = None , editable = False ):
@@ -594,8 +617,8 @@ def render_placeholder(self, placeholder, language, page=None):
594
617
editable = True ,
595
618
)
596
619
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
599
622
600
623
placeholder_structure_is = self .placeholder_edit_template .format (
601
624
placeholder_id = placeholder .pk ,
@@ -622,9 +645,9 @@ def render_static_placeholder(self, static_placeholder, language=None):
622
645
623
646
content = self .render_placeholder (placeholder , language = language )
624
647
625
- if static_placeholder not in self ._rendered_static_placeholders :
648
+ if static_placeholder . pk not in self ._rendered_static_placeholders :
626
649
# 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
628
651
return content
629
652
630
653
def render_plugin (self , instance , page = None ):
0 commit comments