From 5eb92a69d174948a8ff3b1b0ffbdc343eb81212d Mon Sep 17 00:00:00 2001 From: Sylvain Viollon Date: Fri, 3 Jun 2016 11:51:38 +0200 Subject: [PATCH] Ensure required field have input. --- CHANGES.txt | 4 +++- src/grokcore/formlib/formlib.py | 26 +++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 35b9dba..88e2465 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -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) diff --git a/src/grokcore/formlib/formlib.py b/src/grokcore/formlib/formlib.py index dde9f4c..36c1d97 100644 --- a/src/grokcore/formlib/formlib.py +++ b/src/grokcore/formlib/formlib.py @@ -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(): @@ -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: