Projet

Général

Profil

0001-forms-use-a-template-to-render-widgets-17964.patch

Frédéric Péters, 11 août 2017 10:53

Télécharger (6,63 ko)

Voir les différences:

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
wcs/qommon/form.py
62 62
from quixote.html import htmltext, htmltag, htmlescape, TemplateIO
63 63
from quixote.util import randbytes
64 64

  
65
from django.template import RequestContext
66
from django.utils.safestring import mark_safe
67

  
68
from .template import render as render_template
65 69
from wcs.portfolio import has_portfolio
66 70

  
67 71
from qommon import _, ngettext
......
114 118

  
115 119
def render(self):
116 120
    # quixote/form/widget.py, Widget::render
117
    r = TemplateIO(html=True)
118
    classnames = '%s widget' % self.__class__.__name__
119
    if hasattr(self, 'extra_css_class') and self.extra_css_class:
120
        classnames += ' ' + self.extra_css_class
121
    if self.get_error():
122
        classnames += ' widget-with-error'
123
    if self.get_message():
124
        classnames += ' widget-with-message'
125
    if self.is_required():
126
        classnames += ' widget-required'
127
    else:
128
        classnames += ' widget-optional'
129
    if self.is_prefilled():
130
        classnames += ' widget-prefilled'
131
    attributes = {}
132
    if hasattr(self, 'div_id') and self.div_id:
133
        attributes['data-valuecontainerid'] = 'form_%s' % self.name
134
    if hasattr(self, 'prefill_attributes') and self.prefill_attributes:
135
        for k, v in self.prefill_attributes.items():
136
            attributes['data-' + k] = v
137
    if hasattr(self, 'div_id') and self.div_id:
138
        attributes['id'] = self.div_id
139
    for attr in ('data-dynamic-display-child-of', 'data-dynamic-display-value'):
140
        if attr in self.attrs:
141
            attributes[attr] = self.attrs.pop(attr)
142
    attributes['class'] = classnames
143
    r += htmltext('<div %s>' % ' '.join(['%s="%s"' % x for x in attributes.items()]))
144
    r += self.render_title(self.get_title())
145
    classnames = 'content'
146
    if hasattr(self, 'content_extra_css_class') and self.content_extra_css_class:
147
        classnames += ' ' + self.content_extra_css_class
148
    r += htmltext('<div class="%s">' % classnames)
149
    r += self.render_error(self.get_error())
150
    r += self.render_content()
151
    r += self.render_hint(self.get_hint())
152
    r += self.render_message(self.get_message())
153
    r += htmltext('</div>')
154
    r += htmltext('</div>')
155
    if self.render_br:
156
        r += htmltext('<br class="%s" />') % classnames
157
    r += htmltext('\n')
158
    return r.getvalue()
121
    def safe(text):
122
        return mark_safe(str(htmlescape(text)))
123
    self.class_name = self.__class__.__name__
124
    self.rendered_title = lambda: safe(self.render_title(self.get_title()))
125
    self.rendered_error = lambda: safe(self.render_error(self.get_error()))
126
    self.rendered_hint = lambda: safe(self.render_hint(self.get_hint()))
127
    self.rendered_message = lambda: safe(self.render_message(self.get_message()))
128
    context = RequestContext(get_request(), {'widget': self})
129
    template_names = []
130
    widget_template_name = getattr(self, 'template_name', None)
131
    for extra_css_class in (getattr(self, 'extra_css_class', '') or '').split():
132
        if not extra_css_class.startswith('template-'):
133
            continue
134
        template_name = extra_css_class.split('-', 1)[1]
135
        # full template
136
        template_names.append('qommon/form/widgets/%s.html' % template_name)
137
        if widget_template_name:
138
            # widget specific variation
139
            template_names.append(widget_template_name.replace(
140
                '.html', '--%s.html' % template_name))
141
    if widget_template_name:
142
        template_names.append(widget_template_name)
143
    template_names.append('qommon/forms/widget.html')
144
    return htmltext(render_template(template_names, context))
159 145

  
160 146
Widget.get_error = get_i18n_error
161 147
Widget.render = render
wcs/qommon/templates/qommon/forms/widget.html
1
{% load qommon %}
2
<div class="widget {{widget.class_name}} {{widget.extra_css_class}}
3
     {% if widget.get_error %}widget-with-error{% endif %}
4
     {% if widget.get_message %}widget-with-message{% endif %}
5
     {% if widget.is_required %}widget-required{% else %}widget-optional{% endif %}
6
     {% if widget.is_prefilled %}widget-prefilled{% endif %}"
7
     {% if widget.div_id %}id="{{widget.div_id}}"{% endif %}
8
     {% for attr in widget.prefill_attributes %}
9
     data-{{attr}}="{{widget.prefill_attributes|get:attr}}"
10
     {% endfor %}
11
     {% if "data-dynamic-display-child-of" in widget.attrs %}
12
     data-dynamic-display-child-of="{{widget.attrs|get:"data-dynamic-display-child-of"}}"
13
     {% endif %}
14
     {% if "data-dynamic-display-value" in widget.attrs %}
15
     data-dynamic-display-value="{{widget.attrs|get:"data-dynamic-display-value"}}"
16
     {% endif %}>
17
  {% block widget-title %}
18
  {{widget.rendered_title}}
19
  {% endblock %}
20
  {% block widget-content %}
21
  <div class="content {{widget.content.content_extra_css_class}}">
22
    {% block widget-error %}{{widget.rendered_error}}{% endblock %}
23
    {% block widget-control %}{{widget.render_content|safe}}{% endblock %}
24
    {% block widget-hint %}{{widget.rendered_hint}}{% endblock %}
25
    {% block widget-message %}{{widget.rendered_message}}{% endblock %}
26
  </div>
27
  {% endblock %}
28
  {% if widget.render_br %}
29
  <br class="content {{widget.content.content_extra_css_class}}">
30
  {% endif %}
31
</div>
wcs/qommon/templatetags/qommon.py
1
from django import template
2

  
3
register = template.Library()
4

  
5
@register.filter
6
def get(mapping, key):
7
    return mapping.get(key)
0
-