Odoo 中文社区

    • 注册
    • 登录
    • 搜索
    • 版块
    • 标签
    • 热门
    • 用户
    • 群组

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

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

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

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

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

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

    Odoo 新手求助
    3
    4
    552
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 犟
      犟爆骨头 最后由 编辑

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

      我尝试跟着添加记录规则设置,但并未达成目的。不知道是哪里出问题了。

      请教各位大大,需要怎样设置?才能达成我的目的呢?

      对大家的指导和不吝赐教先说一声感谢了!

      1 条回复 最后回复 回复 引用 0
      • digitalsatori
        digitalsatori 管理员 最后由 digitalsatori 编辑

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

        记录规则实际上就是对一个对象的记录集的过滤规则,就是要对对象设置合适的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:

        【上海先安科技】(tony AT openerp.cn)

        1 条回复 最后回复 回复 引用 0
        • 元
          元宝 最后由 编辑

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

          1 条回复 最后回复 回复 引用 0
          • digitalsatori
            digitalsatori 管理员 最后由 digitalsatori 编辑

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

            记录规则实际上就是对一个对象的记录集的过滤规则,就是要对对象设置合适的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:

            【上海先安科技】(tony AT openerp.cn)

            1 条回复 最后回复 回复 引用 0
            • 犟
              犟爆骨头 最后由 编辑

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

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

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

              1 条回复 最后回复 回复 引用 0
              • First post
                Last post