From 96208f1f4001f63181214524f52981a5249b0d27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sat, 14 Oct 2017 22:08:21 +0200 Subject: [PATCH] misc: also look for placeholders within cells (#19443) --- combo/apps/family/models.py | 2 ++ combo/apps/lingo/models.py | 3 ++ combo/apps/wcs/models.py | 3 ++ combo/data/models.py | 25 ++++++++++------ combo/manager/views.py | 4 +-- combo/public/templates/combo/placeholder.html | 2 ++ combo/public/templatetags/combo.py | 19 ++++++++++-- tests/test_manager.py | 29 +++++++++++++++---- 8 files changed, 68 insertions(+), 19 deletions(-) diff --git a/combo/apps/family/models.py b/combo/apps/family/models.py index e6f31c94..fdf1ab02 100644 --- a/combo/apps/family/models.py +++ b/combo/apps/family/models.py @@ -39,6 +39,8 @@ class FamilyInfosCell(CellBase): return is_family_enabled() def get_cell_extra_context(self, context): + if context.get('placeholder_search_mode'): + return {} user = self.get_concerned_user(context) if not user or user.is_anonymous(): return {} diff --git a/combo/apps/lingo/models.py b/combo/apps/lingo/models.py index a3ce4f11..aaaec020 100644 --- a/combo/apps/lingo/models.py +++ b/combo/apps/lingo/models.py @@ -535,6 +535,9 @@ class Items(CellBase): def get_cell_extra_context(self, context): ctx = super(Items, self).get_cell_extra_context(context) + if context.get('placeholder_search_mode'): + # don't call webservices when we're just looking for placeholders + return ctx ctx.update({'title': self.title, 'text': self.text}) items = self.get_invoices(user=context['user']) items.sort(key=lambda i: i.creation_date, reverse=True) diff --git a/combo/apps/wcs/models.py b/combo/apps/wcs/models.py index ffb36e94..181e9e2b 100644 --- a/combo/apps/wcs/models.py +++ b/combo/apps/wcs/models.py @@ -140,6 +140,9 @@ class WcsBlurpMixin(object): cache_duration = 5 def get_data(self, context): + if context.get('placeholder_search_mode'): + # don't call webservices when we're just looking for placeholders + return {} if self.wcs_site: try: wcs_sites = {self.wcs_site: get_wcs_services()[self.wcs_site]} diff --git a/combo/data/models.py b/combo/data/models.py index 175d492e..a3cf5021 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -78,11 +78,11 @@ def element_is_visible(element, user=None): class Placeholder(object): - def __init__(self, key, name=None, internal=False, acquired=False): + def __init__(self, key, name=None, acquired=False, render=True): self.key = key self.name = name - self.internal = internal self.acquired = acquired + self.render = render class PageManager(models.Manager): @@ -184,7 +184,7 @@ class Page(models.Model): def get_template_display_name(self): return settings.COMBO_PUBLIC_TEMPLATES[self.template_name]['name'] - def get_placeholders(self, template_name=None): + def get_placeholders(self, traverse_cells=False, template_name=None): placeholders = [] page_template = settings.COMBO_PUBLIC_TEMPLATES.get(template_name or self.template_name) @@ -201,9 +201,10 @@ class Page(models.Model): context = RequestContext(request, { 'page': self, 'request': request, - 'synchronous': False, + 'synchronous': True, 'placeholder_search_mode': True, 'placeholders': placeholders, + 'traverse_cells': traverse_cells, }) tmpl.render(context) return placeholders @@ -713,7 +714,10 @@ class FeedCell(CellBase): return bool(self.url) and super(FeedCell, self).is_visible(user=user) def get_cell_extra_context(self, context): - context = super(FeedCell, self).get_cell_extra_context(context) + extra_context = super(FeedCell, self).get_cell_extra_context(context) + if context.get('placeholder_search_mode'): + # don't call webservices when we're just looking for placeholders + return extra_context cache_key = hashlib.md5(self.url).hexdigest() feed_content = cache.get(cache_key) if not feed_content: @@ -722,15 +726,15 @@ class FeedCell(CellBase): feed_content = feed_response.content cache.set(cache_key, feed_content, 600) if feed_content: - context['feed'] = feedparser.parse(feed_content) + extra_context['feed'] = feedparser.parse(feed_content) if self.limit: - context['feed']['entries'] = context['feed']['entries'][:self.limit] + extra_context['feed']['entries'] = extra_context['feed']['entries'][:self.limit] if not self.title: try: - self.title = context['feed']['feed'].title + self.title = extra_context['feed']['feed'].title except KeyError: pass - return context + return extra_context def render(self, context): cache_key = hashlib.md5(self.url).hexdigest() @@ -885,6 +889,9 @@ class JsonCellBase(CellBase): def get_cell_extra_context(self, context, invalidate_cache=False): extra_context = super(JsonCellBase, self).get_cell_extra_context(context) + if context.get('placeholder_search_mode'): + # don't call webservices when we're just looking for placeholders + return extra_context if self.varnames and context.get('request'): for varname in self.varnames: if varname in context['request'].GET: diff --git a/combo/manager/views.py b/combo/manager/views.py index 8199073e..bd4e1625 100644 --- a/combo/manager/views.py +++ b/combo/manager/views.py @@ -210,9 +210,7 @@ class PageView(DetailView): placeholders = [] combo_template = settings.COMBO_PUBLIC_TEMPLATES.get(template) - for placeholder in self.object.get_placeholders(): - if placeholder.internal: - continue + for placeholder in self.object.get_placeholders(traverse_cells=True): placeholder_dict = { 'key': placeholder.key, 'name': placeholder.name, diff --git a/combo/public/templates/combo/placeholder.html b/combo/public/templates/combo/placeholder.html index 34aedcdc..c5a15547 100644 --- a/combo/public/templates/combo/placeholder.html +++ b/combo/public/templates/combo/placeholder.html @@ -1,4 +1,5 @@ {% load combo i18n %} +{% if render %} {% for cell in cells %}
', resp.body) == ['content', 'footer'] + + # check a placeholder within a cell is included + cell.template_string = '{% load combo %}{% placeholder "foobar" name="Foobar" %}' + cell.save() + resp = app.get('/manage/pages/%s/' % page.id) + assert re.findall('data-placeholder-key="(.*)">', resp.body) == ['content', 'foobar', 'footer']