html_field = u'''
{title}
{h_input} {errors}
'''
html_field_checkbox = u'''
{h_input}
{title}
{errors}
'''
class FormRender():
field_tpl = {
"string": u'',
"number": u'',
"integer": u'',
"float": u'',
"date": u'',
"file": u'',
"password": u'',
"text": u'',
"radio_option": u'{label}
',
"select_option": u'',
"select": u'',
"checkbox": u'',
}
def __init__(self, form_def):
self.form_def = form_def
def cast_params(self, params):
new_params = params.copy()
if 'required' in new_params:
if new_params['required'] is False:
new_params['required'] = ""
else:
new_params["required"] = "required"
if 'classes' in new_params:
new_params['classes'] = ' '.join(new_params['classes'])
if 'checked' in new_params:
if new_params['checked'] is False:
new_params['checked'] = ""
else:
new_params['checked'] = "checked"
return new_params
def r_field(self, field_type, **kwargs):
params = self.cast_params(kwargs)
method_name = 'r_field_{0}'.format(field_type)
method = getattr(self, method_name, None)
return method(**params)
def r_field_string(self, name, value, size=50, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['string']
return tpl.format(name=name, value=value, size=size, required=required, classes=classes, style=style)
def r_field_number(self, name, value, minval=None, maxval=None, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['number']
return tpl.format(name=name, value=value, minval=minval, maxval=maxval, required=required, classes=classes, style=style)
def r_field_integer(self, name, value, minval=None, maxval=None, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['integer']
return tpl.format(name=name, value=value, minval=minval, maxval=maxval, required=required, classes=classes, style=style)
def r_field_float(self, name, value, minval=None, maxval=None, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['integer']
return tpl.format(name=name, value=value, minval=minval, maxval=maxval, required=required, classes=classes, style=style)
def r_field_date(self, name, value, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['date']
return tpl.format(name=name, value=value, required=required, classes=classes, style=style)
def r_field_file(self, name, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['file']
return tpl.format(name=name, required=required, classes=classes, style=style)
def r_field_password(self, name, value, minval=None, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['password']
return tpl.format(name=name, value=value, minval=minval, required=required, classes=classes, style=style)
def r_field_text(self, name, value, rows=4, cols=80, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['text']
return tpl.format(name=name, value=value, rows=rows, cols=cols, required=required, classes=classes, style=style)
def r_field_radio(self, name, value, options, classes=None, style=""):
if classes is None:
classes = []
tpl_option = self.field_tpl['radio_option']
radio_elems = []
for o_value, o_label in options:
checked = ''
if o_value == value:
checked = 'checked'
radio_elems.append(tpl_option.format(name=name, value=value, checked=checked, label=o_label, classes=classes, style=style))
return u''.join(radio_elems)
def r_field_checkbox(self, name, checked, classes='', style=""):
if classes is None:
classes = []
tpl = self.field_tpl['checkbox']
return tpl.format(name=name, checked=checked, classes=classes, style=style)
def r_field_select(self, name, value, options, classes=None, style=""):
if classes is None:
classes = []
tpl_option = self.field_tpl['select_option']
select_elems = []
for o_value, o_label in options:
selected = ''
if o_value == value:
selected = 'selected'
select_elems.append(tpl_option.format(value=o_value, selected=selected, label=o_label, style=style))
tpl = self.field_tpl['select']
return tpl.format(name=name, select_elems=''.join(select_elems), classes=classes, style=style)
def r_form_line(self, field_type, title, h_input, classes, errors):
if field_type == 'checkbox':
html = html_field_checkbox
else:
html = html_field
return (html.format(classes=' '.join(classes),
title=title,
h_input=h_input,
errors=u', '.join(errors)))