我正在使用Plone 5.0和plone.app.iterate插件来检查选项和Intranet / Extranet工作流程。为了融合这两个概念,我的想法是: 每次工作流转换后,事件处理程序都会检查页面是否为工作副本以及是否为已发布页面。如果是这样,则应自动检入页面。 因此,在审查工作副本后,将对其进行检查。 为了实现这一点,我编写了以下事件处理程序:
from Acquisition import aq_inner
from plone import api
from plone.app.iterate.interfaces import IWorkingCopy, ICheckinCheckoutPolicy
from plone.app.iterate import PloneMessageFactory as _
from Products.CMFCore.utils import getToolByName
from Products.statusmessages.interfaces import IStatusMessage
def checkInIfNeeded(document, event):
context = aq_inner(document)
workflowTool = getToolByName(context, "portal_workflow")
status = workflowTool.getStatusOf("intranet_workflow", document)
if IWorkingCopy.providedBy(context) and status["review_state"] == "internally_published":
policy = ICheckinCheckoutPolicy(context)
baseline = policy.checkin("")
IStatusMessage(context.REQUEST).addStatusMessage(
_("Checked in"), type='info')
view_url = baseline.restrictedTraverse("@@plone_context_state").view_url()
context.request.response.redirect(view_url)
办理登机手续的代码几乎来自source of the interface 这工作正常,直到触发事件的用户应重定向到页面的现在已检查的主分支的最后一行。用户被重定向到工作副本的页面(现在不再存在),告诉用户页面不可用。我做错了什么?
答案 0 :(得分:3)
纯重定向调用无处不在,因为以后可以调用其他重定向(它们在事件处理程序中不起作用)。
尝试添加:
from zExceptions import Redirect
并用:
更改最后一行raise Redirect(view_url)
我不确定您是否还必须在重定向呼叫之前从transaction.commit()
模块添加transaction
。