[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