0001"""
0002Class to encapsulate an HTML form, using htmlfill and
0003htmlfill_schemabuilder (deprecated).
0004
0005.. note::
0006 This is deprecated, as it's not that helpful.
0007
0008Usage::
0009
0010 html = '<form action=...>...</form>'
0011 class FormSchema(schema.Schema):
0012 f1 = ...
0013 form = HTMLForm(html, FormSchema())
0014 errors = {}
0015 if form_submitted:
0016 form_result, errors = form.validate(request_dict)
0017 if not errors:
0018 do_action(form_result)
0019 return
0020 defaults = form.schema.from_python(get_defaults_from_model())
0021 defaults.update(request_dict)
0022 write(form.render(defaults, errors)
0023
0024You can also embed the schema in the form, using form:required, etc.,
0025tags.
0026
0027"""
0028
0029import htmlfill
0030import htmlfill_schemabuilder
0031from api import Invalid
0032import warnings
0033
0034class HTMLForm(object):
0035
0036 def __init__(self, form, schema=None,
0037 auto_insert_errors=True):
0038 warnings.warn(
0039 'HTMLForm has been deprecated; use the htmlfill and '
0040 'htmlfill_schemabuilder modules directly.',
0041 DeprecationWarning,
0042 stacklevel=1)
0043 self.form = form
0044 self._schema = schema
0045 self.auto_insert_errors = auto_insert_errors
0046
0047 def schema__get(self):
0048 if self._schema is not None:
0049 return self._schema
0050 self._schema = self.parse_schema()
0051
0052 def schema__set(self, value):
0053 self._schema = value
0054
0055 def schema__del(self):
0056 self._schema = None
0057
0058 schema = property(schema__get, schema__set, schema__del)
0059
0060 def parse_schema(self):
0061 listener = htmlfill_schemabuilder.SchemaBuilder()
0062 p = htmlfill.FillingParser(
0063 defaults={}, listener=listener)
0064 p.feed(self.form)
0065 p.close()
0066 return listener.schema()
0067
0068 def render(self, defaults={}, errors={}, use_all_keys=False,
0069 text_as_default=False):
0070 if self.auto_insert_errors:
0071 auto_error_formatter = htmlfill.default_formatter
0072 else:
0073 auto_error_formatter = None
0074 p = htmlfill.FillingParser(
0075 defaults=defaults, errors=errors,
0076 use_all_keys=use_all_keys,
0077 auto_error_formatter=auto_error_formatter,
0078 text_as_default=text_as_default)
0079 p.feed(self.form)
0080 p.close()
0081 return p.text()
0082
0083 def validate(self, request_dict, state=None):
0084 schema = self.schema
0085 try:
0086 result = schema.to_python(request_dict, state=state)
0087 return result, None
0088 except Invalid, e:
0089 return None, e.unpack_errors()