[Checkins] SVN: z3c.form/trunk/ - Added IField.showDefault and IWidget.showDefault

Adam Groszer cvs-admin at zope.org
Wed Jul 11 14:23:29 UTC 2012


Log message for revision 127321:
  - Added IField.showDefault and IWidget.showDefault
    That controls whether the widget should look for field default values
    to display. This can be really helpful in EditForms, where you don't
    want to have default values instead of actual (missing) values.
    By default it is True to provide backwards compatibility.

Changed:
  U   z3c.form/trunk/CHANGES.txt
  U   z3c.form/trunk/src/z3c/form/field.py
  U   z3c.form/trunk/src/z3c/form/field.txt
  U   z3c.form/trunk/src/z3c/form/interfaces.py
  U   z3c.form/trunk/src/z3c/form/widget.py
  U   z3c.form/trunk/src/z3c/form/widget.txt

-=-
Modified: z3c.form/trunk/CHANGES.txt
===================================================================
--- z3c.form/trunk/CHANGES.txt	2012-07-11 11:46:14 UTC (rev 127320)
+++ z3c.form/trunk/CHANGES.txt	2012-07-11 14:23:25 UTC (rev 127321)
@@ -12,6 +12,12 @@
 
 - Avoid dependency on ZODB3.
 
+- Added IField.showDefault and IWidget.showDefault
+  That controls whether the widget should look for field default values
+  to display. This can be really helpful in EditForms, where you don't
+  want to have default values instead of actual (missing) values.
+  By default it is True to provide backwards compatibility.
+
 2.6.1 (2012-01-30)
 ------------------
 

Modified: z3c.form/trunk/src/z3c/form/field.py
===================================================================
--- z3c.form/trunk/src/z3c/form/field.py	2012-07-11 11:46:14 UTC (rev 127320)
+++ z3c.form/trunk/src/z3c/form/field.py	2012-07-11 14:23:25 UTC (rev 127321)
@@ -21,7 +21,7 @@
 import zope.location
 import zope.schema.interfaces
 
-from z3c.form import interfaces, util, error
+from z3c.form import interfaces, util
 from z3c.form.error import MultipleErrors
 from z3c.form.widget import AfterWidgetUpdateEvent
 
@@ -67,7 +67,7 @@
     widgetFactory = WidgetFactoryProperty()
 
     def __init__(self, field, name=None, prefix='', mode=None, interface=None,
-                 ignoreContext=None):
+                 ignoreContext=None, showDefault=None):
         self.field = field
         if name is None:
             name = field.__name__
@@ -79,6 +79,7 @@
             interface = field.interface
         self.interface = interface
         self.ignoreContext = ignoreContext
+        self.showDefault = showDefault
 
     def __repr__(self):
         return '<%s %r>' % (self.__class__.__name__, self.__name__)
@@ -138,7 +139,6 @@
             self._data_keys.append(name)
             self._data[name] = form_field
 
-
     def select(self, *names, **kwargs):
         """See interfaces.IFields"""
         prefix = kwargs.pop('prefix', None)
@@ -153,7 +153,6 @@
                             if field.field.interface is interface])
         return self.__class__(*[mapping[name] for name in names])
 
-
     def omit(self, *names, **kwargs):
         """See interfaces.IFields"""
         prefix = kwargs.pop('prefix', None)
@@ -269,6 +268,8 @@
             # Step 6: Set some variables
             widget.ignoreContext = ignoreContext
             widget.ignoreRequest = self.ignoreRequest
+            if field.showDefault is not None:
+                widget.showDefault = field.showDefault
             # Step 7: Set the mode of the widget
             widget.mode = mode
             # Step 8: Update the widget

Modified: z3c.form/trunk/src/z3c/form/field.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/field.txt	2012-07-11 11:46:14 UTC (rev 127320)
+++ z3c.form/trunk/src/z3c/form/field.txt	2012-07-11 14:23:25 UTC (rev 127321)
@@ -304,7 +304,22 @@
     >>> manager['country'].ignoreContext
     False
 
+* ``showDefault``
 
+  The ``showDefault`` can be set on fields.
+
+    >>> manager = field.Fields(IPerson)
+    >>> manager['country'].showDefault
+
+    >>> manager = field.Fields(IPerson, showDefault=True)
+    >>> manager['country'].showDefault
+    True
+
+    >>> manager = field.Fields(IPerson, showDefault=False)
+    >>> manager['country'].showDefault
+    False
+
+
 Fields Widget Manager
 ---------------------
 
@@ -330,12 +345,12 @@
 
   >>> class LastNameTooShort(zope.schema.interfaces.ValidationError):
   ...     """The last name is too short."""
-  
+
   >>> def lastNameConstraint(value):
   ...     if value and value == value.lower():
   ...         raise zope.interface.Invalid(u"Name must have at least one capital letter")
   ...     return True
