如何在Zope中覆盖移动/重命名对象?

时间:2013-08-21 13:32:54

标签: plone zope plone-4.x

我正在尝试将对象(即图像文件)从一个文件夹移动到另一个文件夹然后重命名 - 用现有对象覆盖(即更新文件)。

我是通过以下方式在Zope(我使用Plone 4.2)中进行的:

from zope.component.hooks import getSite
from zope.traversing.api import traverse

site = getSite()
src = traverse(site, "preview/")
dst = traverse(site, "images/")
source = src.manage_cutObjects(ids=[previewName])
dst.manage_pasteObjects(source)
dst.manage_delObjects(ids=[existingName])

这段代码完成它应该做的事情,它将对象从一个文件夹移动到另一个文件夹,然后,因为manage_renameObject过程不允许覆盖我删除将被替换的现有对象。但是,如果我添加这行代码来实现最终目标:

dst.manage_renameObject(previewName, existingName)

引发异常,existingName提供的ID无效(因为具有此ID的对象已存在且无论我之前是否已将其删除)。

看起来我需要一些提交更新来完成对象移动(或等待等)但我找不到任何相关的东西。

更新

我忘记添加:未引用manage_renameObject中的异常之前的所有更改(对象移动,对象删除)。现在,transaction.commit()(由lewicki提出)已应用更改,但仍会发生异常。程序transaction.savepoint()没有多大帮助,仍然抛出异常并且未应用更改。

分辨

我最初对错误信息感到困惑:

<CENTER>
('Empty or invalid id specified', u'27')
</CENTER>

当我尝试在我ZMI中重现问题时:

<CENTER>
The id "27" is invalid - it is already in use.
</CENTER>

我意识到我需要查看代码。 我深入研究已安装的Plone代码,然后找到我在eggs/Zope2-2.13.18-py2.7.egg/OFS/ObjectManager.py模块中查找的checkValidId()过程中的内容。我的所有问题都存在根源:

if not id or not isinstance(id, str):
    if isinstance(id, unicode):
        id = escape(id)
    raise BadRequest, ('Empty or invalid id specified', id)

所以,我严格对象名称(ID)到 str 类型,这一切都变得有效......

甚至都不需要commit()savepoint()(但最初当我弄清楚问题并在ZMI中观察我的文件既没有移动也没有删除时,我感到困惑很多)。

感谢您的协助!

2 个答案:

答案 0 :(得分:0)

这是dst.manage_renameObject(oldid, newid)。这应该工作

Documentation

答案 1 :(得分:0)

是的,你是对的 - 可能需要提交。我有一个类似的问题,它就这样解决了:

from zope.component.hooks import getSite
from zope.traversing.api import traverse
import transaction

site = getSite()
src = traverse(site, "preview/")
dst = traverse(site, "images/")
source = src.manage_cutObjects(ids=[newName])
dst.manage_pasteObjects(source)
dst.manage_delObjects(ids=[existingName])
transaction.commit()

现在我认为

transaction.savepoint()

应该足够,但你必须自己检查。