2016-09-07 3 views
1

J'utilise Plone 5.0 avec l'addon plone.app.iterate pour l'option de paiement et un flux de travail intranet/extranet. Pour fusionner ces deux concepts, mon idée est la suivante: Après chaque transition de workflow, un gestionnaire d'événements vérifie si la page est une copie de travail et s'il s'agit d'une page publiée. . Dans ce cas la page doit être vérifié automatiquement Ainsi, après l'examen d'une copie de travail, il est vérifié dans Pour y parvenir, j'ai écrit le gestionnaire d'événement suivant:.Redirection HTTP après l'événement d'enregistrement

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) 

Le code pour le check-in est à peu près du source of the interface Cela fonctionne bien jusqu'à la dernière ligne où l'utilisateur qui déclenche l'événement devrait être redirigé vers la branche principale de la page maintenant archivée. L'utilisateur est redirigé vers une page de la copie de travail (qui n'existe plus), indiquant à l'utilisateur que la page n'est pas disponible. Qu'ai-je fait de mal?

Répondre

3

L'appel de redirection pure ne fonctionne pas partout car d'autres redirections peuvent être appelées plus tard (elles ne fonctionnent jamais dans les gestionnaires d'événements).

Essayez d'ajouter ceci:

from zExceptions import Redirect 

et changer la dernière ligne avec:

raise Redirect(view_url) 

Je ne suis pas sûr si vous devez ajouter un transaction.commit() du module transaction avant l'appel de redirection.

+0

Cela fonctionne bien et 'transaction.commit()' est nécessaire. – Waynebird