新的&使用现有内容重命名工作流程

时间:2012-09-10 02:35:27

标签: workflow plone

我的网站的自定义内容类型Content最初只附加了一个工作流content_workflow。现有几千个Content实例。

我现在需要为此类型content_beta_workflow添加第二个工作流程。如何更新所有现有内容以成为新工作流程的一部分?

在相关说明中:如果我想将初始工作流程重命名为content_alpha_workflow,如何更新所有现有内容以反映此更改?

2 个答案:

答案 0 :(得分:1)

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

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

    对于重命名旧工作流,您可以在ZMI中的portal_workflow工具中执行此操作。但只是改变了面向人类的工作流标题。更改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)
    

    您可以在upgrade step中为定义内容类型和工作流程的程序包添加此代码。在工作流工具上添加对updateRoleMappings的调用,除了原始工作流程之外,您还将设置为通过标准Plone UI使用新工作流程。

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

答案 1 :(得分:0)

由于workflow_history是每个内容项的dict属性,因此根据需要添加或更新合适的项目。首先,我将content_workflow的GenericSetup复制到content_alpha_workflow。接下来,我创建了content_beta_workflow并将其添加到配置文件中。然后我写了以下升级步骤:

import logging
from DateTime import DateTime

def modify_content_workflow_history(context, logger=None):
    if logger is None: logger = logging.getLogger('my.product')

    # import the new workflows
    context.portal_setup.runImportStepFromProfile('profile-my.product:default', 'workflow')

    # set up some defaults for the new records
    _history_defaults = dict(
        action = None,
        actor = 'admin',
        comments = 'automatically created by update v2',
        time = DateTime(),        
    )
    _alpha_defaults = dict(review_state = 'alpha_state_1', **_history_defaults)
    _beta_defaults = dict(review_state = 'beta_state_1', **_history_defaults)

    for parent in context.parents.values():
        for content in parent.content.values():

            # don't acquire the parent's history
            if 'parent_workflow' in content.workflow_history:
                content.workflow_history = {}

            # copy content_workflow to content_alpha_workflow
            if 'content_workflow' in content.workflow_history:
                alpha_defaults = context.workflow_history['content_workflow']
                del content.workflow_history['content_workflow']
            else:
                alpha_defaults = (_alpha_defaults,) # must be a tuple
            content.workflow_history['ctcc_content_alpha_workflow'] = alpha_defaults

            # create the beta workflow with a modified actor
            beta_defaults = dict(**_beta_defaults)
            beta_defaults['actor'] = u'%suser' % parent.id
            content.workflow_history['ctcc_content_beta_workflow'] = (beta_defaults,)

    logger.info('Content workflow history updated')