前言:odoo权限管理主要分为4类
1.菜单权限:即未指定的用户组看不到该菜单。缺点:不安全,只是隐藏菜单,若用户知道菜单的id一样可以通过url查看菜单。
2.对象级别:即有权限的对象才能有某种功能比如:增删改查的权限
3.记录级别权限:即对数据的访问权限
4.字段级别权限:即一个对象或者某个字段的访问权限
例:以请假单为例:只要管理员才能看到所有人的请假单,而自己只能看到自己的请假单
leave_security.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record model="ir.module.category" id="module_category_leave">
<field name="name">请假单</field>
</record>
<record model="res.groups" id="group_leave_user">
<field name="name">User</field>
<field name="category_id" ref="module_category_leave"/>
</record>
<record model="res.groups" id="group_leave_manager">
<field name="name">Manager</field>
<field name="implied_ids" eval="[(4, ref('group_leave_user'))]"/>
<field name="category_id" ref="module_category_leave"/>
</record>
<record id="rule_user_leave" model="ir.rule">
<field name="name">User只能看自己的请假单</field>
<field name="model_id" ref="model_leave_leave"/>
<field name="domain_force">[('create_uid','=',user.id)]</field>
<field name="groups" eval="[(4,ref('group_leave_user'))]"/>
</record>
<record id="rule_manager_leave" model="ir.rule">
<field name="name">Manage可看所有请假单</field>
<field name="model_id" ref="model_leave_leave"/>
<field name="domain_force">[(1,'=',1)]</field>
<field name="groups" eval="[(4,ref('group_leave_manager'))]"/>
</record>
</data>
</openerp>
ir.model.access.csv
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_leave_leave_191012_001,leave.leave,model_leave_leave,group_leave_user,1,1,1,0
access_leave_leave_191012_002,leave.leave,model_leave_leave,group_leave_manager,1,1,1,1
解析:
- id:命名规则:access_模型类名,如果权限很多的话,后面可以跟着日期时间后缀
- name:模型类名
- model_id:model_模型类名
- group_id:group_开头,定义的权限名,与leave_security.xml中相互对应
- perm_read,perm_write,perm_create,perm_unlink:分别对应读、写、创建、删除权限
以销售订单为例设置权限:只有超级管理员才能看全部销售订单数据,而普通用户只能看已完成的订单数据
menu.xml
<menuitem id='menu_nt_sale_order' name='订单' parent="menu_nt_order" sequence="10" new_ui="1"/>
<menuitem id='menu_nt_sale_order_waiting_list' name='销售订单(待处理)' parent="menu_nt_sale_order" sequence="10" action="nt_sale_order_tree_action_waiting" new_ui="1" />
<menuitem id='menu_nt_sale_order_all_list' name='销售订单(全部)' parent="menu_nt_sale_order" sequence="20" action="nt_sale_order_tree_action_all" new_ui="1" />
通过id设置权限列表 role_init.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="0">
<!-- 角色 -->
<record id="nt_user_role_super_user" model="res.users">
<field name="name">超级管理员(初始化)</field>
<field name="login">super_user</field>
<field name="password">super_user</field>
<field name="is_init" eval="True" />
<field name="is_role" eval="True"/>
<field name="active" eval="False"/>
<field name="groups_id" eval="[此可放用户组权限]"]" />
<field name="display_menu_ids" eval="[
(4,ref('nt_core.menu_nt_sale_order_waiting_list')),
(4,ref('nt_core.menu_nt_sale_order_all_list'))]"
<record id="nt_user_role_store_master" model="res.users">
<field name="name">店员(初始化)</field>
<field name="login">store_master</field>
<field name="password">store_master</field>
<field name="is_init" eval="True" />
<field name="is_role" eval="True"/>
<field name="is_shop_manager" eval="True"/>
<field name="active" eval="False"/>
<field name="display_menu_ids" eval="[
(3,ref('nt_core.menu_nt_sale_order_waiting_list')),
(4,ref('nt_core.menu_nt_sale_order_all_list')),]"
解析:
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))
one2many:
-
(0, 0,{ values })根据values里面的信息新建一个记录。
-
(1,ID,{values}) 更新id=ID的记录(对id=ID的执行write 写入values里面的数据)
-
(2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)