2011-10-17 80 views
3

我想阻止在Plone中删除文件夹类型的实例,除非父节点文件夹被删除。我有一个预感,事件处理程序可以防止删除(引发绑定到标记接口的IObjectRemovedEvent处理程序中的异常),但实现此规则的例外似乎更难以固定:我想允许删除项目,当其父项文件夹正在被删除。防止删除Plone中的文件夹(类型),除非父节点被删除

我最初的预感是我可以遍历__parent__指针并检查是否在父元素(或某个远程间接容器)上设置了一个属性,但是我不知道如何在删除时设置此属性在试图删除所包含的孩子之前(否则不允许删除)。所以现在,我在质疑我是否以正确的方式接近这一点?我误解了在Plone中删除对象的问题限制吗?我应该看plone.app.linkintegrity来源借用技巧?

我的用例:“项目”文件夹中的“设置文件夹” - 本质上,除非项目文件夹本身被删除,否则绝不允许删除设置文件夹。我想我正在寻求一种非常具体的遏制关系的参照完整性。

你会如何防止删除一个对象,除非它被删除的情况下,直接导致它的父对象被删除?

+0

你可以重新设计你的情况下,为了使“设置”成为“项目”的图式。它不是那样工作吗? – tcurvelo

回答

1

的时间公平一点后,我终于找到了解决这一普遍问题(但在不同的上下文中):

  1. 父父的接口和OFS.interfaces创建一个用户。 IObjectWillBeMovedEvent。
  2. 该处理程序应该使用zope.globalrequest.getRequest()来获取请求对象,并将其调整为IAnnotations以获取请求上的注释对象(实际上是请求期间的全局对象)。
  3. IObjectWillBeMovedEvent处理程序将在注释对象上保存元组形式的物理路径元组(context.getPhysicalPath())。
  4. 尝试阻止删除子项的IObjectRemovedEvent的事件处理程序将在其路径共享父项的基本路径时通过(请参阅示例)。

因此,只有在尝试删除对象本身时才会引发异常,而在删除其父对象时才会引发异常。

见例如:http://bazaar.launchpad.net/~upiq-dev/upiq/dev-uu.formlibrary/revision/113