轉載請註明原文地址:http://www.javashuo.com/article/p-viuduezx-mb.html html
一:工做流api
工做流是與業務流程相關聯的模型,可用於跟蹤工序的動態演變過程。安全
工做流、活動(節點或操做)、轉換一般在xml裏以record定義。在工做流中處理的單個流程稱爲工做項。服務器
與模型關聯的工做流是在建立模型記錄時生成的,工做流定義以前建立的模型記錄是沒有相應的工做流的。session
工做流的通常開發流程:dom
1:新建workflow.xml視圖文件,並在manifest中註冊。函數
2:模型內定義工做流狀態以及節點點擊事件:用下拉列表保存節點狀態,點擊相應節點就轉換爲相應狀態學習
wkf = fields.Selection([ ('節點值', "節點顯示內容"), ('節點值', "顯示內容"), ('節點值', "顯示內容"), ], default='默認節點值') #函數:改變工做流節點爲XX節點值 @api.multi def action_節點值(self): self.wkf = '節點值'
.....
3:在工做流所在模型的form表單頭定義工做流按鈕以及工做流狀態條,顯示工做流:ui
odoo中位置:spa
#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"/>