【问题标题】:How to abort a workflow transition in Plone如何在 Plone 中中止工作流转换
【发布时间】:2013-08-01 18:39:38
【问题描述】:

我正在处理敏捷内容类型中的复杂验证,该验证应在工作流转换时检查多个字段之间的依赖关系 - 我希望它在将内容从“私有”发送到“时触发的 SimplePublicationWorkflow 中工作”待定”。

我已经为 IBeforeEvent 注册了一个事件侦听器并将其连接起来 - 但是除了引发异常之外,没有任何操作可以阻止转换的发生。 (如果您在那里引发异常,它不会被捕获,并且用户会看到错误页面而不是自定义消息)。

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

【问题讨论】:

  • 嗯。也许诀窍是首先不允许过渡而不是中止它?也许在编辑内容项时对内容项设置权限,然后将工作流转换与权限联系起来?

标签: python workflow plone


【解决方案1】:

推荐的方法是设置一个守卫

守卫表达式应该能够查找视图以促进更复杂的守卫代码,但是当守卫返回False时,甚至没有将转换列为可用。

【讨论】:

  • 没有被列出是不好的-(因为验证代码设置了错误/缺失的消息)-我正在考虑在 IBeforeTransition 上标记对象(带有注释),以便 IAfterTranstion 触发另一个转换,有效地还原了第一个。你会说什么?
  • 对我来说听起来很复杂而且很老套。 :-)
  • 您可以使用守卫并向项目的默认视图添加 IStatusmessage 来解释转换不可用的原因(也许在守卫的视图代码中添加消息也可以)
  • @jsbueno 为了实现fRiSi的建议,看一下github.com/ida/adi.devgen/blob/master/adi/devgen/helpers/…的`switchState()' 它将所有可能的失败案例和提示错误视为UI-msg。
【解决方案2】:

仅作记录;我今天找到了另一个用例,我修补了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

概念验证按预期工作,但我对最终的 UI 不满意,所以我决定听从 Martijn 的建议,重新实现一切作为守卫;它需要额外的代码来设置所有涉及的工作流转换的保护(并在卸载时删除它们),以及一个浏览器视图和 viewlet 来显示一条消息,解释为什么转换不可用,但最后会更干净。

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多