odoo10學習筆記六:工做流、安全機制、嚮導

 

轉載請註明原文地址: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"/>
相關文章
相關標籤/搜索