防止删除Plone中的文件夹(类型),除非正在删除父文件夹

防止删除Plone中的文件夹(类型),除非正在删除父文件夹,plone,zope,Plone,Zope,我想防止在Plone中删除folderish类型的实例,删除父文件夹时除外。我有一种预感,事件处理程序可以阻止删除(在绑定到标记接口的IObjectRemovedEvent处理程序中引发异常),但实现此规则的异常似乎更难确定:我希望在删除项目的父文件夹时允许删除该项目 我最初的预感是,我可以遍历\uuuuuu parent\uuuuuu指针,检查是否在正在删除的父级(或某个远程间接容器)上设置了属性,但我不确定在尝试删除包含的子级(否则不允许删除)之前删除父级时如何设置此属性. 所以现在,我在

我想防止在Plone中删除folderish类型的实例,删除父文件夹时除外。我有一种预感,事件处理程序可以阻止删除(在绑定到标记接口的
IObjectRemovedEvent
处理程序中引发异常),但实现此规则的异常似乎更难确定:我希望在删除项目的父文件夹时允许删除该项目

我最初的预感是,我可以遍历
\uuuuuu parent\uuuuuu
指针,检查是否在正在删除的父级(或某个远程间接容器)上设置了属性,但我不确定在尝试删除包含的子级(否则不允许删除)之前删除父级时如何设置此属性. 所以现在,我在质疑我是否以正确的方式处理这个问题?我是否误解了在Plone中删除对象的问题约束?我应该看看plone.app.linkintegrity源代码来借用技巧吗

我的使用案例:“项目”文件夹中的“设置文件夹”——本质上,设置文件夹不应该被删除,除非项目文件夹本身被删除。我想我要求的是一个非常具体的包容关系的引用完整性


您如何防止删除某个对象,除非该对象是由于其父对象被删除而直接被删除的?

经过一段时间后,我终于找到了解决此一般问题的方法(但在不同的上下文中):

  • 在父级上为父级接口和OFS.interfaces.IObjectWillBeMovedEvent创建订阅服务器
  • 该处理程序应该使用zope.globalrequest.getRequest()获取请求对象,并将其调整为IANotations以获取请求上的annotations对象(实际上是请求期间的全局对象)
  • IObjectWillBeMovedEvent处理程序将在注释对象上保存物理路径元组(context.getPhysicalPath())的元组形式
  • 如果IObjectRemovedEvent的路径共享父项的基本路径,则尝试阻止删除子项的IObjectRemovedEvent的事件处理程序将通过(请参见示例)
  • 因此,只有在尝试删除对象本身时才会引发异常,而在删除其父对象时则不会引发异常


    参见示例:

    您可以重新设计您的场景,以使“设置”成为“项目”的模式。不是这样吗?