[Checkins] SVN: z3c.form/branches/adamg-missing-terms/ splitting configure.zcml
Adam Groszer
cvs-admin at zope.org
Fri Sep 7 13:23:51 UTC 2012
Log message for revision 127774:
splitting configure.zcml
adding tests, fixing on the way
the default IValidator will now ignore unchanged fields
Changed:
U z3c.form/branches/adamg-missing-terms/CHANGES.txt
A z3c.form/branches/adamg-missing-terms/src/z3c/form/apidoc.zcml
U z3c.form/branches/adamg-missing-terms/src/z3c/form/browser/objectmulti.txt
U z3c.form/branches/adamg-missing-terms/src/z3c/form/browser/select-miss.txt
A z3c.form/branches/adamg-missing-terms/src/z3c/form/button.zcml
U z3c.form/branches/adamg-missing-terms/src/z3c/form/configure.zcml
A z3c.form/branches/adamg-missing-terms/src/z3c/form/converter.zcml
A z3c.form/branches/adamg-missing-terms/src/z3c/form/datamanager.zcml
A z3c.form/branches/adamg-missing-terms/src/z3c/form/error.zcml
U z3c.form/branches/adamg-missing-terms/src/z3c/form/interfaces.py
U z3c.form/branches/adamg-missing-terms/src/z3c/form/object.py
A z3c.form/branches/adamg-missing-terms/src/z3c/form/term.zcml
U z3c.form/branches/adamg-missing-terms/src/z3c/form/util.py
U z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.py
U z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.txt
A z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.zcml
-=-
Modified: z3c.form/branches/adamg-missing-terms/CHANGES.txt
===================================================================
--- z3c.form/branches/adamg-missing-terms/CHANGES.txt 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/CHANGES.txt 2012-09-07 13:23:46 UTC (rev 127774)
@@ -2,13 +2,22 @@
CHANGES
=======
-2.8.3 (unreleased)
+2.9.0 (unreleased)
------------------
- ``SequenceWidget`` DISPLAY_MODE: silently ignore missing tokens,
because INPUT_MODE and HIDDEN_MODE does that too
+- Missing terms in vocabularies: this was a pain until now.
+ Now it's possible to have the same (missing) value unchanged on the object
+ with an EditForm after save as it was before editing.
+ That brings some changes with it:
+ - *MAJOR*: unchanged values/fields do not get validated anymore
+ - A temporary ``SimpleTerm`` gets created for the missing value
+ Title is by default "Missing: ${value}". See MissingTermsMixin.
+- Split ``configure.zcml``
+
2.8.2 (2012-08-17)
------------------
Added: z3c.form/branches/adamg-missing-terms/src/z3c/form/apidoc.zcml
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/apidoc.zcml (rev 0)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/apidoc.zcml 2012-09-07 13:23:46 UTC (rev 127774)
@@ -0,0 +1,84 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c.form">
+
+ <!-- APIDoc documentation -->
+ <configure
+ xmlns:zcml="http://namespaces.zope.org/zcml"
+ xmlns:apidoc="http://namespaces.zope.org/apidoc"
+ zcml:condition="have apidoc">
+
+ <apidoc:bookchapter
+ id="z3c-form"
+ title="z3c.form - Widgets and Forms"
+ doc_path="README.txt"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-form"
+ title="Forms"
+ doc_path="form.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-subform"
+ title="Sub-Forms"
+ doc_path="subform.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-field"
+ title="Fields"
+ doc_path="field.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-button"
+ title="Buttons"
+ doc_path="button.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-validator"
+ title="Validators"
+ doc_path="validator.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-zcml"
+ title="ZCML Directives"
+ doc_path="zcml.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-widget"
+ title="Widgets"
+ doc_path="widget.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-action"
+ title="Actions"
+ doc_path="action.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-value"
+ title="Attribute Values"
+ doc_path="value.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-datamanager"
+ title="Data Managers"
+ doc_path="datamanager.txt"
+ parent="z3c-form"
+ />
+ <apidoc:bookchapter
+ id="z3c-form-converter"
+ title="Data Converters"
+ doc_path="converter.txt"
+ parent="z3c-form"
+ />
+ </configure>
+
+</configure>
Property changes on: z3c.form/branches/adamg-missing-terms/src/z3c/form/apidoc.zcml
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision
Added: svn:eol-style
+ native
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/browser/objectmulti.txt
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/browser/objectmulti.txt 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/browser/objectmulti.txt 2012-09-07 13:23:46 UTC (rev 127774)
@@ -189,54 +189,59 @@
>>> widget.update()
>>> print widget.render()
<div class="multi-widget required">
- <div id="foo-0-row" class="row">
- <div class="label">
- <label for="foo-0">
- <span>my object widget</span>
- <span class="required">*</span>
- </label>
- </div>
- <div class="error">Wrong contained type</div>
- <div class="widget">
- <div class="multi-widget-checkbox">
- <input id="foo-0-remove" name="foo.0.remove"
- class="multi-widget-checkbox checkbox-widget"
- type="checkbox" value="1" />
+ <div class="row" id="foo-0-row">
+ <div class="label">
+ <label for="foo-0">
+ <span>my object widget</span>
+ <span class="required">*</span>
+ </label>
+ </div>
+ <div class="error">Wrong contained type</div>
+ <div class="widget">
+ <div class="multi-widget-checkbox">
+ <input class="multi-widget-checkbox checkbox-widget"
+ id="foo-0-remove" name="foo.0.remove" type="checkbox" value="1">
+ </div>
+ <div class="multi-widget-input">
+ <div class="object-widget required">
+ <div class="label">
+ <label for="foo-0-widgets-foofield">
+ <span>My foo field</span>
+ <span class="required">*</span>
+ </label>
</div>
- <div class="multi-widget-input"><div class="object-widget required">
- <div class="label">
- <label for="foo-0-widgets-foofield">
- <span>My foo field</span>
- <span class="required">*</span>
- </label>
- </div>
- <div class="error">Required input is missing.</div>
- <div class="widget">
- <input id="foo-0-widgets-foofield" name="foo.0.widgets.foofield"
- class="text-widget required int-field" type="text" />
- </div>
- <div class="label">
- <label for="foo-0-widgets-barfield">
- <span>My dear bar</span>
- </label>
- </div>
- <div class="widget">
- <input id="foo-0-widgets-barfield" name="foo.0.widgets.barfield"
- class="text-widget int-field" value="666" type="text" />
- </div>
- <input name="foo.0-empty-marker" type="hidden" value="1" />
+ <div class="error">Required input is missing.</div>
+ <div class="widget">
+ <input class="text-widget required int-field"
+ id="foo-0-widgets-foofield" name="foo.0.widgets.foofield"
+ type="text">
</div>
+ <div class="label">
+ <label for="foo-0-widgets-barfield">
+ <span>My dear bar</span>
+ </label>
+ </div>
+ <div class="widget">
+ <input class="text-widget int-field"
+ id="foo-0-widgets-barfield" name="foo.0.widgets.barfield"
+ type="text" value="666">
+ </div>
+ <input name="foo.0-empty-marker" type="hidden" value="1">
</div>
</div>
+ </div>
</div>
<div class="buttons">
<input id="foo-buttons-add" name="foo.buttons.add"
- class="submit-widget button-field" value="Add" type="submit" />
- <input id="foo-buttons-remove" name="foo.buttons.remove"
- class="submit-widget button-field" value="Remove selected" type="submit" />
+ class="submit-widget button-field" value="Add"
+ type="submit" />
+ <input id="foo-buttons-remove"
+ name="foo.buttons.remove"
+ class="submit-widget button-field" value="Remove selected"
+ type="submit" />
</div>
</div>
- <input type="hidden" name="foo.count" value="1" />
+ <input name="foo.count" type="hidden" value="1">
Let's set acceptable values:
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/browser/select-miss.txt
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/browser/select-miss.txt 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/browser/select-miss.txt 2012-09-07 13:23:46 UTC (rev 127774)
@@ -49,7 +49,7 @@
... def __init__(self, context, request, form, field, widget):
... self.terms = SimpleVocabulary.fromValues(['a', 'b', 'c'])
...
- ... def makeMissingTerm(self, token):
+ ... def _makeMissingTerm(self, token):
... if token == 'x':
... return super(SelectionTerms, self).makeMissingTerm(token)
... else:
Added: z3c.form/branches/adamg-missing-terms/src/z3c/form/button.zcml
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/button.zcml (rev 0)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/button.zcml 2012-09-07 13:23:46 UTC (rev 127774)
@@ -0,0 +1,21 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c.form">
+
+ <!-- Actions, Action Managers and Handlers -->
+ <adapter
+ factory=".button.ButtonAction"
+ provides=".interfaces.IButtonAction"
+ />
+ <adapter
+ factory=".button.ImageButtonAction"
+ provides=".interfaces.IButtonAction"
+ />
+ <adapter
+ factory=".button.ButtonActions"
+ />
+ <adapter
+ factory=".button.ButtonActionHandler"
+ />
+
+</configure>
Property changes on: z3c.form/branches/adamg-missing-terms/src/z3c/form/button.zcml
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision
Added: svn:eol-style
+ native
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/configure.zcml
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/configure.zcml 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/configure.zcml 2012-09-07 13:23:46 UTC (rev 127774)
@@ -9,22 +9,6 @@
type="zope.publisher.interfaces.browser.IBrowserSkinType"
/>
- <!-- Validators -->
- <adapter
- factory=".validator.SimpleFieldValidator"
- />
- <adapter
- factory=".validator.InvariantsValidator"
- />
-
- <!-- Data Managers -->
- <adapter
- factory=".datamanager.AttributeField"
- />
- <adapter
- factory=".datamanager.DictionaryField"
- />
-
<!-- Widget Manager -->
<adapter
factory=".field.FieldWidgets"
@@ -34,201 +18,19 @@
factory=".contentprovider.FieldWidgetsAndProviders"
/>
- <!-- Data Converters -->
- <adapter
- factory=".converter.FieldDataConverter"
- />
- <adapter
- factory=".converter.IntegerDataConverter"
- />
- <adapter
- factory=".converter.FloatDataConverter"
- />
- <adapter
- factory=".converter.DecimalDataConverter"
- />
- <adapter
- factory=".converter.DateDataConverter"
- />
- <adapter
- factory=".converter.TimeDataConverter"
- />
- <adapter
- factory=".converter.DatetimeDataConverter"
- />
- <adapter
- factory=".converter.TimedeltaDataConverter"
- />
- <include file="file.zcml" />
- <adapter
- factory=".converter.SequenceDataConverter"
- />
- <adapter
- factory=".converter.CollectionSequenceDataConverter"
- />
- <adapter
- factory=".converter.BoolSingleCheckboxDataConverter"
- />
- <adapter
- factory=".converter.FieldWidgetDataConverter"
- />
- <adapter
- factory=".converter.TextLinesConverter"
- />
- <adapter
- factory=".converter.MultiConverter"
- />
-
- <!-- ITerms -->
- <adapter
- factory=".term.ChoiceTerms"
- />
- <!--<adapter
- factory=".term.ChoiceTermsVocabulary"
- />-->
- <adapter
- factory=".term.MissingChoiceTermsVocabulary"
- />
- <adapter
- factory=".term.ChoiceTermsSource"
- />
- <adapter
- factory=".term.CollectionTerms"
- />
- <adapter
- factory=".term.CollectionTermsVocabulary"
- />
- <adapter
- factory=".term.CollectionTermsSource"
- />
- <adapter
- factory=".term.BoolTerms"
- />
-
<!-- Actions, Action Managers and Handlers -->
- <adapter
- factory=".button.ButtonAction"
- provides=".interfaces.IButtonAction"
- />
- <adapter
- factory=".button.ImageButtonAction"
- provides=".interfaces.IButtonAction"
- />
- <adapter
- factory=".button.ButtonActions"
- />
- <adapter
- factory=".button.ButtonActionHandler"
- />
<subscriber
handler=".form.handleActionError"
/>
- <!-- Error Views -->
- <adapter
- factory=".error.ErrorViewSnippet"
- trusted="True"
- permission="zope.Public"
- />
- <adapter
- factory=".error.InvalidErrorViewSnippet"
- trusted="True"
- permission="zope.Public"
- />
- <adapter
- factory=".error.ValueErrorViewSnippet"
- trusted="True"
- permission="zope.Public"
- />
- <adapter
- factory=".error.MultipleErrorViewSnippet"
- trusted="True"
- permission="zope.Public"
- />
- <adapter
- factory=".error.StandardErrorViewTemplate"
- />
-
- <!-- APIDoc documentation -->
- <configure
- xmlns:zcml="http://namespaces.zope.org/zcml"
- xmlns:apidoc="http://namespaces.zope.org/apidoc"
- zcml:condition="have apidoc">
-
- <apidoc:bookchapter
- id="z3c-form"
- title="z3c.form - Widgets and Forms"
- doc_path="README.txt"
- />
- <apidoc:bookchapter
- id="z3c-form-form"
- title="Forms"
- doc_path="form.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-subform"
- title="Sub-Forms"
- doc_path="subform.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-field"
- title="Fields"
- doc_path="field.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-button"
- title="Buttons"
- doc_path="button.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-validator"
- title="Validators"
- doc_path="validator.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-zcml"
- title="ZCML Directives"
- doc_path="zcml.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-widget"
- title="Widgets"
- doc_path="widget.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-action"
- title="Actions"
- doc_path="action.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-value"
- title="Attribute Values"
- doc_path="value.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-datamanager"
- title="Data Managers"
- doc_path="datamanager.txt"
- parent="z3c-form"
- />
- <apidoc:bookchapter
- id="z3c-form-converter"
- title="Data Converters"
- doc_path="converter.txt"
- parent="z3c-form"
- />
- </configure>
-
<include file="object.zcml" />
+ <include file="apidoc.zcml" />
+ <include file="button.zcml" />
+ <include file="converter.zcml" />
+ <include file="datamanager.zcml" />
+ <include file="error.zcml" />
+ <include file="term.zcml" />
+ <include file="validator.zcml" />
<include package=".browser" />
Added: z3c.form/branches/adamg-missing-terms/src/z3c/form/converter.zcml
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/converter.zcml (rev 0)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/converter.zcml 2012-09-07 13:23:46 UTC (rev 127774)
@@ -0,0 +1,50 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c.form">
+
+ <!-- Data Converters -->
+ <adapter
+ factory=".converter.FieldDataConverter"
+ />
+ <adapter
+ factory=".converter.IntegerDataConverter"
+ />
+ <adapter
+ factory=".converter.FloatDataConverter"
+ />
+ <adapter
+ factory=".converter.DecimalDataConverter"
+ />
+ <adapter
+ factory=".converter.DateDataConverter"
+ />
+ <adapter
+ factory=".converter.TimeDataConverter"
+ />
+ <adapter
+ factory=".converter.DatetimeDataConverter"
+ />
+ <adapter
+ factory=".converter.TimedeltaDataConverter"
+ />
+ <include file="file.zcml" />
+ <adapter
+ factory=".converter.SequenceDataConverter"
+ />
+ <adapter
+ factory=".converter.CollectionSequenceDataConverter"
+ />
+ <adapter
+ factory=".converter.BoolSingleCheckboxDataConverter"
+ />
+ <adapter
+ factory=".converter.FieldWidgetDataConverter"
+ />
+ <adapter
+ factory=".converter.TextLinesConverter"
+ />
+ <adapter
+ factory=".converter.MultiConverter"
+ />
+
+</configure>
Property changes on: z3c.form/branches/adamg-missing-terms/src/z3c/form/converter.zcml
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision
Added: svn:eol-style
+ native
Added: z3c.form/branches/adamg-missing-terms/src/z3c/form/datamanager.zcml
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/datamanager.zcml (rev 0)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/datamanager.zcml 2012-09-07 13:23:46 UTC (rev 127774)
@@ -0,0 +1,13 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c.form">
+
+ <!-- Data Managers -->
+ <adapter
+ factory=".datamanager.AttributeField"
+ />
+ <adapter
+ factory=".datamanager.DictionaryField"
+ />
+
+</configure>
Property changes on: z3c.form/branches/adamg-missing-terms/src/z3c/form/datamanager.zcml
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision
Added: svn:eol-style
+ native
Added: z3c.form/branches/adamg-missing-terms/src/z3c/form/error.zcml
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/error.zcml (rev 0)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/error.zcml 2012-09-07 13:23:46 UTC (rev 127774)
@@ -0,0 +1,30 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c.form">
+
+ <!-- Error Views -->
+ <adapter
+ factory=".error.ErrorViewSnippet"
+ trusted="True"
+ permission="zope.Public"
+ />
+ <adapter
+ factory=".error.InvalidErrorViewSnippet"
+ trusted="True"
+ permission="zope.Public"
+ />
+ <adapter
+ factory=".error.ValueErrorViewSnippet"
+ trusted="True"
+ permission="zope.Public"
+ />
+ <adapter
+ factory=".error.MultipleErrorViewSnippet"
+ trusted="True"
+ permission="zope.Public"
+ />
+ <adapter
+ factory=".error.StandardErrorViewTemplate"
+ />
+
+</configure>
Property changes on: z3c.form/branches/adamg-missing-terms/src/z3c/form/error.zcml
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision
Added: svn:eol-style
+ native
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/interfaces.py
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/interfaces.py 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/interfaces.py 2012-09-07 13:23:46 UTC (rev 127774)
@@ -114,7 +114,7 @@
class IValidator(zope.interface.Interface):
"""A validator for a particular value."""
- def validate(value):
+ def validate(value, force=False):
"""Validate the value.
If successful, return ``None``. Otherwise raise an ``Invalid`` error.
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/object.py
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/object.py 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/object.py 2012-09-07 13:23:46 UTC (rev 127774)
@@ -31,9 +31,11 @@
from z3c.form.field import Fields
from z3c.form.error import MultipleErrors
+
def getIfName(iface):
- return iface.__module__+'.'+iface.__name__
+ return iface.__module__ + '.' + iface.__name__
+
class ObjectSubForm(form.BaseForm):
zope.interface.implements(interfaces.ISubForm)
@@ -61,7 +63,7 @@
self.parentForm,
getattr(widget, 'field', None),
widget),
- interfaces.IValidator).validate(value)
+ interfaces.IValidator).validate(value, force=True)
except (zope.schema.ValidationError, ValueError), error:
# on exception, setup the widget error message
view = zope.component.getMultiAdapter(
@@ -87,6 +89,7 @@
def getContent(self):
return self.__parent__._value
+
class ObjectConverter(BaseDataConverter):
"""Data converter for IObjectWidget."""
@@ -218,30 +221,40 @@
def applyValue(self, widget, value=interfaces.NO_VALUE):
"""Validate and apply value to given widget.
"""
- converter = interfaces.IDataConverter(widget)
- try:
- zope.component.getMultiAdapter(
- (self.context,
- self.request,
- self.form,
- getattr(widget, 'field', None),
- widget),
- interfaces.IValidator).validate(value)
-
- widget.value = converter.toWidgetValue(value)
- except (zope.schema.ValidationError, ValueError):
- # on exception, setup the widget error message
- # set the wrong value as value
- # the widget itself ought to cry about the error
+ if self.context is None:
widget.value = value
+ else:
+ context = None
+ if not self.ignoreContext:
+ # ahem, the context is not ours to check,
+ # but the context's right attribute
+ dm = zope.component.getMultiAdapter(
+ (self.context, self.field), interfaces.IDataManager)
+ context = dm.query(default=None)
+ try:
+ zope.component.getMultiAdapter(
+ (context,
+ self.request,
+ self.form,
+ getattr(widget, 'field', None),
+ widget),
+ interfaces.IValidator).validate(value)
+ converter = interfaces.IDataConverter(widget)
+ widget.value = converter.toWidgetValue(value)
+ except (zope.schema.ValidationError, ValueError):
+ # on exception, setup the widget error message
+ # set the wrong value as value
+ # the widget itself ought to cry about the error
+ widget.value = value
+
@apply
def value():
"""This invokes updateWidgets on any value change e.g. update/extract."""
def get(self):
#value (get) cannot raise an exception, then we return insane values
try:
- self.setErrors=True
+ self.setErrors = True
return self.extract()
except MultipleErrors:
value = {}
@@ -260,17 +273,16 @@
return property(get, set)
-
def extract(self, default=interfaces.NO_VALUE):
- if self.name+'-empty-marker' in self.request:
+ if self.name + '-empty-marker' in self.request:
self.updateWidgets(setErrors=False)
value, errors = self.subform.extractData(setErrors=self.setErrors)
if errors:
- #very-very-nasty: skip raising exceptions in extract
- #while we're updating -- that happens when the widget
- #is updated and update calls extract()
+ # very-very-nasty: skip raising exceptions in extract
+ # while we're updating -- that happens when the widget
+ # is updated and update calls extract()
if self._updating:
return default
Added: z3c.form/branches/adamg-missing-terms/src/z3c/form/term.zcml
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/term.zcml (rev 0)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/term.zcml 2012-09-07 13:23:46 UTC (rev 127774)
@@ -0,0 +1,28 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c.form">
+
+ <!-- ITerms -->
+ <adapter
+ factory=".term.ChoiceTerms"
+ />
+ <adapter
+ factory=".term.MissingChoiceTermsVocabulary"
+ />
+ <adapter
+ factory=".term.ChoiceTermsSource"
+ />
+ <adapter
+ factory=".term.CollectionTerms"
+ />
+ <adapter
+ factory=".term.CollectionTermsVocabulary"
+ />
+ <adapter
+ factory=".term.CollectionTermsSource"
+ />
+ <adapter
+ factory=".term.BoolTerms"
+ />
+
+</configure>
Property changes on: z3c.form/branches/adamg-missing-terms/src/z3c/form/term.zcml
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision
Added: svn:eol-style
+ native
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/util.py
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/util.py 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/util.py 2012-09-07 13:23:46 UTC (rev 127774)
@@ -140,6 +140,9 @@
Comparing the value of the context attribute and the given value"""
if context is None:
context = field.context
+ if context is None:
+ # IObjectWidget madness
+ return True
# Get the datamanager and get the original value
dm = zope.component.getMultiAdapter(
@@ -155,7 +158,7 @@
return False
-def changedWidget(widget, value, field=None):
+def changedWidget(widget, value, field=None, context=None):
"""figure if a widget's value changed
Comparing the value of the widget context attribute and the given value"""
@@ -164,7 +167,7 @@
# if the widget is context aware, figure if it's field changed
if field is None:
field = widget.field
- return changedField(field, value)
+ return changedField(field, value, context=context)
# otherwise we cannot, return 'always changed'
return True
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.py
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.py 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.py 2012-09-07 13:23:46 UTC (rev 127774)
@@ -26,8 +26,10 @@
from z3c.form import interfaces, util
-class SimpleFieldValidator(object):
- """Simple Field Validator"""
+class StrictSimpleFieldValidator(object):
+ """Strict Simple Field Validator
+
+ validates all incoming values"""
zope.interface.implements(interfaces.IValidator)
zope.component.adapts(
zope.interface.Interface,
@@ -43,12 +45,8 @@
self.field = field
self.widget = widget
- def validate(self, value):
+ def validate(self, value, force=False):
"""See interfaces.IValidator"""
- if value is interfaces.NOT_CHANGED:
- # no need to validate unchanged values
- return
-
context = self.context
field = self.field
widget = self.widget
@@ -58,10 +56,23 @@
field.required = False
if context is not None:
field = field.bind(context)
-
- if widget and not util.changedWidget(widget, value, field=field):
- # if new value == old value, no need to validate
- return
+ if value is interfaces.NOT_CHANGED:
+ if (interfaces.IContextAware.providedBy(widget) and
+ not widget.ignoreContext):
+ # get value from context
+ value = zope.component.getMultiAdapter(
+ (context, field),
+ interfaces.IDataManager).query()
+ else:
+ value = interfaces.NO_VALUE
+ if value is interfaces.NO_VALUE:
+ # look up default value
+ value = field.default
+ adapter = zope.component.queryMultiAdapter(
+ (context, self.request, self.view, field, widget),
+ interfaces.IValue, name='default')
+ if adapter:
+ value = adapter.get()
return field.validate(value)
def __repr__(self):
@@ -71,6 +82,27 @@
self.field.__name__)
+class SimpleFieldValidator(StrictSimpleFieldValidator):
+ """Simple Field Validator
+
+ ignores unchanged values"""
+
+ def validate(self, value, force=False):
+ """See interfaces.IValidator"""
+ if not force:
+ if value is interfaces.NOT_CHANGED:
+ # no need to validate unchanged values
+ return
+
+ if self.widget and not util.changedWidget(
+ self.widget, value, field=self.field, context=self.context):
+ # if new value == old value, no need to validate
+ return
+
+ # otherwise StrictSimpleFieldValidator will do the job
+ return super(SimpleFieldValidator, self).validate(value)
+
+
def WidgetValidatorDiscriminators(
validator, context=None, request=None, view=None, field=None, widget=None):
zope.component.adapter(
Modified: z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.txt
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.txt 2012-09-07 10:51:17 UTC (rev 127773)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.txt 2012-09-07 13:23:46 UTC (rev 127774)
@@ -11,7 +11,7 @@
The schema field consists of a ``validate()`` method. Validation is
automatically invoked when converting a unicode string to a field value
using ``fromUnicode()``. This makes it very hard to customize the field
- validation. No hooks were provided to exert dditional restriction at the
+ validation. No hooks were provided to exert additional restriction at the
presentation level.
* Schema/Form Validation
@@ -83,6 +83,10 @@
... def isLoginPartOfEmail(person):
... if not person.email.startswith(person.login):
... raise zope.interface.Invalid("The login not part of email.")
+ >>> class Person(object):
+ ... zope.interface.implements(IPerson)
+ ... login = None
+ ... email = None
Widget Validators
@@ -181,6 +185,64 @@
... (None, None, None, IPerson['email'], None),
... interfaces.IValidator)
+Ignoring unchanged values
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Most of the time we want to ignore unchanged fields/values at validation.
+A common usecase for this is if a value went away from a vocabulary and we want
+to keep the old value after editing.
+In case you want to strict behaviour, register ``StrictSimpleFieldValidator``
+for your layer.
+
+ >>> simple = validator.SimpleFieldValidator(
+ ... None, None, None, IPerson['login'], None)
+
+NOT_CHANGED never gets validated.
+
+ >>> simple.validate(interfaces.NOT_CHANGED)
+
+Current value gets extracted by ``IDataManager``
+via the widget, field and context
+
+ >>> from z3c.form.datamanager import AttributeField
+ >>> zope.component.provideAdapter(AttributeField)
+
+ >>> import z3c.form.testing
+ >>> request = z3c.form.testing.TestRequest()
+ >>> import z3c.form.widget
+ >>> widget = z3c.form.widget.Widget(request)
+ >>> context = Person()
+
+ >>> widget.context = context
+ >>> from z3c.form import interfaces
+ >>> zope.interface.alsoProvides(widget, interfaces.IContextAware)
+
+ >>> simple = validator.SimpleFieldValidator(
+ ... context, request, None, IPerson['login'], widget)
+
+OK, let's see checking after setup.
+Works like a StrictSimpleFieldValidator until we have to validate a different value:
+
+ >>> context.login = u'john'
+ >>> simple.validate(u'carter')
+ >>> simple.validate(u'hippocratiusxy')
+ Traceback (most recent call last):
+ ...
+ TooLong: (u'hippocratiusxy', 10)
+
+Validating the unchanged value works despite it would be an error.
+
+ >>> context.login = u'hippocratiusxy'
+ >>> simple.validate(u'hippocratiusxy')
+
+Unless we want to force validation:
+
+ >>> simple.validate(u'hippocratiusxy', force=True)
+ Traceback (most recent call last):
+ ...
+ TooLong: (u'hippocratiusxy', 10)
+
+
Widget Validators and File-Uploads
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -212,11 +274,11 @@
required one has an required missing error, as the default value of
the field is looked up on the field:
- >>> simple_thumb = validator.SimpleFieldValidator(
+ >>> simple_thumb = validator.StrictSimpleFieldValidator(
... None, None, None, IPhoto['thumb'], None)
>>> simple_thumb.validate(interfaces.NOT_CHANGED)
- >>> simple_data = validator.SimpleFieldValidator(
+ >>> simple_data = validator.StrictSimpleFieldValidator(
... None, None, None, IPhoto['data'], None)
>>> simple_data.validate(interfaces.NOT_CHANGED)
Traceback (most recent call last):
@@ -232,11 +294,11 @@
>>> widget = z3c.form.widget.Widget(None)
>>> zope.interface.alsoProvides(widget, interfaces.IContextAware)
>>> widget.ignoreContext = True
- >>> simple_thumb = validator.SimpleFieldValidator(
+ >>> simple_thumb = validator.StrictSimpleFieldValidator(
... None, None, None, IPhoto['thumb'], widget)
>>> simple_thumb.validate(interfaces.NOT_CHANGED)
- >>> simple_data = validator.SimpleFieldValidator(
+ >>> simple_data = validator.StrictSimpleFieldValidator(
... None, None, None, IPhoto['data'], widget)
>>> simple_data.validate(interfaces.NOT_CHANGED)
Traceback (most recent call last):
@@ -272,14 +334,14 @@
>>> widget.ignoreContext = False
>>> zope.component.provideAdapter(z3c.form.datamanager.AttributeField)
- >>> simple_thumb = validator.SimpleFieldValidator(
+ >>> simple_thumb = validator.StrictSimpleFieldValidator(
... photo, None, None, IPhoto['thumb'], widget)
>>> simple_thumb.validate(interfaces.NOT_CHANGED)
If the value is not set on the context it is a required missing as
neither context nor input have a valid value:
- >>> simple_data = validator.SimpleFieldValidator(
+ >>> simple_data = validator.StrictSimpleFieldValidator(
... photo, None, None, IPhoto['data'], widget)
>>> simple_data.validate(interfaces.NOT_CHANGED)
Traceback (most recent call last):
Added: z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.zcml
===================================================================
--- z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.zcml (rev 0)
+++ z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.zcml 2012-09-07 13:23:46 UTC (rev 127774)
@@ -0,0 +1,13 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c.form">
+
+ <!-- Validators -->
+ <adapter
+ factory=".validator.SimpleFieldValidator"
+ />
+ <adapter
+ factory=".validator.InvariantsValidator"
+ />
+
+</configure>
Property changes on: z3c.form/branches/adamg-missing-terms/src/z3c/form/validator.zcml
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision
Added: svn:eol-style
+ native
More information about the checkins
mailing list