Workflow 新及;使用现有内容重命名工作流

Workflow 新及;使用现有内容重命名工作流,workflow,plone,Workflow,Plone,我有一个自定义内容类型为content的网站,它最初附加了一个工作流content\u workflow。现有数千个内容的实例 我现在需要为这种类型添加第二个工作流,content\u beta\u workflow。如何将所有现有内容更新为新工作流的一部分 另请注意:如果我想将初始工作流重命名为content\u alpha\u workflow,如何更新所有现有内容以反映此更改?如果您只是从一个工作流更改为另一个工作流,请执行以下步骤: 转到站点设置>类型 从下拉菜单中选择自定义内容类型,页

我有一个自定义内容类型为
content
的网站,它最初附加了一个工作流
content\u workflow
。现有数千个
内容的实例

我现在需要为这种类型添加第二个工作流,
content\u beta\u workflow
。如何将所有现有内容更新为新工作流的一部分


另请注意:如果我想将初始工作流重命名为
content\u alpha\u workflow
,如何更新所有现有内容以反映此更改?

如果您只是从一个工作流更改为另一个工作流,请执行以下步骤:

  • 转到站点设置>类型
  • 从下拉菜单中选择自定义内容类型,页面将更新以显示当前工作流
  • 从下拉列表中选择新工作流,将生成一个地图,显示当前工作流中的每个状态
  • 对于每个状态,在新工作流中选择最匹配(或最合适)的状态
  • 保存时,将更新自定义站点的所有对象以使用新工作流。对于原始工作流映射中的每个状态,处于该状态的现有内容将被置于您在上面步骤4中选择的状态。安全设置将被重新编入索引,您就完成了

    至于重命名旧工作流,您可以在ZMI中的portal_工作流工具中进行重命名。但只更改工作流面向人的标题。更改ID可能会对内容的工作流历史记录产生副作用

    已编辑

    好的,我从您的评论中看到,您希望在现有工作流的基础上向类型添加新工作流。这里有一些示例代码可以实现这一点:

    my_type = 'Content' # This is your content portal_type name
    my_wf = 'content_workflow_beta'
    wf_chain = list(wf_tool.getChainForPortalType(my_type))
    if my_wf not in wf_chain:
        wf_chain.append(my_wf)
    wf_tool.setChainForPortalTypes([my_type], wf_chain)
    
    您可以将此代码添加到定义内容类型和工作流的包的中。在工作流工具上添加对
    updateRoleMappings
    的调用,您将被设置为在原始工作流的基础上通过标准Plone UI使用新工作流


    正如您已经发现的那样,您还可以手动更新所有对象的工作流历史记录以重命名工作流ID,但这是一个非常具有侵入性的步骤。

    如果您只是从一个工作流更改为另一个工作流,请遵循以下步骤:

  • 转到站点设置>类型
  • 从下拉菜单中选择自定义内容类型,页面将更新以显示当前工作流
  • 从下拉列表中选择新工作流,将生成一个地图,显示当前工作流中的每个状态
  • 对于每个状态,在新工作流中选择最匹配(或最合适)的状态
  • 保存时,将更新自定义站点的所有对象以使用新工作流。对于原始工作流映射中的每个状态,处于该状态的现有内容将被置于您在上面步骤4中选择的状态。安全设置将被重新编入索引,您就完成了

    至于重命名旧工作流,您可以在ZMI中的portal_工作流工具中进行重命名。但只更改工作流面向人的标题。更改ID可能会对内容的工作流历史记录产生副作用

    已编辑

    好的,我从您的评论中看到,您希望在现有工作流的基础上向类型添加新工作流。这里有一些示例代码可以实现这一点:

    my_type = 'Content' # This is your content portal_type name
    my_wf = 'content_workflow_beta'
    wf_chain = list(wf_tool.getChainForPortalType(my_type))
    if my_wf not in wf_chain:
        wf_chain.append(my_wf)
    wf_tool.setChainForPortalTypes([my_type], wf_chain)
    
    您可以将此代码添加到定义内容类型和工作流的包的中。在工作流工具上添加对
    updateRoleMappings
    的调用,您将被设置为在原始工作流的基础上通过标准Plone UI使用新工作流


    正如您已经发现的那样,您还可以手动更新所有对象的工作流历史记录以重命名工作流ID,但这是一个非常具有侵入性的步骤。

    由于
    工作流历史记录是每个内容项上的
    dict
    属性,因此需要根据需要添加或更新合适的项。首先,我将
    content\u工作流
    的常规设置复制到
    content\u alpha\u工作流
    。接下来,我创建了
    content\u beta\u工作流
    ,并将其添加到配置文件中。然后我编写了以下升级步骤:

    导入日志
    从日期时间导入日期时间
    def修改内容工作流历史记录(上下文,记录器=无):
    如果logger为None:logger=logging.getLogger('my.product')
    #导入新工作流
    context.portal\u setup.runImportStepFromProfile('profile-my.product:default','workflow')
    #为新记录设置一些默认值
    _历史默认值=dict(
    行动=无,
    actor='admin',
    注释='由更新v2自动创建',
    时间=日期时间(),
    )
    _alpha\u默认值=dict(查看\u状态='alpha\u状态\u 1',**u历史\u默认值)
    _beta\u默认值=dict(查看状态='beta\u状态\u 1',**u历史\u默认值)
    对于context.parents.values()中的父对象:
    对于parent.content.values()中的内容:
    #不要获取家长的历史记录
    如果content.workflow\u历史记录中有“父工作流”:
    content.workflow_history={}
    #将内容\u工作流复制到内容\u alpha\u工作流
    如果content.workflow\u历史记录中有“content\u workflow”:
    alpha\u默认值=上下文.工作流\u历史记录['content\u workflow']
    del content.workflow_history['content_workflow']
    其他:
    alpha_defaults=(_alpha_defaults,)#必须是元组
    content.workflow_history['ctcc_content_alpha_workflow']=alpha_默认值
    #使用修改后的参与者创建beta工作流
    beta\u默认值=dict(**\u beta\u默认值)
    beta_默认值['actor']=u'%suser'%parent.id
    content.workflow_history['ctcc_content_beta_workflow']=(beta_默认值,)
    logger.info('内容工作流历史记录已更新')
    
    作为
    工作流\u历史记录
    是一个
    dic