From d4b48a6c9ef2c70151d817aff80a31e900f29535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 23 Jul 2017 17:02:38 +0200 Subject: [PATCH 1/2] forms: use a template to render widgets (#17964) --- wcs/qommon/form.py | 70 +++++++++++---------------- wcs/qommon/templates/qommon/forms/widget.html | 31 ++++++++++++ wcs/qommon/templatetags/__init__.py | 0 wcs/qommon/templatetags/qommon.py | 7 +++ 4 files changed, 66 insertions(+), 42 deletions(-) create mode 100644 wcs/qommon/templates/qommon/forms/widget.html create mode 100644 wcs/qommon/templatetags/__init__.py create mode 100644 wcs/qommon/templatetags/qommon.py diff --git a/wcs/qommon/form.py b/wcs/qommon/form.py index 9e8a0d43..3608f6c4 100644 --- a/wcs/qommon/form.py +++ b/wcs/qommon/form.py @@ -62,6 +62,10 @@ from quixote.form import * from quixote.html import htmltext, htmltag, htmlescape, TemplateIO from quixote.util import randbytes +from django.template import RequestContext +from django.utils.safestring import mark_safe + +from .template import render as render_template from wcs.portfolio import has_portfolio from qommon import _, ngettext @@ -114,48 +118,30 @@ def render_title(self, title): def render(self): # quixote/form/widget.py, Widget::render - r = TemplateIO(html=True) - classnames = '%s widget' % self.__class__.__name__ - if hasattr(self, 'extra_css_class') and self.extra_css_class: - classnames += ' ' + self.extra_css_class - if self.get_error(): - classnames += ' widget-with-error' - if self.get_message(): - classnames += ' widget-with-message' - if self.is_required(): - classnames += ' widget-required' - else: - classnames += ' widget-optional' - if self.is_prefilled(): - classnames += ' widget-prefilled' - attributes = {} - if hasattr(self, 'div_id') and self.div_id: - attributes['data-valuecontainerid'] = 'form_%s' % self.name - if hasattr(self, 'prefill_attributes') and self.prefill_attributes: - for k, v in self.prefill_attributes.items(): - attributes['data-' + k] = v - if hasattr(self, 'div_id') and self.div_id: - attributes['id'] = self.div_id - for attr in ('data-dynamic-display-child-of', 'data-dynamic-display-value'): - if attr in self.attrs: - attributes[attr] = self.attrs.pop(attr) - attributes['class'] = classnames - r += htmltext('
' % ' '.join(['%s="%s"' % x for x in attributes.items()])) - r += self.render_title(self.get_title()) - classnames = 'content' - if hasattr(self, 'content_extra_css_class') and self.content_extra_css_class: - classnames += ' ' + self.content_extra_css_class - r += htmltext('
' % classnames) - r += self.render_error(self.get_error()) - r += self.render_content() - r += self.render_hint(self.get_hint()) - r += self.render_message(self.get_message()) - r += htmltext('
') - r += htmltext('
') - if self.render_br: - r += htmltext('
') % classnames - r += htmltext('\n') - return r.getvalue() + def safe(text): + return mark_safe(str(htmlescape(text))) + self.class_name = self.__class__.__name__ + self.rendered_title = lambda: safe(self.render_title(self.get_title())) + self.rendered_error = lambda: safe(self.render_error(self.get_error())) + self.rendered_hint = lambda: safe(self.render_hint(self.get_hint())) + self.rendered_message = lambda: safe(self.render_message(self.get_message())) + context = RequestContext(get_request(), {'widget': self}) + template_names = [] + widget_template_name = getattr(self, 'template_name', None) + for extra_css_class in (getattr(self, 'extra_css_class', '') or '').split(): + if not extra_css_class.startswith('template-'): + continue + template_name = extra_css_class.split('-', 1)[1] + # full template + template_names.append('qommon/form/widgets/%s.html' % template_name) + if widget_template_name: + # widget specific variation + template_names.append(widget_template_name.replace( + '.html', '--%s.html' % template_name)) + if widget_template_name: + template_names.append(widget_template_name) + template_names.append('qommon/forms/widget.html') + return htmltext(render_template(template_names, context)) Widget.get_error = get_i18n_error Widget.render = render diff --git a/wcs/qommon/templates/qommon/forms/widget.html b/wcs/qommon/templates/qommon/forms/widget.html new file mode 100644 index 00000000..7ed0883b --- /dev/null +++ b/wcs/qommon/templates/qommon/forms/widget.html @@ -0,0 +1,31 @@ +{% load qommon %} +
+ {% block widget-title %} + {{widget.rendered_title}} + {% endblock %} + {% block widget-content %} +
+ {% block widget-error %}{{widget.rendered_error}}{% endblock %} + {% block widget-control %}{{widget.render_content|safe}}{% endblock %} + {% block widget-hint %}{{widget.rendered_hint}}{% endblock %} + {% block widget-message %}{{widget.rendered_message}}{% endblock %} +
+ {% endblock %} + {% if widget.render_br %} +
+ {% endif %} +
diff --git a/wcs/qommon/templatetags/__init__.py b/wcs/qommon/templatetags/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/wcs/qommon/templatetags/qommon.py b/wcs/qommon/templatetags/qommon.py new file mode 100644 index 00000000..ad2754e6 --- /dev/null +++ b/wcs/qommon/templatetags/qommon.py @@ -0,0 +1,7 @@ +from django import template + +register = template.Library() + +@register.filter +def get(mapping, key): + return mapping.get(key) -- 2.14.1