Plone / Workflow-是否可以设置工作流的状态而无需转换?

时间:2016-09-08 15:06:43

标签: workflow plone

我有一个内容类型(批处理),它通过id绑定到不同内容(my_item)的多个实例。 my_item内容类型具有由草稿,待处理和已批准的工作流。有一个表单可以创建批处理并“批准”my_item内容类型实例,并将my_item_instances的batch_id设置为批处理的批处理ID(在创建批处理时设置)。批准的州是最终状态,无法编辑或撤消。

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

我尝试了两种方法:

订阅者是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'需要分配给可以删除“批处理”的角色

在删除事件中,遍历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'权限。

1 个答案:

答案 0 :(得分:4)

这是几年前用于从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