1. 程式人生 > 其它 >odoo開發教程六:工作流、安全機制、嚮導

odoo開發教程六:工作流、安全機制、嚮導

一:工作流

工作流是與業務流程相關聯的模型,可用於跟蹤工序的動態演變過程。

工作流、活動(節點或操作)、轉換通常在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"/>