2016-09-07 29 views
1

我正在使用Plone 5.0和plone.app.iterate插件来提供签出选项和Intranet/Extranet工作流。为了融合这两个概念,我的想法是: 事件处理程序检查每个工作流程转换后,页面是否为工作副本,以及它是否为已发布页面。如果是这样自动将页面应该在 工作后复查所以检查复制它在检查 为了做到这一点,我写了下面的事件处理程序:签入事件后的HTTP重定向

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 这工作正常,直到用户触发事件的最后一行应该被重定向到现在检入页面的主分支。用户被重定向到工作副本的一个页面(现在不再存在),告诉用户页面不可用。我做错了什么?

回答

3

纯粹的重定向呼叫无处不在,因为其他重定向可以稍后调用(它们在事件处理程序中从不起作用)。

尝试添加此:

from zExceptions import Redirect 

和改变的最后一行有:

raise Redirect(view_url) 

我不确定,如果你还必须在转接呼叫前添加transaction.commit()transaction模块。

+0

它运作良好,'transaction.commit()'是必需的。 – Waynebird