我的网站的自定义内容类型Content
最初只附加了一个工作流content_workflow
。现有几千个Content
实例。
我现在需要为此类型content_beta_workflow
添加第二个工作流程。如何更新所有现有内容以成为新工作流程的一部分?
在相关说明中:如果我想将初始工作流程重命名为content_alpha_workflow
,如何更新所有现有内容以反映此更改?
答案 0 :(得分:1)
如果您只是从一个工作流程更改为另一个工作流程,请按以下步骤操作:
保存时,将更新自定义网站的所有对象以使用新工作流程。对于原始工作流程中地图中的每个州,该州的现有内容将进入您在上面步骤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')