From 73c5ca6be8ec568036c0fff4e1691aa0ed65e964 Mon Sep 17 00:00:00 2001 From: Bradley Arsenault Date: Sat, 21 Dec 2013 18:27:09 -0400 Subject: [PATCH] Changed the simple_form class to properly convert variables to their html representation using formencode.Validator.from_python. --- pyramid_simpleform/__init__.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/pyramid_simpleform/__init__.py b/pyramid_simpleform/__init__.py index b5aff63..a07d65b 100644 --- a/pyramid_simpleform/__init__.py +++ b/pyramid_simpleform/__init__.py @@ -112,10 +112,13 @@ def __init__(self, request, schema=None, validators=None, defaults=None, self.data.update(defaults) if obj: - fields = self.schema.fields.keys() + self.validators.keys() - for f in fields: - if hasattr(obj, f): - self.data[f] = getattr(obj, f) + fields = itertools.chain(self.schema.fields.iteritems(), self.validators.iteritems()) + for name, validator in fields: + if hasattr(obj, name): + try: + self.data[name] = validator.from_python(getattr(obj, name) ) + except Invalid as e: + self.data[name] = getattr(obj, name) def is_error(self, field): """ @@ -192,7 +195,8 @@ def validate(self, force_validate=False, params=None): if self.schema: try: - self.data = self.schema.to_python(decoded, self.state) + self.data = self.schema.from_python(self.schema.to_python(decoded, self.state), self.state) + except Invalid, e: self.errors = e.unpack_errors(self.variable_decode, self.dict_char, @@ -201,8 +205,8 @@ def validate(self, force_validate=False, params=None): if self.validators: for field, validator in self.validators.iteritems(): try: - self.data[field] = validator.to_python(decoded.get(field), - self.state) + self.data[field] = validator.from_python(validator.to_python(decoded.get(field), + self.state), self.state) except Invalid, e: self.errors[field] = unicode(e) @@ -239,6 +243,7 @@ def bind(self, obj, include=None, exclude=None): raise RuntimeError, "Cannot bind to object if form has errors" items = [(k, v) for k, v in self.data.items() if not k.startswith("_")] + fields = dict(itertools.chain(self.schema.fields.iteritems(), self.validators.iteritems())) for k, v in items: if include and k not in include: @@ -246,6 +251,8 @@ def bind(self, obj, include=None, exclude=None): if exclude and k in exclude: continue + + v = fields[k].to_python(v) setattr(obj, k, v)