1

我正在尝试构建一个可以分配给任意容器并具有以下行为的工作流。当容器从状态 A -> A' 进行转换时,应检查容器内容的状态并根据其当前状态移动到新状态。换句话说:

  • obj1:在状态“a”将转换为“a*”
  • obj2:在状态“b”将转换为“b*”

等等...

obj1 和 obj2 遵循相同的工作流程,分支到多个最终状态(批准、拒绝、替代等......)

如果我可以将我的 python 代码作为受信任的代码触发,我知道该怎么做。不幸的是,我无法弄清楚如何或将代码放在我的产品中的位置,因此这将起作用。我找到了使用“外部方法”的参考资料,但这似乎正在消失。我也希望代码驻留在我的项目中。

我认为这可能很简单,我忽略了一些东西。欢迎帮助如何将其放入我的项目或实现相同目标的其他途径。

4

1 回答 1

5

支持 DCWorkflow 的脚本仅支持通过 Web 可添加的对象,这将您限制为那里的外部方法。

更好的选择是改用工作流事件。对于每个工作流转换,会触发两个事件:

  • Products.DCWorkflow.interfaces.IAfterTransitionEvent
  • Products.DCWorkflow.interfaces.IBeforeTransitionEvent

如果您订阅其中任何一个事件,则可以过滤正确的工作流程和转换,以对来自受信任代码的转换做出反应。

每个触发的事件都具有以下属性:

  • object: 工作流对象
  • workflow:当前适用的工作流对象
  • old_state: 一个Products.DCWorkflow.States.StateDefinition对象
  • new_state: 另一个Products.DCWorkflow.States.StateDefinition对象
  • transition: 一个Products.DCWorkflow.Transititions.TransitionDefinition对象
  • status:具有当前工作流变量的字典
  • kwargs: 传入 change-transition 调用的额外参数字典。

使用 ZCML 注册订阅者:

<subscriber
    provides="zope.component.testfiles.adapter.IS"
    factory=".youreventsmodule.aftertransition_handler"
    for="Products.DCWorkflow.interfaces.IAfterTransitionEvent"
    />

或者,因为转换事件是对象事件,所以如果它适用于您的对象,则仅侦听转换事件:

<subscriber
    provides="zope.component.testfiles.adapter.IS"
    factory=".youreventsmodule.container_aftertransition_handler"
    for=".interfaces.IMyContainerType
         Products.DCWorkflow.interfaces.IAfterTransitionEvent"
    />

IMyContainerType它仅为具有接口的对象上的转换事件注册您的处理程序。

处理程序将是:

def aftertransition_handler(event):
    # handle all transition events, ever

或者,将其限制为一个对象接口时:

def aftertransition_handler(obj, event):
    # handle all transition events for our container interface
于 2013-06-27T14:15:27.763 回答