其实简单的理解就是
对于数据表Table A
用户能不能看见这个表的内容(字段及数据),就是表级权限
用户能不能看见表A的某行(数据),就是行级权限(记录及权限)
用户是否能看见表A的字段(列),就是字段及权限
对于odoo的菜单,用户是否可见,就是菜单级权限
版本:odoo8
(python 2.7环境)
python ./odoo.py scaffold academy ./openerp/addons_test切换用户到开发者模式
右上角用户,点击关于,页面右上角“激活开发者模式”
更新模块列表
Settings->Modules->Update Modules List
安装模块
Settings->右上角搜索模块名
academy/models.py
class Teachers(models.Model):
_name = 'academy.teachers'
name = fields.Char('Teacher Name')
biography = fields.Html()
user_id = fields.Many2one('res.users', string="User", ondelete='cascade', required="true")
class Courses(models.Model):
_name = 'academy.courses'
name = fields.Char()
teacher_id = fields.Many2one('academy.teachers', string="Teacher")
course_ids = fields.One2many('academy.courses', 'teacher_id', string="Courses")
给两个表添加基本的视图以及新建两个菜单
academy/views.xml
Academy teachers
academy.teachers
Academy teachers: tree
academy.teachers
Academy teachers: form
academy.teachers
Academy courses
academy.courses
Academy courses: search
academy.courses
Academy courses: list
academy.courses
Academy courses: form
academy.courses
表级的权限控制文件在academy/security/ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,0,0,0
如上的group_id没有加,就是对所有组公开了teacher表的读取权限,重启odoo并升级(admin),切换用户(非admin),可看到效果页面:
可以看到该用户对teacher仅有读取权,但添加、修改、删除不能操作。
比如访问“客户”对象,业务员只能对自己创建的客户有访问权限,而经理可以访问其管辖的业务员所有的“客户”对象。在ir.rule模型中定义规则,存储在public.ir_rule表格里面。
新建规则文件security/academy_record_rules.xml,并注册到__openerp__.py的data的属性中。
security/academy_record_rules.xml
Academy only for owner
[('create_uid','=',user.id)]
name 规则名称
groups 属于哪个组base.group_user是所有组,可以不写
security/ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,1,1,1
access_academy_courses,access_academy_courses,model_academy_courses,,1,0,0,0
先开放teacher模块对所有组的所有权限,重启Odoo并升级academy,登陆非admin用户,可以看到teacher可新建,并只能看见自己创建的数据。
(4,ID)添加主从链接关系到id=ID的对象。
(3,ID)去除和id=ID的对象主从链接关系,但是不删除这个对象
(2,ID) 去除和id=ID的对象主从链接关系,并且删除这个对象(调用unlink方法)
(5) 去除所有的链接关系,也就是循环所有的从数据且调用(3,ID)
(6,0,[IDs]) 用IDs里面的记录替换原来链接的记录,即先执行(5)再循环IDs执行(4,ID)
security/academy_groups.xml
academy test
Academy teachers group
the comment of the group.
Academy managers group
the comment of the group.
首先定义了分组category,然后定义了两个组属于同一分组(也可以不写分组)。
name 组名
comment 组的注释
category_id 所属于哪个模块
users 预定义属于该组的用户
implied_ids
在demo.xml中添加两条记录,创建两个用户
demo.xml
teacherA
[email protected]
academy
teacherB
[email protected]
academy
TeacherA
[email protected]
TeacherB
[email protected]
登陆admin给teacherA添加到academy_teachers_group组,设置->用户 找到teacherA编辑,会看到权限多了分组,勾选Academy teachers group。
给字段添加组权限有两个地方
在视图中给field加groups属性
academy/views.xml
Academy teachers: tree
academy.teachers
或者在字段定义的地方加groups属性
academy/models.py
class Teachers(models.Model):
_name = 'academy.teachers'
name = fields.Char('Teacher Name')
biography = fields.Html()
user_id = fields.Many2one('res.users', string="User", ondelete='cascade', required="true")
show_group_teacher = fields.Char('Show For Teacher', groups="academy.academy_teachers_group")
重启odoo并升级academy,可以登陆TeacherA和TeacherB查看效果。
academy/views.xml
重启odoo并升级academy,可以登陆TeacherA和TeacherB查看效果。