【轉】Odoo開發之:工作流 workflow


在OpenERP中,工作流是管理一組“所做的事情”(與一些數據模型的記錄關聯)的人為現象。工作流提供了高級別的方式來組織記錄要上做的事情。

 

具體地說,工作流是一個定向的路徑,這里節點稱為活動並且弧線稱為流程進度。

  • 活動定義了OpenERP應該處理的工作,比如改變某些記錄的狀態,或者發送郵件。
  • Transitions 控制了活動之間工作流的處理進度

在一個工作流定義中,一個達到了條件,就會觸發進度的推進,這樣工作流的行為取決於用戶的actions(比如點擊一個按鈕),變更記錄,或者任意的Python代碼。

 

Basic(基本)

使用數據文件定義一個工作流是很直截了當的:針對activities和transitions的記錄工作流是與記錄一起給出。例如,這里是定義在XML中簡單的一系列的兩個activities。

<record id="test_workflow" model="workflow">  
    <field name="name">test.workflow</field>  
    <field name="osv">test.workflow.model</field>  
    <field name="on_create">True</field>  
</record>  
  
<record id="activity_a" model="workflow.activity">  
    <field name="wkf_id" ref="test_workflow"/>  
    <field name="flow_start">True</field>  
    <field name="name">a</field>  
    <field name="kind">function</field>  
    <field name="action">print_a()</field>  
</record>  
<record id="activity_b" model="workflow.activity">  
    <field name="wkf_id" ref="test_workflow"/>  
    <field name="flow_stop">True</field>  
    <field name="name">b</field>  
    <field name="kind">function</field>  
    <field name="action">print_b()</field>  
</record>  
  
<record id="trans_a_b" model="workflow.transition">  
    <field name="act_from" ref="activity_a"/>  
    <field name="act_to" ref="activity_b"/>  
</record>  

 

定義的工作流關聯到一個特定的模型(這個模式由模型workflow的osv屬性給出)。activities或者transations內指定的方法將在這個模型上調用。

 

在上路的例子代碼中,創建了一個調用test_workflow的工作流。其由兩個activities,“a”和“b”,一個transation,從a到b,組成。

 

第一個activity有屬性flow_start,並設置為true,這樣OpenERP知道在工作流實例化后從哪里開啟工作流便利。因為工作流記錄的on_create設置為true,為每個新創建的記錄實例化工作流(否則,要通過其他的方式實例化工作流,比如一些模塊的Python代碼)。

 

當實例化工作流時,從activity a開始。那個activity是一種函數,意味着模型test.workflow上的方法action pring_a調用(通常傳遞cr,uid,ids,context參數給它)。

 

a和b之間的transation不指定任何條件。意味着處理a后工作流實例立即從a走向b,並稍后處理activity b。

 

Transation(遷移)

Transation提供了一個控制結構安排工作流。當一個activity完成時,工作流引擎就試着從一個完成的activity(活動)流向下一個activity(活動)。在它們最簡單的表單中(如同上面的例子),它就繼續連接activities(活動):即之前的activities(活動)處理完成就處理后面的activities(活動)。

 

作為一下子運行所有的activities(活動)的替換,其也可能在transitions(遷移)上等待,僅當匹配了某些條件才能通過。標准是條件,信號或者觸發。它們將在下面詳細討論。

 

Conditions(條件)

當完成一個activity時,檢查它的輸出Transation決定工作流實例處理它們並到達下一個activity。當只定義了一個條件時(沒有信號,沒有觸發),OpenERP評估這個條件,如果評估為true,工作流實例處理通過transation。如果條件不匹配,在每次關聯的記錄修改時都會再評估一次,或者通過一個顯示的方法調用做這件事。

 

默認地,屬性condition(即評估表達式) 是true。注意條件可能有幾行長,在那種情況下,最后的一個值決定了是否采取通過。

 

在條件評估環境中,定義了幾個方便的符號(除了在OpenERP的safe_eval環境中)

  • 所有的模型列名,and
  • 所有瀏覽器記錄屬性

Singals(信號)

除了條件外,一個transation可以指定一個信號名。當使用一個信號名時,transation不會直接通過,即使condition評估為true。阻塞transation,等待被喚醒。

 

為了喚醒一個由信號名定義的transation,信號必須發送給工作流實例。發送信號的通用方式是在用戶界面使用一個按鈕,使用元素<button/>並且信號名作為按鈕的屬性name。一旦點擊了按鈕,信號發送給當前記錄的工作流實例。

 

注意

 

當信號發送給工作流實例時,仍要評估條件。

 

Triggers(觸發)

 

條件評估為fasle,transation不會通過(並且它引導的activity不立即處理)。工作流實例仍然可以通過提供所謂的觸發器處理transation。這是發生在條件不滿足,觸發器記錄在數據庫中的情況下。之后,可能喚醒工作流實例,其安裝了那些觸發器,提供它們重新評估transation條件。這種機制使得喚醒工作流實例很便宜,只是針對幾個(安裝了觸發器的工作流)而不是全部

 

