odoo10 工作流、安全機制、嚮導
一:工作流
工作流是與業務流程相關聯的模型,可用於跟蹤工序的動態演變過程。
工作流、活動(節點或操作)、轉換通常在xml裡以record定義。在工作流中處理的單個流程稱為工作項。
與模型關聯的工作流是在建立模型記錄時生成的,工作流定義之前建立的模型記錄是沒有相應的工作流的。
工作流的一般開發流程:
1:新建workflow.xml檢視檔案,並在manifest中註冊。
2:模型內定義工作流狀態以及節點點選事件:用下拉列表儲存節點狀態,點選相應節點就轉換為相應狀態
wkf = fields.Selection([ ('節點值', "節點顯示內容"), ('節點值', "顯示內容"), ('節點值', "顯示內容"), ], default='預設節點值') #函式:改變工作流節點為XX節點值 @api.multi def action_節點值(self): self.wkf = '節點值' .....
3:在工作流所在模型的form表單頭定義工作流按鈕以及工作流狀態條,顯示工作流:
odoo中位置:
#views.xml <form string="模型的form表單"> <header> <button name="btn_confirm(工作流轉換訊號名)" type="workflow" states="draft(上圖中右側狀態條顯示的狀態)" string="傳送(上圖左側顯示按鈕顯示文字)" class="oe_highlight"/> <button name="btn_accept(工作流轉換訊號)" type="workflow" states="confirmed(狀態條中位置)" string="批准" class="oe_highlight"/> <button name="btn_reject" type="workflow" states="confirmed(狀態條中位置)" string="拒絕" class="oe_highlight"/> <!--可以看到,上面兩個按鈕對應的狀態條狀態都是confirmed,所以如同上圖所示,處於confirmed狀態時,左上角有兩個按鈕顯示。點選他們進行下一步的狀態轉換。--> <field name="state(資料模型中的狀態下拉列表欄位)" widget="statusbar" statusbar_visible="draft,confirmed,accepted,rejected(狀態列表中可以在狀態條顯示的部分)"/> </header> ...... </form>
4:在1中新建的workflow.xml檔案中,定義工作流,定義3中form表單頭的工作流按鈕點選事件,定義工作流轉換。
分為:定義工作流——定義按鈕點選事件(根據前面form表單中button名作為訊號,呼叫模型中的點選函式)——定義節點間的轉換(起點/終點,分別引用前面定義的節點點選事件id)
<odoo> <data> <odoo> <data> <!--定義工作流--> <record model="workflow" id="wkf_工作流id"> <field name="name">wfk.</field> <field name="osv">資料模型</field> <field name="on_create">True</field> </record> <!--定義按鈕的點選事件--> <!--工作流起點--> <record model="workflow.activity" id="act_"> <field name="name"></field> <field name="wkf_id" ref="wkf_工作流id"/> <field name="flow_start" eval="True"/> <field name="kind">function</field> <field name="action">資料模型中起點狀態的點選函式()</field> </record> <!--定義中間點--> <record model="workflow.activity" id="act_"> <field name="name"> <field> <field name="wkf_id" ref="wkf_工作流id"/> <field name="kind">function</field> <field name="action">節點函式()</field> </record> <!--工作流終點--> <record model="workflow.activity" id="act_"> <field name="name"></field> <field name="wkf_id" ref="wkf_"/> <field name="kind">function</field> <field name="flow_stop" eval="True"/> <field name="action">節點點選函式()</field> </record> <!--定義工作流轉換動作--> <record model="workflow.transition" id="模組名_節點1_to_節點2"> <field name="act_from" ref="act_上面節點1id"/> <field name="act_to" ref="act_節點2 id"/> <field name="signal">btn_節點2(在另一個檢視的form表單定義的工作流按鈕id)</field> <field name="condition">一個條件或一個boolean欄位</field> </record> </data> </odoo> </data> </odoo>
5:也可以定義工作流根據某些值而自動轉換:
<record model="workflow.transition" id="session_auto_"> <field name="act_from" ref=""/> <field name="act_to" ref=""/> <field name="condition">條件表示式</field> </record>
6:也可以使用伺服器動作來定義節點轉換函式,把 起點——>終點 簡化為 ?——>終點 的轉換:
<!--1:定義一個伺服器動作--> <record model="ir.actions.server" id="set_session_to_"> <field name="name"></field> <field name="model_id" ref=""/> <field name="code"> model.search([domain表示式,過濾出需要變化工作流的記錄])]).action_節點值()//節點按鈕點選事件 </field> </record> <!--2:定義一個工作流節點,並指定其點選動作為上面的伺服器動作--> <record model="workflow.activity" id="節點值"> <field name="name"></field> <field name="wkf_id" ref="工作流"/> <field name="flow_start" eval="True"/> <field name="kind">dummy</field> <field name="action_id" ref="set_session_to_節點值(引用上面的定義好的響應)"/> </record>
二:安全機制
Odoo對資料的訪問許可權管理有兩種機制:模型訪問許可權管理(access rule)、記錄規則管理(record rule)。記錄規則管理是對模型訪問許可權管理的細化。
模型許可權訪問管理:模型級的許可權控制,該模型的所有記錄,對於群組內使用者(如無定義,則對所有使用者)的讀寫改刪許可權控制。
access rule是通過security資料夾下的ir.model.access.csv檔案來控制的:
這個檔案第一行指明瞭需要控制的內容:
id,name,model_id,group_id,perm_read,perm_write,perm_create,perm_unlink
然後,在下面各行,對資料模型進行訪問許可權控制即可,主要有:
id:一般格式為 access_模型名
name:模型名,把 . 換成 _
model_id:模型id,模型名前加 model_ 即可。如: model_todo_task
group_id:群組id,訪問這個模型的使用者屬於那個群組。如果不確定,可以不寫
perm_read,write,create,unlink:使用者對這個資料模型的讀/寫/新建/刪除 操作許可權。
一個例子:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_todo_task,todo.task,model_todo_task,,1,1,1,1
記錄控制:記錄級別的許可權控制,可以為某模型的記錄定義許可權條件,對於某群組中(如無指定,則所有使用者)符合過濾條件的使用者,賦予模型記錄的讀寫改刪許可權。
基於記錄的許可權可以控制指定模型的例項物件(資料紀錄)的訪問許可權:
<data noupdate="1">//設定為1,則更新模組不會更新該檔案。 <record id="記錄控制id" model="ir.rule"> <field name="name"> </field> <field name="model_id" ref="模型"/> <field name="groups" eval="[(值, ref(''))]"/> <field name="perm_read" eval="0/1"/> <field name="perm_write" eval="0/1"/> <field name="perm_create" eval="0/1"/> <field name="perm_unlink" eval="0/1" /> <field name="domain_force">[domain表示式:表示該許可權控制生效的條件]</field> </record> </data>
三:嚮導
嚮導的檢視位置:
定義好的嚮導表單檢視示例:
一個嚮導是一個繼承自TransientModel的模型,TransientModel又繼承自model
嚮導的主要作用:可以通過many2one、many2many關聯其他模型紀錄,從而可以在嚮導表單檢視中操作其它模型的資料。
1:建立嚮導模型
class 嚮導名(models.TransientModel): _name = '模組.模型名' var = fields.Many2one('被關聯欄位', string="", required=True) vars = fields.Many2many('被關聯欄位', string="") def 對上面欄位的操作函式(): ......
2:在檢視層定義嚮導的form表單
<record model="ir.ui.view" id="wizard_form_view"> <field name="name">wizard.form</field> <field name="model"></field> <field name="arch" type="xml"> <form string="form檢視顯示名"> <group> <field name="引用的欄位"/> <field name="引用的欄位"/> </group> <footer>//位於form表單底部的按鈕 <button name="subscribe" type="object" string="Subscribe" class="oe_highlight"/> or <button special="cancel" string="Cancel"/> </footer> </form> </field> </record>
3:在檢視層定義嚮導啟動:在新視窗啟動向導(即:在新視窗打開向導form檢視)
嚮導可以通過ir.actions.act_window記錄來啟動,將target欄位值設定為new即可。
src_model屬性指定某個模型的嚮導操作可用。
<act_window id="launch_the_wizard" name="" src_model="context.model.name" //嚮導關聯的模型名 res_model="wizard.model.name" //引用具體嚮導 view_mode="form" target="new" key2="client_action_multi"/>
嚮導使用的是常規檢視,我們可以給它的按鈕新增special="cancel"屬性來實現不儲存任何資料的情況下關閉嚮導。
<button special="cancel" string="Cancel"/>