Plone/Workflow- 是否可以在不需要转换的情况下设置工作流的状态?

Plone/Workflow- Is it possible to set the state of a workflow without needing a transition?

我有一个内容类型(批处理),它通过一个 ID 绑定到不同内容 (my_item) 的多个实例。 my_item 内容类型的工作流程包括草稿、待定和已批准。有一个表单可以创建批次和 "approves" my_item 内容类型实例,并将 my_item_instances' batch_id 设置为批次的批次 ID(在批次是创建)。已批准状态是最终状态,无法编辑或撤回。

我需要能够将 my_item 内容类型实例的状态改回草稿。由于在删除项目时(通过订户)没有从批准状态返回草稿的过渡,我需要以某种方式将 my_items 的状态设置回 "draft" 而不需要过渡。

我尝试了两种方法:

订阅者是 IObjectWillBeRemoved

def my_item_will_be_removed(obj,event)
    my_items = catalog.searchResults('batch_id':obj.batch_id)
    for i in my_items:
        api.content.transition(obj=i,to_state='pending')

这会导致错误 InvalidParaemterError:找不到将状态设置为草稿的工作流

我也试过使用:

wf_tool = api.portal.get_tool(name='portal_workflow')
wf_tool.setStatusOf('item_workflow',i,'pending')

出于某种原因,最终 my_item 变成了一个字符串。

这不可能吗?如果可以,我该怎么做?


Offtopic,但我想我现在可以使用的解决方法是: 进行从批准状态到草案状态的转换 "retract_from_approval"

'can_retract_from_approval'需要分配给可以删除"batch"

的角色

在删除事件中,遍历my_items,将'can_retract_from_approval'权限分配给在当前迭代中负责在本地删除批处理的角色

my_items = catalog.searchResults('batch_id',obj.batch_id)
for m in my_items:
    mi_obj = m.getObject()
    mi_obj.manage_permission('retract_from_approval',['ARole'],obj=mi_obj)

然后使用工作流工具进行 'retract_from_approval' 转换,将 my_item 发送回草稿状态。然后去掉'can_retract_from_approval'权限。

这是我在 很多 年前用于从 Plone 2.5 迁移到 Plone 3 的旧迁移工具的片段。

    wtool = getToolByName(obj, 'portal_workflow')
    status = {'action': '', 
              'review_state': old_state, 
              'actor': 'admin', 
              'comments': 'Recovery state', 
              'time': DateTime() }

    wtool.setStatusOf(workflow_id, obj, status)
  1. 不确定现在是否仍然有效
  2. 你可能需要 reindexObjectSecurity