原文地址:http://www.cnblogs.com/ygj0930/p/7120030.html
一:工作流
工作流是與業務流程相關聯的模型,可用於跟蹤工序的動態演變過程。
工作流、活動(節點或操作)、轉換通常在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"/>

