澳门新葡亰娱乐官网odoo权限机制

帝国CMS会员中心允许会员投稿,不同的会员组有不同的投稿权限,但往往没有权限的会员组也能看到投稿入口,点击又不能投稿,所以希望实现,会员中心菜单仅显示对本会员组有作用的菜单项目。

记录规则 – 销售只能看到自己的客户,经理可以看到全部

原文地址:

*权限管理的四个层次

比如:

OpenERP中的权限管理有四个层次:

  • 菜单级别: 即,不属于指定菜单所包含组的用户看不到该菜单。不安全,只是隐藏菜单,若用户知道菜单ID,仍然可以通过指定URL访问
  • 对象级别: 即,对某个对象是否有‘创建,读取,修改,删除“的权限。OE中的对象可以简单理解为表对象,比如“客户”,“产品”,“销售订单”等都是对象
  • 记录级别: 即,对对象表中的数据的访问权限。比如同样访问“客户”对象,业务员只能对自己创建的客户有访问的权限,而经理可以访问其所辖的业务员的所有“客户”对象,这里的访问也可以进一步明细到“创建,读取,修改,删除”的权限
  • 字段级别: 即,一个对象或表上的某些字段的访问权限。比如产品的成本字段只有经理有读权限,比如订单上的单价字段只有经理才有修改的权限等。

在实际的培训和实施过程中,我们发现客户往往会提出很多记录级别的访问规则要求。最经典的就是:“我希望销售员只能看到他自己创建的客户,而其经理则可以看到所有业务员创建的客户信息”, 本文就是以这个需求为蓝本来介绍如何使用OpenERP的“记录规则”来定制记录级别的访问控制。

 

# 菜单级别:不属于指定菜单所包含组的用户看不到该菜单,不客全,只是隐藏

会员组ID=1的会员可以看到

测试环境创建:

  • 创建三个用户,分别是manager, sale1, sale2。
    manager的“销售”应用的访问权限为:查看所有线索; 而sale1和sale2两个业务员的访问权限为:查看自己的线索,
    这两个不同的权限实际上对应两个不同的澳门新葡亰娱乐官网 ,:See Own Leads
    (group_sale_salesman), 和 See All Leads
    (group_sale_salesman_all_leads)
    澳门新葡亰娱乐官网 1
  • 创建两个公司,分别为Company ABC 和Company XYZ,
    每个公司下分别有两个联系人ABC Contact 1, ABC Contact 2, XYZ Contact
    1, XYZ Contact 2

  • 澳门新葡亰娱乐官网 2
    澳门新葡亰娱乐官网 3澳门新葡亰娱乐官网 4
  • 注意在创建的公司或联系人表单的“销售与采购”页签中有销售员选项,我们就是用这个字段(user_id)来过滤记录,该字段的默认值为空。若希望改变该字段默认值为创建用户的ID,只需改变一行代码即可实现,以后再做介绍。

菜单,若知道菜单ID,仍然可以通过指定URL访问

“发布新闻”

记录规则设置:

我们在做好了以上基本设置以后,可以尝试用前面定义的三个不同用户分别登录系统,并且为客户设置不同的销售员,在目前情况下,三个用户看到的客户记录完全一样,这是因为我们还没有为客户对象设置需要的记录规则

创建记录规则,需要有“技术特性”(Technical
Features)权限,在做以下操作前先给予Administrator
用户该权限。并刷新页面。

点击设置->技术->安全设定->记录规则 菜单项,对于本文之要求我们实际只需创建两条记录规则分别适用‘See
Own Leads”组和”See All
Leads”组,这样销售和业务员登录后就可以按要求看到不同的客户信息了。

以下是设置好的结果,大家可以利用之前测试环境来验证以下的设置。我们在后面对这个设置做一些解释:

See Own Leads组的记录规则

澳门新葡亰娱乐官网 5

Sell All Leads 组的记录规则

澳门新葡亰娱乐官网 6

我们首先来看适用于“查看自己线索”(See Own
Leads)组的记录规则中的Domain设置:

['|', '|', '|', ('user_id','=',user.id), '&', ('user_id','=', False),('parent_id.user_id', '=', user.id), '&', ('user_id', '=', False), ('parent_id.user_id', '=', False), '&', ('user_id', '=', False), ('parent_id', '=', False)]