-  
+
   >>> class IPerson(zope.interface.Interface):
   ...     id = zope.schema.TextLine(
   ...         title=u'ID',
@@ -628,6 +643,28 @@
   'input'
 
 
+``showDefault``
+---------------
+
+``showDefault`` by default is True
+
+  >>> manager['firstName'].showDefault
+  True
+
+``showDefault`` gets set on the widget based on the field's setting.
+
+  >>> personForm.fields['firstName'].showDefault = False
+
+  >>> manager.update()
+  >>> manager['firstName'].showDefault
+  False
+
+  >>> personForm.fields['firstName'].showDefault = True
+
+  >>> manager.update()
+  >>> manager['firstName'].showDefault
+  True
+
 Required fields
 ---------------
 
@@ -735,7 +772,7 @@
 error message.
 
   >>> request = TestRequest(form={
-  ...     'form.widgets.firstName': u'Stephan', 
+  ...     'form.widgets.firstName': u'Stephan',
   ...     'form.widgets.lastName': u'richter',
   ...     'form.widgets.id': u'srichter'})
   >>> manager = field.FieldWidgets(personForm, request, context)
@@ -744,7 +781,7 @@
   >>> extracted = manager.extract()
   >>> extracted
   ({'firstName': u'Stephan'}, (<InvalidErrorViewSnippet for Invalid>,))
-  
+
   >>> extracted[1][0].createMessage()
   u'Name must have at least one capital letter'
 

Modified: z3c.form/trunk/src/z3c/form/interfaces.py
===================================================================
--- z3c.form/trunk/src/z3c/form/interfaces.py	2012-07-11 11:46:14 UTC (rev 127320)
+++ z3c.form/trunk/src/z3c/form/interfaces.py	2012-07-11 14:23:25 UTC (rev 127321)
@@ -211,7 +211,14 @@
         default=None,
         missing_value=None)
 
+    showDefault = zope.schema.Bool(
+        title=_('Show default value'),
+        description=_('A flag, when set, makes the widget to display'
+                      'field|adapter provided default values.'),
+        default=True,
+        required=False)
 
+
 class IFields(ISelectionManager):
     """IField manager."""
 
@@ -436,6 +443,13 @@
         default=True,
         required=False)
 
+    showDefault = zope.schema.Bool(
+        title=_('Show default value'),
+        description=_('A flag, when set, makes the widget to display'
+                      'field|adapter provided default values.'),
+        default=True,
+        required=False)
+
     def extract(default=NO_VALUE):
         """Extract the string value(s) of the widget from the form.
 

Modified: z3c.form/trunk/src/z3c/form/widget.py
===================================================================
--- z3c.form/trunk/src/z3c/form/widget.py	2012-07-11 11:46:14 UTC (rev 127320)
+++ z3c.form/trunk/src/z3c/form/widget.py	2012-07-11 14:23:25 UTC (rev 127321)
@@ -53,6 +53,7 @@
     template = None
     ignoreRequest = FieldProperty(interfaces.IWidget['ignoreRequest'])
     setErrors = FieldProperty(interfaces.IWidget['setErrors'])
+    showDefault = FieldProperty(interfaces.IWidget['showDefault'])
 
     # The following attributes are for convenience. They are declared in
     # extensions to the simple widget.
@@ -106,12 +107,14 @@
             # that requires fixing zope.schema first
             if ((value is self.field.missing_value or
                  value is interfaces.NO_VALUE) and
-                self.field.default is not None):
+                self.field.default is not None and
+                self.showDefault):
                 value = self.field.default
                 lookForDefault = True
         # Step 1.3: If we still have not found a value, then we try to get it
         #           from an attribute value
-        if value is interfaces.NO_VALUE or lookForDefault:
+        if ((value is interfaces.NO_VALUE or lookForDefault)
+            and self.showDefault):
             adapter = zope.component.queryMultiAdapter(
                 (self.context, self.request, self.form, self.field, self),
                 interfaces.IValue, name='default')

Modified: z3c.form/trunk/src/z3c/form/widget.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/widget.txt	2012-07-11 11:46:14 UTC (rev 127320)
+++ z3c.form/trunk/src/z3c/form/widget.txt	2012-07-11 14:23:25 UTC (rev 127321)
@@ -227,8 +227,9 @@
 
   >>> class Person(object):
   ...     age = 45
+  >>> person = Person()
 
-  >>> ageWidget.context = Person()
+  >>> ageWidget.context = person
   >>> zope.interface.alsoProvides(ageWidget, interfaces.IContextAware)
 
 The result is that the context value takes over precendence over the default
@@ -250,6 +251,26 @@
   >>> print ageWidget.render()
   <input type="text" name="age" value="45" />
 
+If the context value is unknown (None), the default value kicks in.
+
+  >>> person.age = None
+
+  >>> ageWidget.update()
+  >>> print ageWidget.render()
+  <input type="text" name="age" value="30" />
+
+Unless the widget is explicitely asked to not to show defaults.
+This is handy for EditForms.
+
+  >>> ageWidget.showDefault = False
+
+  >>> ageWidget.update()
+  >>> print ageWidget.render()
+  <input type="text" name="age" value="" />
+
+  >>> ageWidget.showDefault = True
+  >>> person.age = 45
+
 The context can be explicitely ignored, making the widget display the default
 value again:
 



More information about the checkins mailing list