[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