Source code for ew.jinja2_ew

'''Implementation of core ew widgets in terms of Jinja2 templates
'''
from cgi import escape

from webhelpers.html import literal

from . import fields
from . import select
from . import forms
from . import widget
from . import resource
from .render import Snippet, File

def _escape(s):
    try:
        return s.__html__()
    except:
        return escape(unicode(s))

class _Jinja2Widget(fields.FieldWidget):

    def j2_attrs(self, *attrdicts):
        attrdict={}
        for ad in attrdicts:
            if ad:
                attrdict.update(ad)
        result = [
            '%s="%s"' % (
                _escape(k), _escape(v))
            for k,v in sorted(attrdict.items())
            if v is not None ]
        return literal(' '.join(result))

#################
## Overrides from ew.fields
#################

[docs]class InputField(fields.InputField, _Jinja2Widget): template=Snippet('''<input {{widget.j2_attrs({ 'type':field_type, 'name':name, 'class':css_class, 'readonly':readonly, 'value':value}, attrs)}}>''', 'jinja2')
[docs]class HiddenField(fields.HiddenField, _Jinja2Widget): template=InputField.template
[docs]class CompoundField(fields.CompoundField, _Jinja2Widget): template=InputField.template
[docs]class FieldSet(fields.FieldSet, _Jinja2Widget): template=File('ew.templates.jinja2.field_set', 'jinja2')
[docs]class RowField(fields.RowField, _Jinja2Widget): template=File('ew.templates.jinja2.row_field', 'jinja2')
[docs]class RepeatedField(fields.RepeatedField, _Jinja2Widget): template=File('ew.templates.jinja2.repeated_field', 'jinja2')
[docs]class TableField(fields.TableField, _Jinja2Widget): template=File('ew.templates.jinja2.table_field', 'jinja2')
TableField.RowField=RowField
[docs]class TextField(fields.TextField, _Jinja2Widget): template=InputField.template
[docs]class EmailField(fields.EmailField, _Jinja2Widget): template=InputField.template
[docs]class NumberField(fields.NumberField, _Jinja2Widget): template=InputField.template
[docs]class IntField(fields.IntField, _Jinja2Widget): template=InputField.template
[docs]class DateField(fields.DateField, _Jinja2Widget): template=InputField.template
[docs]class TimeField(fields.TimeField, _Jinja2Widget): template=InputField.template
[docs]class TextArea(fields.TextArea, _Jinja2Widget): template=Snippet('''<textarea {{widget.j2_attrs({ 'name':name, 'class':css_class, 'readonly':readonly}, attrs)}}>{% if value %}{{value}}{% endif %}</textarea>''', 'jinja2')
[docs]class Checkbox(fields.Checkbox, _Jinja2Widget): template=File('ew.templates.jinja2.checkbox', 'jinja2')
[docs]class SubmitButton(fields.SubmitButton, _Jinja2Widget): template=Snippet('''<input {{widget.j2_attrs({ 'type':'submit', 'name':name, 'value':label, 'class':css_class}, attrs)}}>''', 'jinja2')
[docs]class HTMLField(fields.HTMLField, _Jinja2Widget): template=Snippet('''{% if text %}{{widget.expand(text)|safe}} {%- elif value %}{{value | safe}}{% endif %}''', 'jinja2')
[docs]class LinkField(fields.LinkField, _Jinja2Widget): template=Snippet('''<a href="{{widget.expand(href)}}" {{widget.j2_attrs(attrs)}}> {%- if text == None %}{{widget.expand(label)}} {%- else %}{{widget.expand(text)}}{% endif %}</a>''', 'jinja2') ################# ## Overrides from ew.select #################
[docs]class SelectField(select.SelectField, _Jinja2Widget): template=File('ew.templates.jinja2.select_field', 'jinja2')
[docs]class SingleSelectField(select.SingleSelectField, _Jinja2Widget): template=SelectField.template
[docs]class MultiSelectField(select.MultiSelectField, _Jinja2Widget): template=SelectField.template
[docs]class Option(select.Option, _Jinja2Widget): template=Snippet('''<option {{widget.j2_attrs({ 'value':html_value, 'selected':selected and 'selected' or None})}}> {{label}}</option>''', 'jinja2')
[docs]class CheckboxSet(select.CheckboxSet, _Jinja2Widget): template=File('ew.templates.jinja2.checkbox_set', 'jinja2') ################# ## Overrides from ew.forms #################
[docs]class SimpleForm(forms.SimpleForm, _Jinja2Widget): template=File('ew.templates.jinja2.simple_form', 'jinja2')
SimpleForm.SubmitButton=SubmitButton ################# ## Overrides from ew.resource #################
[docs]class JSScript(resource.JSScript):
[docs] class WidgetClass(_Jinja2Widget): template=Snippet( '<script type="text/javascript">{{widget.text}}</script>', 'jinja2')
[docs]class CSSScript(resource.CSSScript):
[docs] class WidgetClass(_Jinja2Widget): template=Snippet('<style>{{widget.text}}</style>', 'jinja2')
[docs]class GoogleAnalytics(resource.GoogleAnalytics):
[docs] class WidgetClass(_Jinja2Widget): template=File('ew.templates.jinja2.google_analytics', 'jinja2')