Odoo权限机制
权限管理的四个层次
一、菜单级别:不属于指定菜单所包含组的用户看不到该菜单,只隐藏菜单,若知道菜单ID,任然可以通过指定URL访问
二、对象级别:对某个对象是否有“创建,读取,修改,删除”的权限,可以简单理解为表对象
三、记录级别:对对象表中的数据的访问权限,比如“客户”对象,业务员只能对自己所创建的客户有访问权限,而经理可以访问其管辖的所有业务员的“客户”对象
四、字段级别:一个对象或表上的某些字段的访问权限,比如产品的成本字段只有经理有读写权限
1 name = fields.Char('Name', size=128, required=True, select=True, read=['base.group_admin'], write=['base.group_admin'])
定义name字段只有超级用户组可读写
建立权限组
就是我们常说的用户组,通常存放在 "reurity/模块名_security.xml" 文件下
例如:
1 <!-- 新建用户组manager --> 2 3 <record id="manager" model="res.groups"> 4 <field name="category_id" ref="module_category_hidden"/> 5 <field name="name">Manager</field> 6 <field name="comment">经理将可以访问 任务管理-配置</field> 7 <field name="implied_ids" eval="[(4, ref('base.group_hr_user'))]"/> 8 <field name="users" eval="[(4, ref('base.user_root'))]"/> 9 </record>
@category_id:用户组所属的模块名
@name:用户组名
@comment:用户组的注释
@implied_ids:基于哪个用户组,这个层级关系
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
是最基础的用户名,最初是基于这个,后面一层一层递增,例如 base.group_hr_user 定义时就是基于最基础
@users:预设用户属于这个用户组
权限组
权限管理核心是权限组,每个权限组,可以设置权限组的Menus, Access Right, Record Rule
#Menus:
定义该权限组可以访问哪些菜单,若该权限组可以访问某父菜单,父菜单对应的子菜单会显示出来,若不想显示其子菜单,可以把其子菜单加入一个空的权限组
#Access Right:
定义该权限组可以访问哪些对象,以及拥有 增、删、查、改的哪个权限(create, read, write, unlink)
#Record Rule:
定义该权限组可以访问对象中的哪些记录,以及拥有 增、删、查、改的哪个权限,Access Right 是对对象中的所有记录赋权限,Record Rule 则通过定义domain过滤指定某些记录赋权限
['&',('department','=',user.context_department_id.id),('state','=','pr_draft')]
申购单的部门等于当前用户的部门,且申购单的状态是草稿状态
基于组的访问控制
#视图中
运用group_id
1 <record id="view_form_manage_list" model="ir.ui.view"> 2 <field name="name">yati.form.manage</field> 3 <field name="model">yati.tdm</field> 4 <field name="inherit_id" ref="yati.view_apply_inspection_backend"/> 5 <field name="group_id" eval="[(6,0,[ref('yati.employee),ref('yati.manage')])]" 6 /> 7 8 </record>
eval:把eval的值通过作为python运算返回该属性
ref:视图的方法,根据 module_name.xml_id 返回数据库id
[(6,0,[xx,yy])]
(0,_,{'field': value}) 这将创建一个新的记录并连接它
(1,id,{'field': value}) 这是更行一个已经连接了的记录的值
(2,id,_) 这是删除或取消连接某个已经连接了的记录
(3,id,_) 这是取消连接但不删除一个已经连接了的记录
(4,id,_) 连接一个已经存在的记录
(5,_,_) 取消连接但不删除所有已经连接了的记录
(6,_,[ids]) 用给出的列表替换掉已经连接了的记录
这里的下划线一般是0或False
运用groups
<button name="invoice_pay_customer" type="object" string="Register Payment" attrs="{'invisible': ['|', ('state','!=','open'),('sent','=',True)]}" groups="base.group_user"/>
<field name="invoice_line_ids" groups="account.group_account_invoice"/>
<menuitem name="China Account" id="menu_china_account" parent="account.menu_finance" sequence="4" groups="account.group_account_user"/>
#在模型中
package_id = fields.Many2one(comodel_name='stock.quant.package', string='package', related='quant.package_id', readonly=True, groups="stock.group_tracking_lot")
如果有多个用户组,用户组之间用逗号隔开
#小结
只有在视图中有完整标签时,会用group_id,其他都用groups