2012-09-10 97 views
1

我有一個自定義內容類型Content的網站,最初有一個工作流程連接,content_workflow。有數千個Content的現有實例。使用現有內容的新工作流程和更名工作流程

我現在需要將第二個工作流程添加到此類型content_beta_workflow。如何將所有現有內容更新爲新工作流的一部分?

相關說明:如果我想將初始工作流重命名爲content_alpha_workflow,如何更新所有現有內容以反映此更改?

回答

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') 
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) 

您可以定義您的內容類型和工作流組件在upgrade step添加此代碼。在工作流工具上添加一個致電updateRoleMappings的電話,您將被設置爲除了原始工作流之外還通過標準Plone UI使用新工作流程。

正如您已經發現的那樣,您還可以手動更新所有對象的工作流程歷史記錄以重命名工作流ID,但這是一個非常有創意的步驟。

+0

由於該問題時,我並不是一個工作流程切換到另一個,我想一個*秒*工作流添加到內容類型的現有實例已有一個。我確實想知道如何才能更改工作流的ID,而不僅僅是名稱,因爲我希望能夠更準確地反映工作流目的的變化,並且不會給開發人員帶來認知負擔弄清楚它的真正含義。 –

+0

將多個工作流程同時應用於內容類型既不可能,也不理智。您是否想要增強現有的wf並更改它的ID? –

+0

它實際上*是*可能在同一個內容類型上同時擁有多個工作流,請參閱http://www.martinaspeli.net/articles/dcworkflows-hidden-gems我有這個工作,我只是不知道如何將新的工作流程應用於現有項目。 –