Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

关于联系人权限的新手问题,还请各位大大不吝赐教。



  • 各位大大,
    先说下我所使用的程序是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_uidres.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)]
    

    大致思路就是这样,祝编程愉快 😜



  • 首先要找到 联系人的模型 res_partner。
    找到记录规则中销售员所属用户组。
    给销售员所在的用户组价格限制 联系人创建者的id是当前用户的id
    [('create_uid','=',user.id)]。需要注意的事项是 高权限会覆盖低权限。


  • 管理员

    上面@元宝 的思路是正确的。我再补充一点,供你参考。

    记录规则实际上就是对一个对象的记录集的过滤规则,就是要对对象设置合适的domain。
    比如,我们要设置销售只能看到自己创建的客户。这个需求的实现思路是:

    当我们创建一个客户资料时,系统会把当前创建者的id记录到这个记录的create_uid

    所以我们可以对res.partner对象设置记录规则:

    [('create_uid', '=', user.id)]
    

    这里create_uidres.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)]
    

    大致思路就是这样,祝编程愉快 😜



  • 谢谢各位大大的不吝赐教!

    此问题已经解决。
    解决过程是这样的,在另外一个群内询问后得到启示:规则一般是没问题的,但多条规则可能会互相影响。
    于是从记录规则处,所有与联系人相关的规则一个个排查,依次停用,并查看。
    最后发现一条: res.partner.rule.private.employee ,停用后,之前规则生效。
    再排查此条规则,规则作用群组是所有内部用户,修改为销售/用户:所有文档 群组之后,问题解决。

    再次感谢回复的各位大大!谢谢你们的热心鼓励!


Log in to reply