觸發器以記錄IDs記錄在數據庫中(與模型名字一起)並適用於等待那些記錄的工作流實例。transation定義提供了一個模型名(屬性trigger_model)和一個Python表達式(屬性trigger_expression),在給定的模型中評估成一列記錄IDs。那些記錄的任何一個可以喚醒它們關聯的工作流實例。

 

注意

無論什么時候transation重試,觸發器不重裝。

 

Splitting and joining transitions(拆分和聯合過渡)

當多個transitions離開同一個activity,或者流向同一個activity,OpenERP提供了獲取哪個transition的控制,或者如何處理到達的activity。activity的split_mode和join_mode 屬性用於這樣的控制。那些屬性的可能值解釋如下。

 

Activities

transition可以通過工作流的控制結構看見,activities是事件發生的地方,從改變記錄狀態到發送郵件。

 

存在不同的activities:Dummy,Function,Subflow和Stop all,當activity處理時每個做不同的事情。除了這些類型,activity還有其他屬性,詳情看下面。

 

Flow start and flow stop(流開始和流結束)

flow_start屬性是一個布爾值,指定了當工作流實例化時,activity是否在處理。多個activities能將其屬性flow_start設置為true。當為一個記錄實例化一個工作流時,OpenERP簡單地處理所有,並之后評估輸出的transitions。

屬性flow_stop是一個布爾值,指定activity是否停止工作流實例。當所有的activity,其flow_stop屬性設置為true,都完成時,工作流實例認為是完成了。

 

 
對於OpenERP知道工作流實例完成了是很重要的。一個工作流可以有一個activity,其是另一個工作流(稱為子流)。當子流完成了,這個活動也就完成了。
 
Subflow(子流)
一個活動可以嵌入一個完整的工作流,稱為子流(嵌入的工作流叫做父工作流)。實例化的工作流通過屬性subflow_id指定。
 
注意
在GUI中,那個屬性不能被設置除非activity的種類是Subflow
 
當其子流完成時這個activity被認為是完成了(它的輸出transitions准備評估)
 
 
從子流中發送一個信號
 
當一個工作流嵌入了一個工作流的activity(作為子流),子流可以從其自己的activities發送一個信號到其父工作流,通過給的信號名(屬性signal_send)。OpenERP通過發送以subflow為前綴 signal_sen的值給父工作流處理那些activities.
 
換句話說,可能相互交互並且在父工作流中獲取transition,作為子流中執行的activities。
 
Server actions(服務器action)
一個action可以運行一個Server Action 通過在屬性action_id中指定其ID。
 
Python action
一個acitivity可以執行一些Python代碼,由屬性action給出。評估環境與Condition部分解釋的一樣。
 
Split mode(分叉模式)
 
一個activity處理后,就評估其輸出transitions。一般地,如果一個transition能被獲取,OpenERP通過它並且繼續通向transition導向的下一個activity。
 
 
實際上,當多個transition離開一個activity,OpenERP可能繼續或者不,這取決於其他的transitions。即,transitions上的conditions能聯合在一起,聯合的結果通知OpenERP穿過0,1,或者所有的transitions。這種聯合的方式由屬性split_mode控制。
 
有三種分叉模式:XOR,OR 和AND
 
 
XOR
當遷移與一個XOR分叉模式聯合時,只要第一個滿足遷移條件的遷移跳轉,只有 一個跳轉。
 
OR
使用OR模式,只要滿足遷移條件即沿着該遷移跳轉。有零個或者多個跳轉。剩余的遷移條件將不再評估。
 
AND
使用AND模式,OpenERP只有所有遷移都滿足遷移條件才跳轉,而且是沿所有遷移跳轉。有零個或全部跳轉
 
Join mode(合並模式)
 
就像輸出遷移條件可以合並起來決定它們能否通過一樣,輸入遷移能合並來決定一個activity(活動)是否將處理或者什么時候處理。屬性join_mode控制那個行為。
 
有兩種可能的合並模式:XOR和AND
 
XOR
 
使用XOR模式,以本節點為終點的入遷移,只要有一個跳至本節點,即執行本節點的Action。
 
AND
 
使用AND模式,在處理activity前,OpenERP將等待直到所有的輸入遷移已經通過。(以本節點為終點的入遷移,只有所有遷移都已經跳至本節點,才執行本節點的Action)
 
種類
 
Activities能是不同的種類:dummy,function,subflow,或者stopall。種類定義了一個activity能做的工作類型。
 
Dummy
 
activity的Dummy種類什么都不做,或者對應activites僅調用一個服務action。什么都不做的activities用於作為hubs來獲取/分發translations
 
 
Funcation(函數)
 
對應activity(活動)的Funcation(函數)種類僅需要運行一些Python代碼,並且可能是一個Server action。
 
Stop all
activity的 stopall種類完全停止工作流實例並且標記其已經完成。另外其也可以運行一些Python代碼。
 
Subflow
當activity的種類是Subflow時,activity插入到另一個工作流實例。當子流完成時,activity也認為完成。
 
默認地,the subflow is instanciated for the same record as the parent workflow。通過提供Python代碼(返回一個記錄ID(作為子流的同樣的數據模型))可能改變行為。嵌入的子消息流實例是一個所給的記錄。
 
 
詳細內容請參考官方資料:https://www.odoo.com/documentation/master/reference/workflows.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM