1

我有一个具有自定义内容类型的站点Content,最初附加了一个工作流,content_workflow. 现有的Content.

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

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

4

2 回答 2

1

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

  1. 转到站点设置 > 类型
  2. 从下拉菜单中选择您的自定义内容类型,页面将更新以显示当前工作流程
  3. 从下拉列表中选择您的新工作流程,将生成一张地图,显示当前工作流程中的每个状态
  4. 对于每个状态,选择新工作流中最匹配(或最合适)的状态

保存时,自定义站点的所有对象都将更新为使用新的工作流程。对于来自原始工作流的地图中的每个状态,该状态中的现有内容将被放入您在上面的步骤 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)

您可以在用于定义内容类型和工作流的包的升级步骤中添加此代码。在工作流工具上添加一个调用updateRoleMappings,除了您的原始工作流之外,您将被设置为通过标准 Plone UI 使用新的工作流。

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

于 2012-09-10T05:21:32.267 回答
0

作为每个内容项workflow_historydict属性,这是根据需要添加或更新合适的项的情况。首先,我将 GenericSetup 复制为content_workflowto 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')
于 2012-09-11T04:27:37.843 回答