Am 24.05.2009 um 10:46 schrieb Adam GROSZER: > Hello Michael, > > After some simple thinking there are some fears that this wrecks other > basic fields validation. > > Something like the field is required, has a default value but is > omitted on input. What will be the result?
When the field is omitted on input it should not have the value interfaces.NOT_CHANGED but no value, so special handling for NOT_CHANGED does not apply. > Accepting the default value > instead of raising an error is definitely a problem. > > Also, values in the system might not be needed to re-validate? > Image passing around a 100mb uploaded file. z3c.form has definitely a problem with this use-case. Not only the validator but also the edit form reads the whole file into RAM. > If this is meant only for a file upload field, then I think there > should > be a special validator registered for those. interfaces.NOT_CHANGED is currently only used for file uploads, but it might be used for other fields as well, so I see no reason to put the handling into a special validator. > Would be nice to see some (functional) tests closing out the above > fears. > Functional, because on the unittest level you can force the widget to > a lot of unexpected things, but that might not be inline with what > happens when it's really done by the framework. > Or better said, revert the changes locally, add those tests, apply the > changes back and see whether the tests still pass. File upload fields did not work at all after someone introduced interfaces.NOT_CHANGED and before adding my changes. Jacob Holm, who suggested the patch, wrote in http://mail.zope.org/pipermail/zope-dev/2009-April/036258.html The "code should compute the same value as z3c.form.widget.Widget.update would when ignoreRequest is True. Thus effectively converting NOT_CHANGED into the "existing" value before validating." > MH> Modified: z3c.form/trunk/src/z3c/form/validator.py > MH> > =================================================================== > MH> --- z3c.form/trunk/src/z3c/form/validator.py 2009-05-17 > 13:18:11 UTC (rev 100027) > MH> +++ z3c.form/trunk/src/z3c/form/validator.py 2009-05-17 > 13:21:18 UTC (rev 100028) > MH> @@ -42,9 +42,28 @@ > MH> > MH> def validate(self, value): > MH> """See interfaces.IValidator""" > MH> + context = self.context > MH> field = self.field > MH> - if self.context is not None: > MH> - field = field.bind(self.context) > MH> + widget = self.widget > MH> + if context is not None: > MH> + field = field.bind(context) > MH> + if value is interfaces.NOT_CHANGED: > MH> + if (interfaces.IContextAware.providedBy(widget) and > MH> + not widget.ignoreContext): > MH> + # get value from context > MH> + value = zope.component.getMultiAdapter( > MH> + (context, field), > MH> + interfaces.IDataManager).query() > MH> + else: > MH> + value = interfaces.NO_VALUE > MH> + if value is interfaces.NO_VALUE: > MH> + # look up default value > MH> + value = field.default > MH> + adapter = zope.component.queryMultiAdapter( > MH> + (context, self.request, self.view, field, > widget), > MH> + interfaces.IValue, name='default') > MH> + if adapter: > MH> + value = adapter.get() > MH> return field.validate(value) > MH> > MH> def __repr__(self): Yours sincerely, -- Michael Howitz · m...@gocept.com · software developer gocept gmbh & co. kg · forsterstraße 29 · 06112 halle (saale) · germany http://gocept.com · tel +49 345 1229889 8 · fax +49 345 1229889 1 Zope and Plone consulting and development _______________________________________________ Zope-Dev maillist - Zope-Dev@zope.org http://mail.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope )