如何在Plone中中止工作流转换

时间:2013-08-01 18:39:38

标签: python workflow plone

我正在灵巧内容类型中进行复杂验证,该类型应检查工作流转换时跨多个字段的依赖关系 - 我希望它在内容从“私有”发送到“私有”时触发的SimplePublicationWorkflow中工作挂起”。

我已经为IBeforeEvent注册了一个事件监听器并将其连接起来 - 但是没有做任何事情就可以阻止过渡发生。 (如果你在那里引发了一个例外,它就会被删除,而且用户会看到错误页面而不是自定义消息。)

那么,在现代Plone中验证转换的推荐方法是什么?我发现文档建议添加外部方法以在转换的Guard表达式上调用 - 但我不想使用外部方法,如果可能,我想保留默认工作流程。创建一个自定义的选项提供了一种干净的方法来进行检查。

2 个答案:

答案 0 :(得分:3)

建议的方法是设置后卫

守护表达式能够查找视图以促进更复杂的保护代码,但当保护返回False时,转换甚至不会列为可用。

答案 1 :(得分:0)

仅供记录;我今天发现了另一个用例,我将Products.DCWorkflow作为概念验证进行修补:

<强> configure.zcml中

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:monkey="http://namespaces.plone.org/monkey">

  <monkey:patch
      description="Allow aborting workflow transitions"
      class="Products.DCWorkflow.DCWorkflow.DCWorkflowDefinition"
      original="doActionFor"
      replacement=".patches.doActionFor"
      />

  <subscriber
      for="Products.DCWorkflow.interfaces.IBeforeTransitionEvent"
      handler=".subscribers.validate_workflow_transition"
      />

</configure>

<强> subscribers.py

def validate_workflow_transition(event):
    if not check_something():
        raise MyException

<强> patches.py

def doActionFor(self, ob, action, comment='', **kw):
    ...
    # XXX: above this everything is included without any changes
    #      monkey patch replaces only the last line
    try:
        self._changeStateOf(ob, tdef, kw)
    except MyException:
        # do something
        pass

概念验证按预期工作,但我对结束用户界面不满意,所以我决定遵循Martijn的建议并重新实施一切作为后卫;它需要额外的代码来设置所涉及的所有工作流转换(并在卸载时删除它们),以及浏览器视图和viewlet以显示消息,解释转换不可用的原因,但最后会更清洁。 / p>