我有一个具有自定义内容类型的站点Content
,最初附加了一个工作流,content_workflow
. 现有的Content
.
我现在需要为这种类型添加第二个工作流,content_beta_workflow
. 如何更新所有现有内容以成为新工作流程的一部分?
在相关说明中:如果我想将初始工作流重命名为content_alpha_workflow
,如何更新所有现有内容以反映此更改?
如果您只是从一种工作流程更改为另一种工作流程,请执行以下步骤:
保存时,自定义站点的所有对象都将更新为使用新的工作流程。对于来自原始工作流的地图中的每个状态,该状态中的现有内容将被放入您在上面的步骤 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,但这是一个相当具有侵入性的步骤。
作为每个内容项workflow_history
的dict
属性,这是根据需要添加或更新合适的项的情况。首先,我将 GenericSetup 复制为content_workflow
to 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')