標籤:
*存取權限管理:
對於其內的資料存取權限管理有兩種機制:
第一種是模型存取權限管理 (accessrule);
第二種是記錄規則管理 (record rule)。
record rule 是對accessrule的細化
如果不為模組設定規則,預設只有Administator才能訪問這個模型的資料
record rule 對 Administator 使用者是無效的,而access rule還是有效
# access rule
一般是放在security 檔案夾下的 ir.model.access.csv 檔案來管理的
檔案表頭如下:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
來一個例子:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_todo_task_group_user,todo.task.user,model_todo_task,base.group_user,1,1,1,1
模型名todo.task model_id:id對應的就是 model_todo_task 這是規定死的
id,name 名字隨意取,但還是規則一些
group_id:id 是群組
下面的,0 表示無許可權, 1 表示有許可權
perm_read 讀
perm_write 寫
perm_create 建
perm_unlink 刪除
# record rule
一般是放在security 檔案夾下的 模組名_record_rules.xml 檔案來管理的
<?xml version=”1.0” encoding=”utf-8”?>
<openerp>
<data noupdate=”1”>
<record id=”todo_task_user_rule” model=”ir.rule”>
<field name=”name”>ToDo Tasks only for owner</field>
<field name=”model_id” ref=”model_todo_task”/>
<field name=”domain_force”>[(’create_uid’,’=’,user.id)]</field>
<field name=”groups” eval=”[(4,ref(’base.group_user’))]”/>
</record>
</data>
</openerp>
record rule 記錄是 ir.rule 模型, 存在public.ir_rule 表格中
model_id 作用於哪個模型
domain_force 對該模型中所有記錄進行某種過濾操作
noupdate 值為1 表示升級模組不會更新本資料
base.group_user 是人力資源 / 僱員
* 來一個完整的例子解說:
# 建立組
<record id="group_department_project_admin" model="res.groups">
<field name="name">A</field>
<fieldname="category_id" ref="B"/>
<field name="users" eval="[(4, ref(‘base.user_root‘))]"/> //把admin使用者加入該組中
</record>
@ name 組名稱
@ category_id 屬於哪個應用程式,或者哪個模組
@ users 組裡面的使用者
這樣B應用程式就建立了一個名叫A的組。並且初始化了A組的一個使用者admin
# 組控制功能表顯示
A
<record model="ir.ui.menu" id=" memu_id1">
<field name="name" >menu1</field>
<field name="groups_id" eval="[(6,0,[ref(‘A‘),ref(‘B‘)]),]"/>
<field name="sequence">1</field>
</record>
@ name 菜單名稱
@ groups_id 哪些組可以訪問該菜單
@ sequence 該菜單的序號
這樣A組與B組的成員都可以訪問menu1菜單,menu1菜單的顯示順序為1
註:eval 後面解釋,多個組訪問用“,”隔開
<menuitem id="menu_id2 " name="menu2" parent="menu_id1" sequence="1" groups="A,B "/>
@ name 菜單名稱
@ parent 父類菜單 如果沒有可以不寫parent
@ groups哪些組可以訪問該菜單
這樣menu1的子功能表menu2可以被A組合B組的成員訪問
# 許可權規則
<record model="ir.rule" id="rule1">
<field name="name">rule1</field>
<field name="model_id" ref="model_model1"/>
<field name="global" eval="True"/>
<field name="domain_force">[1,’=’,1]</field>
<field name="groups" eval="[(4,ref(‘A‘))]"/>
</record>
@ name 規則名稱
@ model_id 依賴的模組
@ global 是否是全域
@ domain_force 過濾條件
@ groups 屬於哪個組
這樣A組的成員就可以取到model_model1的所有資料
# ir.model.access.csv
@id 隨便取
@name 隨便取
@model_id:id 這個就是你所定義的對象了
@group_id:哪個組
@perm_read","perm_write","perm_create","perm_unlink" 增刪改查許可權了。1代表有許可權
# Eval
many2many
(0,0,{values}) 根據values裡面的資訊建立一個記錄。
(1,ID,{values})更新id=ID的記錄(寫入values裡面的資料)
(2,ID) 刪除id=ID的資料(調用unlink方法,刪除資料以及整個主從資料連結關係)
(3,ID) 切斷主從資料的連結關係但是不刪除這個資料
(4,ID) 為id=ID的資料添加主從連結關係。
(5) 刪除所有的從資料的連結關係就是向所有的從資料調用(3,ID)
(6,0,[IDs]) 用IDs裡面的記錄替換原來的記錄(就是先執行(5)再執行迴圈IDs執行(4,ID))
例子[(6, 0, [8, 5, 6, 4])] 設定 many2many to ids [8, 5, 6, 4]
one2many
(0, 0,{ values })根據values裡面的資訊建立一個記錄。
(1,ID,{values}) 更新id=ID的記錄(對id=ID的執行write 寫入values裡面的資料)
(2,ID) 刪除id=ID的資料(調用unlink方法,刪除資料以及整個主從資料連結關係)
例子:
[(0,0,{‘field_name‘:field_value_record1,...}),(0,0,{‘field_name‘:field_value_record})]
many2one的欄位比較簡單,直接填入已經存在的資料的id或者填入False刪除原來的記錄。
# 隱藏的常用技巧
* 直接隱藏
<group name="owner" position="attributes">
<attribute name="invisible">True</attribute>
</group>
* 滿足某些條件的隱藏
<xpath expr="//field[@name=‘parent_id‘]" position=‘attributes‘>
<attribute name="attrs">{‘invisible‘: [(‘passenger‘,‘=‘, True)]}</attribute>
</xpath>
<group col="4" string=‘旅客資訊‘ attrs="{‘invisible‘: [(‘supplier‘,‘=‘, True)]}"></group>
* 通過組來隱藏
<xpath expr="//field[@name=‘type‘]" position="attributes">
<attribute name="groups">base.group_no_one</attribute>
</xpath>
* 菜單的隱藏
<record model="ir.ui.menu" id="crm.menu_crm_opportunities">
<field eval="[(6,0, [ref(‘base.group_no_one‘),])]" name="groups_id"/>
</record>
(11)odoo許可權機制