general: extract placeholder details from templates instead of settings (#18925)

This commit is contained in:
Frédéric Péters 2017-10-13 10:34:02 +02:00
parent c4af7f7105
commit 34f6fc985b
10 changed files with 100 additions and 83 deletions

View File

@ -77,6 +77,14 @@ def element_is_visible(element, user=None):
return len(set(page_groups).intersection(user.groups.all())) > 0
class Placeholder(object):
def __init__(self, key, name=None, internal=False, acquired=False):
self.key = key
self.name = name
self.internal = internal
self.acquired = acquired
class PageManager(models.Manager):
def get_by_natural_key(self, path):
parts = [x for x in path.strip('/').split('/') if x] or ['index']
@ -176,6 +184,30 @@ 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):
placeholders = []
page_template = settings.COMBO_PUBLIC_TEMPLATES.get(template_name or self.template_name)
if page_template.get('placeholders'):
# manual declaration
for key, options in page_template['placeholders'].items():
placeholders.append(Placeholder(key=key, **options))
return placeholders
template_name = settings.COMBO_PUBLIC_TEMPLATES.get(self.template_name).get('template')
tmpl = template.loader.select_template([template_name])
request = RequestFactory().get(self.get_online_url())
request.user = None
context = RequestContext(request, {
'page': self,
'request': request,
'synchronous': False,
'placeholder_search_mode': True,
'placeholders': placeholders,
})
tmpl.render(context)
return placeholders
def get_next_page(self, user=None):
pages = Page.get_as_reordered_flat_hierarchy(Page.objects.all())
this_page = [x for x in pages if x.id == self.id][0]

View File

@ -92,10 +92,10 @@ class PageAddView(CreateView):
def form_valid(self, form):
response = super(PageAddView, self).form_valid(form)
if self.object.slug != 'index' or self.object.parent_id:
combo_template = settings.COMBO_PUBLIC_TEMPLATES.get(self.object.template_name)
for placeholder_key, placeholder in combo_template['placeholders'].items():
if placeholder.get('acquired') is True:
ParentContentCell(page=self.object, placeholder=placeholder_key, order=0).save()
for placeholder in self.object.get_placeholders():
if placeholder.acquired is True:
ParentContentCell(page=self.object,
placeholder=placeholder.key, order=0).save()
return response
@ -121,18 +121,17 @@ class PageSelectTemplateView(PageEditView):
new_template_name = self.object.template_name
response = super(PageSelectTemplateView, self).form_valid(form)
if old_template_name != new_template_name:
old_template = settings.COMBO_PUBLIC_TEMPLATES.get(old_template_name)
new_template = settings.COMBO_PUBLIC_TEMPLATES.get(new_template_name)
old_placeholder_keys = [x.key for x in self.get_object().get_placeholders()]
page_cells = CellBase.get_cells(page_id=self.object.id)
for placeholder_key, placeholder in new_template['placeholders'].items():
if not placeholder.get('acquired') is True:
for placeholder in self.object.get_placeholders(new_template_name):
if not placeholder.acquired:
continue
if placeholder_key in old_template:
if placeholder.key in old_placeholder_keys:
continue
if [x for x in page_cells if x.placeholder == placeholder_key]:
if [x for x in page_cells if x.placeholder == placeholder.key]:
# skip placeholders that already have cells
continue
ParentContentCell(page=self.object, placeholder=placeholder_key, order=0).save()
ParentContentCell(page=self.object, placeholder=placeholder.key, order=0).save()
return response
page_select_template = PageSelectTemplateView.as_view()
@ -211,13 +210,12 @@ class PageView(DetailView):
placeholders = []
combo_template = settings.COMBO_PUBLIC_TEMPLATES.get(template)
for placeholder_key, placeholder in combo_template['placeholders'].items():
for placeholder in self.object.get_placeholders():
placeholder_dict = {
'key': placeholder_key,
'name': placeholder['name'],
'key': placeholder.key,
'name': placeholder.name,
}
placeholder_dict['cells'] = [x for x in cells if (
x.placeholder == placeholder_key)]
placeholder_dict['cells'] = [x for x in cells if x.placeholder == placeholder.key]
placeholders.append(placeholder_dict)
context['placeholders'] = placeholders

