2

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

我正在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)

抛出异常,由提供的 IDexistingName无效(因为具有该 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.pycheckValidId()

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到我的文件既没有移动也没有删除时,这让我很困惑)。

谢谢您的帮助!

4

2 回答 2

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()

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

于 2013-08-21T14:57:00.927 回答
0

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

文档

于 2013-08-21T13:40:10.417 回答