• 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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 中文社区

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

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

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

    记录规则实际上就是对一个对象的记录集的过滤规则,就是要对对象设置合适的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
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。