我想中止删除对象(自定义Content-Type),并重定向到将工作流设置为名为Unavailable
的自定义状态的页面(视图),向其显示一条消息用户“您成功删除了对象!”。该对象仍将在ZODB上,但对于某些组,它根本就不会被看到,就像它真的被删除一样。
我可以使用IObjectWillBeRemovedEvent
对订阅者进行加注,但尝试使用raise zExceptions.Redirect("url")
不起作用。 raise
调用可以避免删除,但会显示消息“无法删除对象”,而不是重定向。
任何人都有这种情况的解决方案吗?
答案 0 :(得分:3)
正如你所看到的,Plone / Zope 2对象管理很混乱(是的,我愿意燃烧业力只是为了说明这一点)。您需要在用户界面级别覆盖删除操作,而不是在对象级别。
尝试弄清楚如何在Plone用户界面中自定义删除操作。
确保默认的删除操作不再可见且可用(例如,为其设置更高的所需权限,例如cmf.ManagePortal)
根据您的专业工作流程创建另一个删除操作
我相信删除可以从portal_actions配置,但可能有单独的情况删除一个对象(操作菜单)和删除多个对象(folder_contents)。
答案 1 :(得分:2)
您需要REQUEST.response.redirect("url")。我很确定zExceptions.Redirect是Zope内部处理response.redirect()调用的方式。
确保在调用redirect()之后仍然引发另一个异常。那就是说,这肯定是错误的做法。首先,您将至少进行双重索引,这是在事务中止之前完成的。目录索引是处理修改内容的请求中最昂贵的部分,因此这会在您的服务器上产生浪费的负载。
事件用于执行与事件仅切线相关的其他内容。你想要的是从根本上改变有人删除时发生的事情。也许你应该修补/覆盖容器对象(文件夹?)上的基础删除方法来进行工作转换。
答案 2 :(得分:1)
您可以在事件处理程序中引发OFS.ObjectManager.BeforeDeleteException
以停止删除。如果你引发LinkIntegrityNotificationException
,你会被重定向到Plones nice Link完整性页面。
from OFS.interfaces import IObjectWillBeRemovedEvent
from plone.app.linkintegrity.exceptions import LinkIntegrityNotificationException
import grok
@grok.subscribe(ICSRDocument, IObjectWillBeRemovedEvent)
def document_willbemoved(doc, event):
raise LinkIntegrityNotificationException(doc)