签入事件后的HTTP重定向



我使用Plone 5.0与Plone .app.iterate插件的结帐选项和内部网/外联网工作流程。为了融合这两个概念,我的想法是:在每次工作流转换之后,事件处理程序检查该页是否是工作副本,以及它是否是已发布的页。如果是这样,页面应该自动签入。因此,在审查工作副本之后,它就被签入了。为了完成这个任务,我编写了以下事件处理程序:

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)

签入的代码基本上来自接口的源代码直到用户触发事件的最后一行应该被重定向到现在选中的页面主分支之前,这一切都很正常。用户被重定向到工作副本的一个页面(该页面现在不再存在),并告诉用户该页不可用。我做错了什么?

纯重定向调用不能在任何地方工作,因为其他重定向可以稍后调用(它们在事件处理程序中永远不起作用)。

试着添加这个:

from zExceptions import Redirect

并将最后一行改为:

raise Redirect(view_url)

我不确定是否必须在重定向调用之前从transaction模块添加transaction.commit()

最新更新