Class
zope.copypastemove.ObjectMover

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

Base classes

Implemented Interfaces

Attributes/Properties

There are no attributes in this class.

Methods

Known Subclasses

There are no known subclasses.