[Checkins] SVN: zope.container/trunk/ Add support for reserved names.

Dan Korostelev nadako at gmail.com
Wed Mar 4 21:41:32 EST 2009


Log message for revision 97508:
  Add support for reserved names.

Changed:
  U   zope.container/trunk/CHANGES.txt
  U   zope.container/trunk/src/zope/container/contained.py
  U   zope.container/trunk/src/zope/container/interfaces.py

-=-
Modified: zope.container/trunk/CHANGES.txt
===================================================================
--- zope.container/trunk/CHANGES.txt	2009-03-05 01:14:57 UTC (rev 97507)
+++ zope.container/trunk/CHANGES.txt	2009-03-05 02:41:32 UTC (rev 97508)
@@ -5,7 +5,10 @@
 3.7.2 (unreleased)
 ------------------
 
-- ...
+- Add support for reserved names for containers. To specify reserved
+  names for some container, you need to provide an adapter from the
+  container to the ``zope.container.interfaces.IReservedNames`` interface.
+  The default NameChooser is now also aware of reserved names.
 
 3.7.1 (2009-02-05)
 ------------------

Modified: zope.container/trunk/src/zope/container/contained.py
===================================================================
--- zope.container/trunk/src/zope/container/contained.py	2009-03-05 01:14:57 UTC (rev 97507)
+++ zope.container/trunk/src/zope/container/contained.py	2009-03-05 02:41:32 UTC (rev 97508)
@@ -31,6 +31,7 @@
 from zope.container.i18n import ZopeMessageFactory as _
 from zope.container.interfaces import IContained
 from zope.container.interfaces import INameChooser
+from zope.container.interfaces import IReservedNames, NameReserved
 from zope.container.interfaces import IObjectAddedEvent
 from zope.container.interfaces import IObjectMovedEvent
 from zope.container.interfaces import IObjectRemovedEvent
@@ -740,7 +741,33 @@
         >>> NameChooser(container).checkName('2', object())
         True
 
+        We can reserve some names by providing a IReservedNames adapter
+        to a container:
+        
+        >>> NameChooser(container).checkName('reserved', None)
+        True
+        >>> NameChooser(container).checkName('other', None)
+        True
 
+        >>> from zope.container.interfaces import IContainer
+        >>> class ReservedNames(object):
+        ...     zope.component.adapts(IContainer)
+        ...     zope.interface.implements(IReservedNames)
+        ...
+        ...     def __init__(self, context):
+        ...         self.reservedNames = set(('reserved', 'other'))
+
+        >>> zope.component.provideAdapter(ReservedNames)
+
+        >>> NameChooser(container).checkName('reserved', None)
+        Traceback (most recent call last):
+        ...
+        NameReserved: reserved
+        >>> NameChooser(container).checkName('other', None)
+        Traceback (most recent call last):
+        ...
+        NameReserved: other
+
         """
 
         if not name:
@@ -758,6 +785,11 @@
                 _("Names cannot begin with '+' or '@' or contain '/'")
                 )
 
+        reserved = IReservedNames(self.context, None)
+        if reserved is not None:
+            if name in reserved.reservedNames:
+                raise NameReserved(name)
+
         if name in self.context:
             raise KeyError(
                 _("The given name is already being used")

Modified: zope.container/trunk/src/zope/container/interfaces.py
===================================================================
--- zope.container/trunk/src/zope/container/interfaces.py	2009-03-05 01:14:57 UTC (rev 97507)
+++ zope.container/trunk/src/zope/container/interfaces.py	2009-03-05 02:41:32 UTC (rev 97508)
@@ -18,12 +18,15 @@
 __docformat__ = 'restructuredtext'
 
 from zope.interface import Interface, Attribute, Invalid
-from zope.component.interfaces import IObjectEvent
 from zope.interface.common.mapping import IItemMapping
 from zope.interface.common.mapping import IReadMapping, IEnumerableMapping
+from zope.component.interfaces import IObjectEvent
+from zope.lifecycleevent.interfaces import IObjectModifiedEvent
 from zope.location.interfaces import ILocation
-from zope.lifecycleevent.interfaces import IObjectModifiedEvent
+from zope.schema import Set
 
+from zope.container.i18n import ZopeMessageFactory as _
+
 class DuplicateIDError(KeyError):
     pass
 
@@ -193,6 +196,17 @@
 class IContainerNamesContainer(IContainer):
     """Containers that always choose names for their items."""
 
+class IReservedNames(Interface):
+    """A sequence of names that are reserved for that container"""
+    
+    reservedNames = Set(
+        title=_(u'Reserved Names'),
+        description=_(u'Names that are not allowed for addable content'),
+        required=True,
+        )
+    
+class NameReserved(ValueError):
+    __doc__ = _("""The name is reserved for this container""")
 
 ##############################################################################
 # Moving Objects



More information about the Checkins mailing list