[Checkins] SVN: z3c.form/trunk/ Allowed persistent.mapping.PersistentMapping and persistent.dict.PersistentDict as data classes for datamanager.DictionaryField.

Michael Howitz mh at gocept.com
Thu Jul 16 14:41:15 EDT 2009


Log message for revision 101947:
  Allowed persistent.mapping.PersistentMapping and persistent.dict.PersistentDict as data classes for datamanager.DictionaryField.
  

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

-=-
Modified: z3c.form/trunk/CHANGES.txt
===================================================================
--- z3c.form/trunk/CHANGES.txt	2009-07-16 16:36:04 UTC (rev 101946)
+++ z3c.form/trunk/CHANGES.txt	2009-07-16 18:41:15 UTC (rev 101947)
@@ -5,9 +5,12 @@
 Version 2.1.0 (unreleased)
 --------------------------
 
-- Feature: The `DictionaryFieldManager` now allows all mappings. By default,
-  however, the field manager is only registered for dict, because it would
-  otherwise get picked up in undesired scenarios.
+- Feature: The `DictionaryFieldManager` now allows all mappings
+  (``zope.interface.common.mapping.IMapping``), even
+  ``persistent.mapping.PersistentMapping`` and
+  ``persistent.dict.PersistentDict``. By default, however, the field
+  manager is only registered for dict, because it would otherwise get
+  picked up in undesired scenarios.
 
 Version 2.0.0 (2009-06-14)
 --------------------------

Modified: z3c.form/trunk/src/z3c/form/datamanager.py
===================================================================
--- z3c.form/trunk/src/z3c/form/datamanager.py	2009-07-16 16:36:04 UTC (rev 101946)
+++ z3c.form/trunk/src/z3c/form/datamanager.py	2009-07-16 18:41:15 UTC (rev 101947)
@@ -20,6 +20,8 @@
 import zope.interface
 import zope.component
 import zope.schema
+import persistent.mapping
+import persistent.dict
 from zope.interface.common import mapping
 from zope.security.interfaces import ForbiddenAttribute
 from zope.security.checker import canAccess, canWrite, Proxy
@@ -90,12 +92,27 @@
         return True
 
 class DictionaryField(DataManager):
-    """Dictionary field."""
+    """Dictionary field.
+
+    NOTE: Even though, this data manager allows nearly all kinds of
+    mappings, by default it is only registered for dict, because it
+    would otherwise get picked up in undesired scenarios. If you want
+    to use for another mapping, register the appropriate adapter in
+    your application.
+
+    """
+
     zope.component.adapts(
         dict, zope.schema.interfaces.IField)
 
+    _allowed_data_classes = (
+        dict,
+        persistent.mapping.PersistentMapping,
+        persistent.dict.PersistentDict,
+        )
+
     def __init__(self, data, field):
-        if (not isinstance(data, dict) and
+        if (not isinstance(data, self._allowed_data_classes) and
             not mapping.IMapping.providedBy(data)):
             raise ValueError("Data are not a dictionary: %s" %type(data))
         self.data = data

Modified: z3c.form/trunk/src/z3c/form/datamanager.txt
===================================================================
--- z3c.form/trunk/src/z3c/form/datamanager.txt	2009-07-16 16:36:04 UTC (rev 101946)
+++ z3c.form/trunk/src/z3c/form/datamanager.txt	2009-07-16 18:41:15 UTC (rev 101947)
@@ -262,10 +262,18 @@
 The datamanager can really only deal with dictionaries and mapping types:
 
   >>> import zope.interface.common.mapping
+  >>> import persistent.mapping
+  >>> import persistent.dict
   >>> class MyMapping(object):
   ...     zope.interface.implements(zope.interface.common.mapping.IMapping)
   >>> datamanager.DictionaryField(MyMapping(), IPerson['name'])
   <z3c.form.datamanager.DictionaryField object at ...>
+  >>> datamanager.DictionaryField(persistent.mapping.PersistentMapping(),
+  ...     IPerson['name'])
+  <z3c.form.datamanager.DictionaryField object at ...>
+  >>> datamanager.DictionaryField(persistent.dict.PersistentDict(),
+  ...     IPerson['name'])
+  <z3c.form.datamanager.DictionaryField object at ...>
 
   >>> datamanager.DictionaryField([], IPerson['name'])
   Traceback (most recent call last):



More information about the Checkins mailing list