[Checkins] SVN: z3c.form/trunk/ Fixed bug: The `canAccess' and
`canWrite' methods on the AttributeField
Michael Kerrin
michael.kerrin at openapp.ie
Thu Sep 20 13:38:50 EDT 2007
Log message for revision 79765:
Fixed bug: The `canAccess' and `canWrite' methods on the AttributeField
datamanager didn't check for the case when the field's interface was
not directly provided for by the context.
Changed:
U z3c.form/trunk/CHANGES.txt
U z3c.form/trunk/src/z3c/form/datamanager.py
U z3c.form/trunk/src/z3c/form/datamanager.txt
U z3c.form/trunk/src/z3c/form/field.txt
-=-
Modified: z3c.form/trunk/CHANGES.txt
===================================================================
--- z3c.form/trunk/CHANGES.txt 2007-09-20 17:37:23 UTC (rev 79764)
+++ z3c.form/trunk/CHANGES.txt 2007-09-20 17:38:50 UTC (rev 79765)
@@ -5,6 +5,10 @@
Version 1.7.0 (9/??/2007)
-------------------------
+- Bug: The `canAccess' and `canWrite' methods on the AttributeField
+ datamanager didn't check for the case when the field's interface was
+ not directly provided for by the context.
+
- Feature: Implemented single checkbox widget that can be used for boolean
fields. They are not available by default but can be set using the
``widgetFactory`` attribute.
Modified: z3c.form/trunk/src/z3c/form/datamanager.py
===================================================================
--- z3c.form/trunk/src/z3c/form/datamanager.py 2007-09-20 17:37:23 UTC (rev 79764)
+++ z3c.form/trunk/src/z3c/form/datamanager.py 2007-09-20 17:38:50 UTC (rev 79765)
@@ -68,14 +68,20 @@
def canAccess(self):
"""See z3c.form.interfaces.IDataManager"""
- if isinstance(self.context, Proxy):
- return canAccess(self.context, self.field.__name__)
+ context = self.context
+ if self.field.interface is not None:
+ context = self.field.interface(context)
+ if isinstance(context, Proxy):
+ return canAccess(context, self.field.__name__)
return True
def canWrite(self):
"""See z3c.form.interfaces.IDataManager"""
- if isinstance(self.context, Proxy):
- return canWrite(self.context, self.field.__name__)
+ context = self.context
+ if self.field.interface is not None:
+ context = self.field.interface(context)
+ if isinstance(context, Proxy):
+ return canWrite(context, self.field.__name__)
return True
class DictionaryField(DataManager):
Modified: z3c.form/trunk/src/z3c/form/datamanager.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/datamanager.txt 2007-09-20 17:37:23 UTC (rev 79764)
+++ z3c.form/trunk/src/z3c/form/datamanager.txt 2007-09-20 17:38:50 UTC (rev 79765)
@@ -191,6 +191,13 @@
>>> cityDm = datamanager.AttributeField(stephan, IAddress['city'])
+We can access and write to the city attribute:
+
+ >>> cityDm.canAccess()
+ True
+ >>> cityDm.canWrite()
+ True
+
Initially there is no value, but of course we can create one:
>>> cityDm.get()
Modified: z3c.form/trunk/src/z3c/form/field.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/field.txt 2007-09-20 17:37:23 UTC (rev 79764)
+++ z3c.form/trunk/src/z3c/form/field.txt 2007-09-20 17:38:50 UTC (rev 79765)
@@ -692,7 +692,7 @@
Let's have a look at the default form first. Initially, the standard
registered widgets are used:
- >>> manager = field.FieldWidgets(personForm, request, context)
+ >>> manager = field.FieldWidgets(personForm, request, srichter)
>>> manager.update()
>>> manager['firstName']
@@ -709,10 +709,11 @@
It can be simply assigned as follows:
>>> personForm.fields['firstName'].widgetFactory = CustomInputWidgetFactory
+ >>> personForm.fields['lastName'].widgetFactory = CustomInputWidgetFactory
Now this widget should be used instead of the registered default one:
- >>> manager = field.FieldWidgets(personForm, request, context)
+ >>> manager = field.FieldWidgets(personForm, request, srichter)
>>> manager.update()
>>> manager['firstName']
<CustomInputWidget 'form.widgets.firstName'>
@@ -721,7 +722,7 @@
default factory for in the ``WidgetFactories`` object, which manages the
custom widgets for all modes. Now all modes show this input widget:
- >>> manager = field.FieldWidgets(personForm, request, context)
+ >>> manager = field.FieldWidgets(personForm, request, srichter)
>>> manager.mode = interfaces.DISPLAY_MODE
>>> manager.update()
>>> manager['firstName']
@@ -737,22 +738,30 @@
>>> personForm.fields['firstName']\
... .widgetFactory[interfaces.DISPLAY_MODE] = CustomDisplayWidgetFactory
+ >>> personForm.fields['lastName']\
+ ... .widgetFactory[interfaces.DISPLAY_MODE] = CustomDisplayWidgetFactory
Now the display mode should produce the custom display widget, ...
- >>> manager = field.FieldWidgets(personForm, request, context)
+ >>> manager = field.FieldWidgets(personForm, request, srichter)
>>> manager.mode = interfaces.DISPLAY_MODE
>>> manager.update()
>>> manager['firstName']
<CustomDisplayWidget 'form.widgets.firstName'>
+ >>> manager['lastName']
+ <CustomDisplayWidget 'form.widgets.lastName'>
-... while the input mode still shows the default custom input widget:
+... while the input mode still shows the default custom input widget
+on the `lastName' field but not on the `firstName' field since we
+don't have the `test.Edit' permission:
- >>> manager = field.FieldWidgets(personForm, request, context)
+ >>> manager = field.FieldWidgets(personForm, request, srichter)
>>> manager.mode = interfaces.INPUT_MODE
>>> manager.update()
>>> manager['firstName']
- <CustomInputWidget 'form.widgets.firstName'>
+ <CustomDisplayWidget 'form.widgets.firstName'>
+ >>> manager['lastName']
+ <CustomInputWidget 'form.widgets.lastName'>
The widgets factories component,
@@ -797,4 +806,3 @@
>>> factories.get(interfaces.DISPLAY_MODE)
<function CustomDisplayWidgetFactory at ...>
>>> factories.get(interfaces.INPUT_MODE)
-
More information about the Checkins
mailing list