2011-10-17 83 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