View File

@ -1,4 +1,4 @@
{% load combo gadjo %}<!DOCTYPE html>
{% load combo gadjo i18n %}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
@ -28,12 +28,14 @@
{% endblock %}
{% block combo-content %}
{% placeholder "content" %}
{% trans "Content" as name %}
{% placeholder "content" name=name %}
{% endblock %}
</div>
<div id="footer">
{% block footer %}
{% placeholder "footer" %}
{% trans "Footer" as name %}
{% placeholder "footer" name=name acquired=True %}
{% skeleton_extra_placeholder footer %}
<span style="display: none">{% now "Y-m-d H:i:s" %}</span>
{% end_skeleton_extra_placeholder %}

View File

@ -1,11 +1,13 @@
{% extends "combo/page_template.html" %}
{% load combo %}
{% load combo i18n %}
{% block combo-content %}
<div id="main-content">
{% placeholder "content" %}
{% trans "Content" as name %}
{% placeholder "content" name=name %}
</div>
<div id="sidebar">
{% placeholder "sidebar" %}
{% trans "Sidebar" as name %}
{% placeholder "sidebar" name=name %}
</div>
{% endblock %}

View File

@ -24,6 +24,7 @@ from django.template import RequestContext
from django.template.base import TOKEN_BLOCK, TOKEN_VAR
from django.utils import dateparse
from combo.data.models import Placeholder
from combo.public.menu import get_menu_context
from combo.utils import NothingInCacheException
from combo.apps.dashboard.models import DashboardCell, Tile
@ -37,7 +38,10 @@ def skeleton_text(context, placeholder_name, content=''):
placeholder_name, placeholder_name, content)
@register.inclusion_tag('combo/placeholder.html', takes_context=True)
def placeholder(context, placeholder_name):
def placeholder(context, placeholder_name, **options):
if context.get('placeholder_search_mode'):
context['placeholders'].append(Placeholder(key=placeholder_name, **options))
return context
context['cells'] = [x for x in context.get('page_cells', []) if
x.placeholder == placeholder_name and
(context.get('render_skeleton') or x.is_relevant(context))]

View File

