跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 新手求助
  4. 关于联系人权限的新手问题,还请各位大大不吝赐教。

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

已定时 已固定 已锁定 已移动 已解决 Odoo 新手求助
4 帖子 3 发布者 1.2k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 犟 离线
    犟 离线
    犟爆骨头
    写于 最后由 编辑
    #1

    各位大大,
    先说下我所使用的程序是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
    • digitalsatoriD 离线
      digitalsatoriD 离线
      digitalsatori 管理员
      写于 最后由 digitalsatori 编辑
      #3

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

      记录规则实际上就是对一个对象的记录集的过滤规则,就是要对对象设置合适的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
      • 元 离线
        元 离线
        元宝
        写于 最后由 编辑
        #2

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

        1 条回复 最后回复
        0
        • digitalsatoriD 离线
          digitalsatoriD 离线
          digitalsatori 管理员
          写于 最后由 digitalsatori 编辑
          #3

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

          记录规则实际上就是对一个对象的记录集的过滤规则,就是要对对象设置合适的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
          • 犟 离线
            犟 离线
            犟爆骨头
            写于 最后由 编辑
            #4

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

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

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

            1 条回复 最后回复
            0

            • 登录

            • 没有帐号? 注册

            • 登录或注册以进行搜索。
            • 第一个帖子
              最后一个帖子
            0
            • 版块
            • 标签
            • 热门
            • 用户
            • 群组