Избегать удаления объекта (с помощью IObjectWillBeRemovedEvent) и сделать перенаправление на пользовательский вид / шаблон? - PullRequest
3 голосов
/ 17 августа 2011

Я хотел бы прервать удаление объекта (пользовательский тип контента) и перенаправить на страницу (представление), которая устанавливает рабочий процесс в пользовательское состояние с именем Unavailable, показывает сообщение пользователю " Вы успешно удалили объект! " Объект все еще будет в ZODB, но для некоторых групп его просто не увидят, как если бы он был действительно удален.

Я могу сделать рейз для подписчика, используя IObjectWillBeRemovedEvent, но попытка использовать raise zExceptions.Redirect("url") не работает. Вызов raise позволяет избежать удаления, но вместо перенаправления отображается сообщение «Объект не может быть удален».

У кого-нибудь есть решение по этому сценарию?

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

Как вы можете видеть, управление объектами Plone / Zope 2 является грязным (да, я хочу сжечь карму, просто чтобы сказать это).Вам необходимо переопределить действие удаления на уровне пользовательского интерфейса, а не на уровне объекта.

Попробуйте выяснить, как настроить действия удаления в пользовательском интерфейсе Plone.

  • Убедитесь, что действия по умолчанию «Удалить» больше не видны и недоступны (например, установите для них более высокое необходимое разрешение, например cmf.ManagePortal)

  • Создайте еще одно действие удаления, которое соответствует вашему специализированному рабочему процессу

Я считаю, что Удалить можно настроить из portal_actions, но могут быть отдельные случаи для удаления одного объекта (меню «Действия») и удаления нескольких объектов (folder_contents).

2 голосов
/ 18 августа 2011

Вам нужно REQUEST.response.redirect ("url") . Я почти уверен, что zExceptions.Redirect - это способ, которым Zope внутренне обрабатывает вызовы response.redirect (). Убедитесь, что вы вызываете еще одно исключение после вызова redirect (), чтобы транзакция была отменена.

Тем не менее, это, конечно, кажется неправильным способом сделать это. Во-первых, вы будете выполнять как минимум двойное индексирование, которое выполняется до прекращения транзакции. Индексирование по каталогам - это самая дорогая часть обработки запроса, которая модифицирует контент, поэтому это создает расточительную нагрузку на ваш сервер.

События предназначены для выполнения дополнительных действий, которые только косвенно связаны с событием. То, что вы хотите, это фундаментально изменить то, что происходит, когда кто-то удаляет. Может быть, вам следует исправить / переопределить базовый метод удаления для объектов-контейнеров (папок?), Чтобы выполнить рабочий переход.

1 голос
/ 27 мая 2014

Вы можете поднять 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)
...