1

我将 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)

签入的代码几乎来自界面的源代码 这工作正常,直到用户触发事件的最后一行被重定向到页面的现在签入的主分支。用户被重定向到工作副本的页面(现在不再存在),告诉用户该页面不可用。我做错什么了?

4

1 回答 1

3

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

尝试添加这个:

from zExceptions import Redirect

并将最后一行更改为:

raise Redirect(view_url)

我不确定您是否还必须在重定向调用之前添加一个transaction.commit()from模块。transaction

于 2016-09-07T20:28:49.350 回答