@ -206,10 +206,9 @@ def skeleton(request):
# add default ParentContentCells to the page
cells = []
combo_template = settings.COMBO_PUBLIC_TEMPLATES[selected_page.template_name]
for placeholder_key, placeholder in combo_template['placeholders'].items():
if placeholder.get('acquired') is True:
cells.append(ParentContentCell(page=selected_page, placeholder=placeholder_key, order=0))
for placeholder in selected_page.get_placeholders():
if placeholder.acquired:
cells.append(ParentContentCell(page=selected_page, placeholder=placeholder.key, order=0))
else:
cells = CellBase.get_cells(page_id=selected_page.id)
@ -245,9 +244,9 @@ class StyleDemoPage(object):
self.page.template_name = self.template_name
self.page.save()
combo_template = settings.COMBO_PUBLIC_TEMPLATES[self.page.template_name]
for i, placeholder in enumerate(combo_template['placeholders'].keys()):
cell = TextCell(page=self.page, placeholder=placeholder, order=0)
if placeholder == 'footer':
for i, placeholder in enumerate(self.page.get_placeholders()):
cell = TextCell(page=self.page, placeholder=placeholder.key, order=0)
if placeholder.key == 'footer':
cell.text = '<p>%s</p>' % lorem_ipsum.sentence()
else:
cell.text = '<h2>%s</h2>%s' % (
@ -257,7 +256,7 @@ class StyleDemoPage(object):
if i == 0:
# add a template selector in first placeholder
cell = TextCell(page=self.page, placeholder=placeholder, order=1)
cell = TextCell(page=self.page, placeholder=placeholder.key, order=1)
options_html = []
for template_key, template_dict in settings.COMBO_PUBLIC_TEMPLATES.items():
attr = 'value="%s"' % template_key

View File

@ -175,66 +175,20 @@ COMBO_PUBLIC_TEMPLATES = {
'standard': {
'name': _('One column'),
'template': 'combo/page_template.html',
'placeholders': {
'content': {
'name': _('Content'),
},
'footer': {
'name': _('Footer'),
'acquired': True,
},
}
},
'standard-sidebar': {
'name': _('One column + sidebar'),
'template': 'combo/page_template_sidebar.html',
'placeholders': {
'content': {
'name': _('Content'),
},
'sidebar': {
'name': _('Sidebar'),
},
'footer': {
'name': _('Footer'),
'acquired': True,
},
}
},
'two-columns': {
'name': _('Two columns'),
'template': 'combo/page_template_2cols.html',
'placeholders': {
'content': {
'name': _('Left Column'),
},
'right': {
'name': _('Right Column'),
},
'footer': {
'name': _('Footer'),
'acquired': True,
},
}
},
'two-columns-sidebar': {
'name': _('Two columns + sidebar'),
'template': 'combo/page_template_2cols_sidebar.html',
'placeholders': {
'content': {
'name': _('Left Column'),
},
'right': {
'name': _('Right Column'),
},
'sidebar': {
'name': _('Sidebar'),
},
'footer': {
'name': _('Footer'),
'acquired': True,
},
}
# get those labels into gettext catalog
'_': (_('Left Column'), _('Right Column')),
},
}

View File

@ -24,7 +24,8 @@ data-api-root="{{ site_base }}/api/"
{% block content %}
<div id="portal-agent-content">
{% block combo-content %}
{% placeholder "content" %}
{% trans "Content" as name %}
{% placeholder "content" name=name %}
{% endblock %}
</div>
{% endblock %}

View File

@ -1,16 +1,18 @@
{% extends "combo/page_template.html" %}
{% load combo %}
{% load combo i18n %}
{% block bodyargs %}{{ block.super }} class="with-sidebar"{% endblock %}
{% block combo-content %}
<div id="page-content">
{% placeholder "content" %}
{% trans "Content" as name %}
{% placeholder "content" name=name %}
</div>
{% endblock %}
{% block after-main-content %}
<div id="sidebar">
{% placeholder "sidebar" %}
{% trans "Sidebar" as name %}
{% placeholder "sidebar" name=name %}
</div>
{% endblock %}

View File

@ -6,6 +6,7 @@ import sys
from django.conf import settings
from django.contrib.auth.models import User, Group
from django.test import override_settings
from django.utils.timezone import now
from combo.data.models import Page, CellBase, TextCell, LinkCell
from combo.data.management.commands.import_site import Command as ImportSiteCommand
@ -262,3 +263,25 @@ def test_last_update_time():
TextCell.objects.filter(pk=cell.id).update(last_update_timestamp=future_time)
assert page.get_last_update_time() == future_time
def test_get_placeholders():
page = Page(title=u'foo', slug='foo', template_name='standard-sidebar', order=0)
placeholders = page.get_placeholders()
assert [x.key for x in placeholders] == ['content', 'sidebar', 'footer']
assert placeholders[0].acquired is False
assert placeholders[-1].acquired is True
with override_settings(COMBO_PUBLIC_TEMPLATES={
'standard-sidebar': {
'name': 'Test',
'template': 'combo/page_template_sidebar.html',
'placeholders': {
'content': {'name': 'Content'},
'content2': {'name': 'Second Content'},
'sidebar': {'name': 'Sidebar'},
'footer': {'name': 'Footer', 'acquired': False},
}}}):
placeholders = page.get_placeholders()
assert set([x.key for x in placeholders]) == set(['content', 'content2', 'sidebar', 'footer'])
footer_placeholder = [x for x in placeholders if x.key == 'footer'][0]
assert footer_placeholder.acquired is False