[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