'''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 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 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
#################
SimpleForm.SubmitButton=SubmitButton
#################
## Overrides from ew.resource
#################
[docs]class JSLink(resource.JSLink):
[docs]class CSSLink(resource.CSSLink):
[docs]class JSScript(resource.JSScript):
[docs]class CSSScript(resource.CSSScript):
[docs]class GoogleAnalytics(resource.GoogleAnalytics):