关于联系人权限的新手问题,还请各位大大不吝赐教。
-
各位大大,
先说下我所使用的程序是odoo13,用的是Windows 10 绿色版本。在设定的时候希望销售员只能看到他自己创建的客户,而其经理则可以看到所有业务员创建的客户信息
在网络和本论坛上找寻了很久,也没有看到合适的答案。
在一篇指导中,说到 使用OpenERP(是的,文章很老,还是Open ERP 不是Odoo)的“记录规则”来定制记录级别的访问控制。在记录规则中的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。
比如,我们要设置销售只能看到自己创建的客户。这个需求的实现思路是:当我们创建一个客户资料时,系统会把当前创建者的id记录到这个记录的
create_uid
所以我们可以对
res.partner
对象设置记录规则:[('create_uid', '=', user.id)]
这里
create_uid
是res.partner
上面的一个字段记录着当前partner的创建者,右边这个user
就是当前登录用户,所以如果它们匹配了,就显示出来。( 当然这里更合理的方式是不要用partner上面的create_uid
而是用user_id
, 这里的user_id
在界面上对应的就是"Sales Person"(销售员)。这样的话,经理可能创建了这个客户,但是他把这个客户分配给一个指定的销售员。)但是 如果仅仅以上这样设置,你可能直接就登录不了系统了。
因为你这个当前用户本身也是一个partner,如果你这个用户不是自己创建的,那么按照上面的规则,你看不到你自己,这样就造成了权限混乱,所以要把这种情况考虑进去:['|', ('create_uid', '=', user.id), ('user_ids', 'in', user.id)]
上面这种写法中的
'|'
表示后面两个domain的关系是或
, 默认情况下(不加前置的'|'
)是与
而这里的
user_ids
也是Partner对象上的,res.users
对象是多继承res.partner
对象的。所以理论上一个partner对应多个用户,上面这个domain意思就是当前的partner对应当前用户。至于经理可以看见所有的客户,我们可以为经理用户组定义一个无限制domain
[(1, '=', 1)]
上面的过滤条件永远成立,所以所有记录都可以看到。
当然上面只是一个简单的思路,如果你还有更复杂的要求,比如有几个销售经理,不同销售对应不同销售经理,销售经理可以查看汇报给他的所有销售的客户,而不能看到其他销售经理负责的销售。或者我们可能会用到销售团队的概念。
方法是类似的,仍然是从当前的对象上的字段出发, 比如manager的概念是在
employee
上的。那么我们如何才能找到比如当前客户所属的销售员(对应user_id
字段)的manager呢?user_id.employee_id
就是销售员对应的员工,- 然后员工对象上就有manager了,
user_id.employee_id.parent_id
, - 找到了这个销售的manager还不行,因为我们要跟当前用户(
user.id
)来比较,而上面的manager还是hr.employee
对象,所以好要再找到这个manager对应的用户id:user_id.employee_id.parent_id.user_id
然后就可以写domain了:
[('user_id.employee_id.parent_id.user_id', '=', user.id)]
大致思路就是这样,祝编程愉快 :face_with_stuck-out_tongue_winking_eye:
-
上面@元宝 的思路是正确的。我再补充一点,供你参考。
记录规则实际上就是对一个对象的记录集的过滤规则,就是要对对象设置合适的domain。
比如,我们要设置销售只能看到自己创建的客户。这个需求的实现思路是:当我们创建一个客户资料时,系统会把当前创建者的id记录到这个记录的
create_uid
所以我们可以对
res.partner
对象设置记录规则:[('create_uid', '=', user.id)]
这里
create_uid
是res.partner
上面的一个字段记录着当前partner的创建者,右边这个user
就是当前登录用户,所以如果它们匹配了,就显示出来。( 当然这里更合理的方式是不要用partner上面的create_uid
而是用user_id
, 这里的user_id
在界面上对应的就是"Sales Person"(销售员)。这样的话,经理可能创建了这个客户,但是他把这个客户分配给一个指定的销售员。)但是 如果仅仅以上这样设置,你可能直接就登录不了系统了。
因为你这个当前用户本身也是一个partner,如果你这个用户不是自己创建的,那么按照上面的规则,你看不到你自己,这样就造成了权限混乱,所以要把这种情况考虑进去:['|', ('create_uid', '=', user.id), ('user_ids', 'in', user.id)]
上面这种写法中的
'|'
表示后面两个domain的关系是或
, 默认情况下(不加前置的'|'
)是与
而这里的
user_ids
也是Partner对象上的,res.users
对象是多继承res.partner
对象的。所以理论上一个partner对应多个用户,上面这个domain意思就是当前的partner对应当前用户。至于经理可以看见所有的客户,我们可以为经理用户组定义一个无限制domain
[(1, '=', 1)]
上面的过滤条件永远成立,所以所有记录都可以看到。
当然上面只是一个简单的思路,如果你还有更复杂的要求,比如有几个销售经理,不同销售对应不同销售经理,销售经理可以查看汇报给他的所有销售的客户,而不能看到其他销售经理负责的销售。或者我们可能会用到销售团队的概念。
方法是类似的,仍然是从当前的对象上的字段出发, 比如manager的概念是在
employee
上的。那么我们如何才能找到比如当前客户所属的销售员(对应user_id
字段)的manager呢?user_id.employee_id
就是销售员对应的员工,- 然后员工对象上就有manager了,
user_id.employee_id.parent_id
, - 找到了这个销售的manager还不行,因为我们要跟当前用户(
user.id
)来比较,而上面的manager还是hr.employee
对象,所以好要再找到这个manager对应的用户id:user_id.employee_id.parent_id.user_id
然后就可以写domain了:
[('user_id.employee_id.parent_id.user_id', '=', user.id)]
大致思路就是这样,祝编程愉快 :face_with_stuck-out_tongue_winking_eye: