我正在尝试将对象(即图像文件)从一个文件夹移动到另一个文件夹然后重命名 - 用现有对象覆盖(即更新文件)。
我是通过以下方式在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
中观察我的文件既没有移动也没有删除时,我感到困惑很多)。
感谢您的协助!
答案 0 :(得分:0)
这是dst.manage_renameObject(oldid, newid)
。这应该工作
答案 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()
应该足够,但你必须自己检查。