2016-09-07 41 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