Domain实际上就是一个或多个过滤条件的组合,对于上例,实际上四条过滤条件的并集(求或),即:

user_id == user.id ?

这种情况最容易理解,左边的user_id是客户(合作伙伴)对象上的“销售员”字段的内部名称,右边的user表示当前登录用户。整个记录表示,客户的销售员的id如果与登录用户的id相同即满足条件。这个条件的满足,表示业务员能看到属于自己的客户(即客户上的销售员指定为自己的客户)

或者

user_id == False 并且 parent_id.user_id == user.id ?

此条规则以及下面两条规则,都是考虑了因为有客户可以有“公司”和下属“联系人”两层关系的情况。此条规则表示:当前的客户的销售员未定义(False),但是其父亲parent_id(即该联系人所属公司)上的销售员与当前登录用户相符时成立。

或者

user_id == False 并且 parent_id.user_id == False ?

当当前访问的联系人及其所属公司都没有设置销售员信息时,当前用户可访问该记录

或者

user_id == False 并且 parent_id == False?

当当前访问的公司(parent_id ==
False),没有设置销售员时,当前用户可访问该记录

对于“访问所有线索”组,我们只有一条简单的记录:

[(1, '=', 1)]

这是因为,“访问所有线索”组继承自“访问自己线索”组,默认适用于“访问自己线索”组的记录规则也适用于“访问所有线索”组,以上的记录规则永远为真,从而绕过了”访问自己线索“组的过滤条件。

 
澳门新葡亰娱乐官网 7

好了,我们已经了解如何通过记录规则来实现“业务员能看到自己的客户,而经理可以看到全部客户”这样的简单要求。事实上,我们还可以利用记录规则中对于“创建”,“读取”,
“修改”,“删除”权限的控制来实现,例如“销售员可以编辑修改自己客户,但对不属于自己的客户仅有查看权限,经理可以查看,编辑,删除所有的客户“这样的类似的稍微变化的需求。自己动手试试看。对于Domain的编写方式在以后我们会另文介绍,敬请期待。

#
对象级别:对某个对角是否有’创建,读取,修改,删除’的权限,可以简单理解为

“查看订单”

表对象

两个菜单

#
记录级别:对对象表中的数据的访问权限,比如访问“客户”对象,业务员只能对自己创建

而会员ID=2的会员登录则看不到,但可以看到ID=1的看不到的

的客户有访问权限,而经理可以访问其管辖的业务员所有的“客户”对象

“发布商品”

#
字段级别:一个对象或表上的某些字段的访问权限,比如产品的成本字段只有经理有读权限

这个菜单

‘name’:fields.char(‘Name’,size=128,required=True,select=True,write=[‘base.group_admin’]

代码:

read=[‘base.group_admin’])

?phpif($tmgetgroupid==1)//会员组ID=1{?这里是会员组ID=1可以看到的菜单项。?php}?

?phpif($tmgetgroupid==2)//会员组ID=2{?这里是会员组ID=2可以看到的菜单项。?php}?

?phpif($tmgetgroupid1)//游客{?这里是游客可以看到的菜单项?php}?

定义name字段只能超级用户组可读写

比如,会员中心左边菜单修改文件:e/template/incfile/header.php

* 建立权限组

这是我们常说的用户组,会通常放在“模块名_security.xml”这个文件中

例如:

Manager

the user will have an access to the human resources configuration as
well as statistic reports.

@name:用户组名,这个或以翻译的

@comment:用户组的注释

@category_id 用户组所属的模块名

@implied_ids 基于哪个用户组,这个层级关系 是最基础的

用户名,最初是基于这个,后面一层一层递增,像上面 base.group_hr_user
定义时就是基于最基础

@users 预设用户属于这个用户组

* 权限组

权限管理核心是权限组,每个权限组,可以设置权限组的 Menus,Access Right,
Record Rule

# Menus:

定义该权限组可以访问哪些菜单,若该权限组可以访问某父菜单,父菜单对应的子菜单会显示出来

若不想显示其子菜单,可以把其子菜单加入 “Useablity/No One” 权限组。

# Access Right:

定义该权限组可以访问哪些对象,以及拥有 增、查、改、删的哪个权限   
(create,read,write,unlink)

# Record Rule:

