Commit 0aa8b4e1 authored by Dan Korostelev's avatar Dan Korostelev

Add support for reserved names.

parent 45b86cc4
......@@ -5,7 +5,10 @@ CHANGES
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)
------------------
......
......@@ -31,6 +31,7 @@ from zope.lifecycleevent import ObjectModifiedEvent
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,6 +741,32 @@ class NameChooser(object):
>>> 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
"""
......@@ -758,6 +785,11 @@ class NameChooser(object):
_("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")
......
......@@ -18,11 +18,14 @@ $Id$
__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.location.interfaces import ILocation
from zope.component.interfaces import IObjectEvent
from zope.lifecycleevent.interfaces import IObjectModifiedEvent
from zope.location.interfaces import ILocation
from zope.schema import Set
from zope.container.i18n import ZopeMessageFactory as _
class DuplicateIDError(KeyError):
pass
......@@ -193,6 +196,17 @@ class IOrderedContainer(IContainer):
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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment