Запретить удаление папки (типа) в Plone, если родитель не удаляется - PullRequest
3 голосов
/ 17 октября 2011

Я хочу предотвратить удаление экземпляра типа папок в Plone, за исключением случая удаления родительской папки.У меня есть догадка, что обработчик событий может предотвратить удаление (вызвать исключение в обработчике IObjectRemovedEvent, привязанном к интерфейсу маркера), но реализовать исключение из этого правила, кажется, труднее определить: я хочу разрешить удаление элемента, когдаего родительская папка удаляется.

Моя первоначальная догадка заключалась в том, что я мог пройтись по __parent__ указателям и проверить, был ли установлен атрибут родительского (или некоторого удаленного косвенного контейнера), что он удалялся, но яЯ не уверен, как установить этот атрибут при удалении родительского объекта до попытки удалить содержащийся дочерний элемент (в противном случае удаление невозможно).Итак, теперь я задаюсь вопросом, правильно ли я подхожу к этому?Я неправильно понимаю проблемы ограничения для удаления объектов в Plone?Стоит ли искать источник plone.app.linkintegrity для заимствований?

Мой пример использования: «папка настроек» внутри папки «проекта» - по сути, папка настроек никогда не должна удаляться, если толькосама папка проекта удаляется.Наверное, я прошу ссылочную целостность для очень специфических отношений содержания.

Как бы вы предотвратили удаление объекта, за исключением случая, когда он был удален как прямой результат удаления его родителя?

1 Ответ

1 голос
/ 09 мая 2012

Через некоторое время я наконец нашел решение этой общей проблемы (но в другом контексте):

  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

...