定义该权限组可以访问对象中的哪些记录,以及拥有
增、查、改、删的哪个权限    ,Access Right是

对对象中的所有记录赋权限,Record Rule
则通过定义domain过滤指定某些记录赋权限

[‘&’,(‘department’,’=’,user.context_department_id.id),(‘state’,’=’,’pr_draft’)]

申购单的部门等于当前用户的部门,且申购单的状态是草稿状态

* 基于组的访问控制

# 视图中

运用group_id

sale.order.form.editable.list

sale.order

ref(‘product.group_stock_packaging’),

ref(‘sale.group_mrp_properties’)])]” />

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

attrs=”{‘invisible’: [‘|’, (‘state’,’!=’,’open’), (‘sent’,’=’,True)]}”
groups=”base.group_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

*访问权限管理:

对于其内的数据访问权限管理有两种机制:

第一种是模型访问权限管理 (accessrule);

第二种是记录规则管理 (record rule)。

record rule 是对accessrule的细化 ,带条件,比如记录是什么状态的可以访问

如果不为模块设置规则,默认只有Administator才能访问这个模型的数据

record rule 对 Administator 用户是无效的,而access rule还是有效

# access rule

权限对象模型是 ir.model.access.csv

一般是放在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_payment_notice_account_user,payment.notice.account.user,model_payment_notice,account.group_account_user,1,1,1,1

access_payment_notice_sale_user,payment.notice.sale.user,model_payment_notice,base.group_sale_salesman,1,1,0,0

分析这个是针对 payment.notice 这个模型做访问权限设置

可以看一下对应模型定义的代码:

class PaymentNotice(models.Model):

_name = “payment.notice”

id:权限的ID不可重复 一般取名为
access_模型名_特定用户组名(用下划线连起来)

name 描述 一般命名沿用模型名用“.”连接加 用户组名

model_id:id:对象,命名是model_模型名(用下划线连起来)

group_id:id  组名称 (模块.用户组名)

下面的,0 表示无权限, 1 表示有权限

perm_read  只读

perm_write 修改

perm_create 创建

perm_unlink 删除

# record rule

一般是放在security 文件夹下的 模块名_record_rules.xml 文件来管理的

对于模型权限的补充

Personal Payment Notice

[‘|’,(‘claimed_user_id’,’=’,user.id),(‘claimed_user_id’,’=’,False)]

All Payment Notice

[(1,’=’,1)]

record rule    记录是 ir.rule 模型, 存在public.ir_rule 表格中

model_id 作用于哪个模型 值为 model_模型名

domain_force 对该模型中所有记录进行某种过滤操作

常用的 [‘|’,(‘user_id’,’=’,user.id),(‘user_id’,’=’,False)]
表示是自己的单

user_id是记录的字段,这个看实际情况改变, user.id 代表当前登录用户的id

[(1,’=’,1)] 表示所有的单

noupdate 值为1 表示升级模块不会更新本数据

base.group_user 是人力资源 / 雇员

perm_read 这些后面,是对 前面模型权限组设定的覆盖

* 来一个完整的例子解说:

# 建立组

A

//把admin用户加入该组中

@ name 组名称

@ category_id 属于哪个应用程序,或者哪个模块,为了方便管理

@ users 组里面的用户

这样B应用程序就建立了一个名叫A的组。并且初始化了A组的一个用户admin

# 组控制菜单显示

A

menu1

1

@ name 菜单名称

@ groups_id 哪些组可以访问该菜单

@ sequence 该菜单的序号

这样A组与B组的成员都可以访问menu1菜单,menu1菜单的显示顺序为1

注:eval 后面解释,多个组访问用“,”隔开

@ name 菜单名称

@ parent 父类菜单 如果没有可以不写parent

@ groups哪些组可以访问该菜单

这样menu1的子菜单menu2可以被A组合B组的成员访问

# 权限规则

rule1

[1,’=’,1]

@ 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删除原来的记录。

# 隐藏的常用技巧

* 直接隐藏

True

* 满足某些条件的隐藏

{‘invisible’: [(‘passenger’,’=’, True)]}

* 通过组来隐藏

base.group_no_one

* 菜单的隐藏

* 代码分析中的运用

#字段显示权限

#在model中判断

self.pool.get(‘res.users’).has_group(cr, uid,
‘sale.group_discount_per_so_line’)

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图