[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