Skip to content

Commit

Permalink
Ensure required field have input.
Browse files Browse the repository at this point in the history
  • Loading branch information
thefunny42 committed Jun 3, 2016
1 parent 9ef6b14 commit 5eb92a6
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
4 changes: 3 additions & 1 deletion CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ Changes
1.10.2 (unreleased)
-------------------

- Nothing changed yet.
- ``grok.action`` will now trigger validation errors
``RequiredMissing`` for required fields that not present at all in
the request.


1.10.1 (2016-02-15)
Expand Down
26 changes: 25 additions & 1 deletion src/grokcore/formlib/formlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,35 @@ def __call__(self, success):


class Action(zope.formlib.form.Action):

def validate(self, data):
errors = super(Action, self).validate(data)
if errors is None:
errors = self.form.validate(self, data)
errors.extend(ensure_required_fields_have_input(
self.form.widgets, data))
return errors

def success(self, data):
if self.success_handler is not None:
return self.success_handler(self.form, **data)


def ensure_required_fields_have_input(widgets, data):
errors = []
for widget in widgets:
if not widget.context.required or widget.hasInput():
continue
name = widget.context.__name__
error = zope.formlib.interfaces.WidgetInputError(
name,
widget.label,
zope.schema.interfaces.RequiredMissing(name))
widget._error = error
errors.append(error)
return errors


def Fields(*args, **kw):
fields = []
for key, value in kw.items():
Expand Down Expand Up @@ -125,7 +149,7 @@ def apply_data(context, form_fields, data, adapters=None, update=False):

if update:
if ((newvalue is not form_field) and
(field.get(adapter) != newvalue)):
(field.get(adapter) != newvalue)):
field.set(adapter, newvalue)
changes.setdefault(interface, []).append(name)
else:
Expand Down

0 comments on commit 5eb92a6

Please sign in to comment.