Adapter for moving objects between containers
To use an object mover, pass a contained object to the class. The contained object should implement IContained. It should be contained in a container that has an adapter to INameChooser.
>>> from zope.app.container.contained import Contained >>> ob = Contained() >>> container = ExampleContainer() >>> container[u'foo'] = ob >>> mover = ObjectMover(ob)
In addition to moving objects, object movers can tell you if the object is movable:
>>> mover.moveable() True
which, at least for now, they always are. A better question to ask is whether we can move to a particular container. Right now, we can always move to a container of the same class:
>>> container2 = ExampleContainer() >>> mover.moveableTo(container2) True >>> mover.moveableTo({}) Traceback (most recent call last): ... TypeError: Container is not a valid Zope container.
Of course, once we've decided we can move an object, we can use the mover to do so:
>>> mover.moveTo(container2) u'foo' >>> list(container) [] >>> list(container2) [u'foo'] >>> ob.__parent__ is container2 True
We can also specify a name:
>>> mover.moveTo(container2, u'bar') u'bar' >>> list(container2) [u'bar'] >>> ob.__parent__ is container2 True >>> ob.__name__ u'bar'
But we may not use the same name given, if the name is already in use:
>>> container2[u'splat'] = 1 >>> mover.moveTo(container2, u'splat') u'splat_' >>> l = list(container2) >>> l.sort() >>> l [u'splat', u'splat_'] >>> ob.__name__ u'splat_'
If we try to move to an invalid container, we'll get an error:
>>> mover.moveTo({}) Traceback (most recent call last): ... TypeError: Container is not a valid Zope container.
Do a test for preconditions:
>>> import zope.interface >>> import zope.schema >>> def preNoZ(container, name, ob): ... "Silly precondition example" ... if name.startswith("Z"): ... raise zope.interface.Invalid("Invalid name.")
>>> class I1(zope.interface.Interface): ... def __setitem__(name, on): ... "Add an item" ... __setitem__.precondition = preNoZ
>>> from zope.app.container.interfaces import IContainer >>> class C1(object): ... zope.interface.implements(I1, IContainer) ... def __repr__(self): ... return 'C1'
>>> from zope.app.container.constraints import checkObject >>> container3 = C1() >>> mover.moveableTo(container3, 'ZDummy') False >>> mover.moveableTo(container3, 'newName') True
And a test for constraints:
>>> def con1(container): ... "silly container constraint" ... if not hasattr(container, 'x'): ... return False ... return True ... >>> class I2(zope.interface.Interface): ... __parent__ = zope.schema.Field(constraint=con1) ... >>> class constrainedObject(object): ... zope.interface.implements(I2) ... def __init__(self): ... self.__name__ = 'constrainedObject' ... >>> cO = constrainedObject() >>> mover2 = ObjectMover(cO) >>> mover2.moveableTo(container) False >>> container.x = 1 >>> mover2.moveableTo(container) True
There are no attributes in this class.
moveTo(target, new_name=None)
Move this object to the target given.
Returns the new name within the target Typically, the target is adapted to IPasteTarget.
moveable()
Returns True if the object is moveable, otherwise False.
moveableTo(target, name=None)
Say whether the object can be moved to the given target.
Returns True if it can be moved there. Otherwise, returns False.
There are no known subclasses.