我有一個自定義內容類型Content
的網站,最初有一個工作流程連接,content_workflow
。有數千個Content
的現有實例。使用現有內容的新工作流程和更名工作流程
我現在需要將第二個工作流程添加到此類型content_beta_workflow
。如何將所有現有內容更新爲新工作流的一部分?
相關說明:如果我想將初始工作流重命名爲content_alpha_workflow
,如何更新所有現有內容以反映此更改?
我有一個自定義內容類型Content
的網站,最初有一個工作流程連接,content_workflow
。有數千個Content
的現有實例。使用現有內容的新工作流程和更名工作流程
我現在需要將第二個工作流程添加到此類型content_beta_workflow
。如何將所有現有內容更新爲新工作流的一部分?
相關說明:如果我想將初始工作流重命名爲content_alpha_workflow
,如何更新所有現有內容以反映此更改?
由於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')
如果你只是從一個工作流程切換到其他,請按照下列步驟操作:
保存時,自定義站點的所有對象都將更新爲使用新的工作流程。對於來自原始工作流程的地圖中的每個狀態,該狀態下的現有內容將被置於您在上述步驟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,但這是一個非常有創意的步驟。
由於該問題時,我並不是一個工作流程切換到另一個,我想一個*秒*工作流添加到內容類型的現有實例已有一個。我確實想知道如何才能更改工作流的ID,而不僅僅是名稱,因爲我希望能夠更準確地反映工作流目的的變化,並且不會給開發人員帶來認知負擔弄清楚它的真正含義。 –
將多個工作流程同時應用於內容類型既不可能,也不理智。您是否想要增強現有的wf並更改它的ID? –
它實際上*是*可能在同一個內容類型上同時擁有多個工作流,請參閱http://www.martinaspeli.net/articles/dcworkflows-hidden-gems我有這個工作,我只是不知道如何將新的工作流程應用於現有項目。 –