Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add filters to forms #150

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*.pyo
.*.swp
.DS_Store
.idea/*

# Extra Files
MANIFEST
Expand Down
16 changes: 16 additions & 0 deletions tests/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@


class BaseFormTest(TestCase):
def strip_ws(self, s):
if isinstance(s, basestring):
s = s.strip()
return s

def get_form(self, **kwargs):
def validate_test(form, field):
if field.data != 'foobar':
Expand Down Expand Up @@ -81,6 +86,17 @@ def test_formdata_wrapper_error(self):
form = self.get_form()
self.assertRaises(TypeError, form.process, [])

def test_form_filter(self):
form = self.get_form(form_filter=self.strip_ws)
form.process(test=' foo ')
self.assertEqual(form.data, {'test': 'foo'})

def test_form_filter_field_add(self):
form = self.get_form(form_filter=self.strip_ws)
form['test2'] = TextField()
form.process(test=' foo ', test2=' gappy text ')
self.assertEqual(form.data, {'test': 'foo', 'test2': 'gappy text'})


class FormMetaTest(TestCase):
def test_monkeypatch(self):
Expand Down
20 changes: 17 additions & 3 deletions wtforms/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class BaseForm(object):
validation, and data and error proxying.
"""

def __init__(self, fields, prefix='', meta=DefaultMeta()):
def __init__(self, fields, prefix='', meta=DefaultMeta(), form_filter=None):
"""
:param fields:
A dict or sequence of 2-tuples of partially-constructed fields.
Expand All @@ -37,10 +37,14 @@ def __init__(self, fields, prefix='', meta=DefaultMeta()):
self._prefix = prefix
self._errors = None
self._fields = OrderedDict()
self.form_filter = form_filter

if hasattr(fields, 'items'):
fields = fields.items()

for field in fields:
self._apply_form_filter(field[1].kwargs)

translations = self._get_translations()
extra_fields = []
if meta.csrf:
Expand All @@ -66,12 +70,20 @@ def __getitem__(self, name):

def __setitem__(self, name, value):
""" Bind a field to this form. """
value.kwargs = self._apply_form_filter(value.kwargs)
self._fields[name] = value.bind(form=self, name=name, prefix=self._prefix)

def __delitem__(self, name):
""" Remove a field from this form. """
del self._fields[name]

def _apply_form_filter(self, field_kwargs):
if self.form_filter and hasattr(self.form_filter, '__call__'):
if 'filters' not in field_kwargs:
field_kwargs['filters'] = []
field_kwargs['filters'].append(self.form_filter)
return field_kwargs

def _get_translations(self):
"""
.. deprecated:: 2.0
Expand Down Expand Up @@ -241,7 +253,8 @@ class Form(with_metaclass(FormMeta, BaseForm)):
"""
Meta = DefaultMeta

def __init__(self, formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs):
def __init__(self, formdata=None, obj=None, prefix='', data=None, meta=None,
form_filter=None, **kwargs):
"""
:param formdata:
Used to pass data coming from the enduser, usually `request.POST` or
Expand Down Expand Up @@ -269,7 +282,8 @@ def __init__(self, formdata=None, obj=None, prefix='', data=None, meta=None, **k
meta_obj = self._wtforms_meta()
if meta is not None and isinstance(meta, dict):
meta_obj.update_values(meta)
super(Form, self).__init__(self._unbound_fields, meta=meta_obj, prefix=prefix)
super(Form, self).__init__(self._unbound_fields, meta=meta_obj, prefix=prefix,
form_filter=form_filter)

for name, field in iteritems(self._fields):
# Set all the fields to attributes so that they obscure the class
Expand Down