慎重
联系人是odoo中的重要基础概念,是多个功能相关,设置不好容易影像别的功能,所以本次修改本着最小改动原则: 能不改就不改.
实践发现:给与会计管理员会自动赋予访问私有地址的权限
- 联系人VS联系人:
- 多对一 父联系人
- 一对多 子联系人
- 多对一 商业伙伴
- 多对一 相同增值税号的联系人
- 联系人VS用户(用户继承了联系人,你也可以将其看作联系人)
- 多对一: 销售员(负责联系的内部人员)
- 一对多:用户
联系人类型:
- 联系人
- 结算单地址
- 送货地址
- 其他
- 家庭住址
需求:
销售员自己能看到自己的联系人, 经理能看到所有联系人
现状:
查看addons/base/security/base_security.xml
<record model="ir.rule" id="res_partner_rule">
<field name="name">res.partner company</field>
<field name="model_id" ref="base.model_res_partner"/>
<!-- We exclude partners that have internal users (`partner_share` field) from
the multi-company rule because it might interfere with the user's company rule
and make some users unselectable in relational fields. This means that partners
of internal users are always visible, not matter the company setting. -->
<field name="domain_force">['|', '|', ('partner_share', '=', False), ('company_id', 'in', company_ids), ('company_id', '=', False)]</field>
</record>
以上说明: 全局规则,只授权自己公司下的联系人
<record model="ir.rule" id="res_partner_portal_public_rule">
<field name="name">res_partner: portal/public: read access on my commercial partner</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="domain_force">[('id', 'child_of', user.commercial_partner_id.id)]</field>
<field name="groups" eval="[(4, ref('base.group_portal')), (4, ref('base.group_public'))]"/>
<field name="perm_create" eval="False"/>
<field name="perm_unlink" eval="False"/>
<field name="perm_write" eval="False"/>
</record>
以上说明: 对于门户用户和公共用户,只看自己商业伙伴
<!-- Security restriction for private addresses -->
<record id="res_partner_rule_private_employee" model="ir.rule">
<field name="name">res.partner.rule.private.employee</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="domain_force">
['|', ('type', '!=', 'private'), ('type', '=', False)]
</field>
<field name="groups" eval="[
(4, ref('base.group_user')),
]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
以上说明,对于内部用户,能看到所有非家庭住址的联系人.
我们现状和需求不匹配的原因就在这条,后续也要改这条
<!-- Relex previous rule for group_private_addresses -->
<record id="res_partner_rule_private_group" model="ir.rule">
<field name="name">res.partner.rule.private.group</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="domain_force">
[('type', '=', 'private')]
</field>
<field name="groups" eval="[
(4, ref('base.group_private_addresses'))
]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
以上说明: 对于group_private_addresses组的用户,能看到私有联系人.后差,交易管理员,会计管理员等少数管理员拥有该权限
方法
- 管理员登陆,点击设置
2. 基本设置,页面拉到最下面,激活开发者模式
- 系统动刷新页面后,技术->记录规则
- 搜索模型是联系人,找到下面这条,点进去,点击复制(我们尽量不改变原记录,在最后会将这条作废存档)
4, 将名称加一个2,将规则定义改成下面表达式,然后保存
['|', '|', ('create_uid', '=', user.id), ('user_ids', 'in', user.id), ('type', 'in', ('invoice', 'delivery', 'other'))]
上文释义:
用或的关系来连接下面三个条件
规则一:在内部用户权限下,只有创建者能看到自己的联系人
规则二:如果有关联用户有自己这条联系人,则能看到这条联系人(防止登录问题)
规则三: 如果遇到结算单地址, 发货地址, 其他地址(联系人),则通过校验(我们先期尽量少改动,以防止和交易/公司等相关的业务模块遇到问题)
5. 重复执行步骤3, 然后将名称改成res.partner.rule.selas.alldoc, 将群组修改成销售/用户: 所有文档. 然后保存
备注: 对于下拉框式样的权限选择器,下级自动包含上级的所有权限
- 重复执行步骤3, 但是不点击复制了,而是点击有效按钮, 让其失效(即存档,不发挥作用)
- 最终列表页面,使用联系人查询的结果应该是这样的
8. 执行步骤1的反向操作,关闭开发者模式
效果:
普通用户只能看到自己创建的联系人
如果被授予了 销售/用户: 所有文档 或者向上的权限,则能够看到所有联系人
遗憾:
当点击自己这个用户关联的联系人的时候,会出现下面保存,
这是因为自己的账号不是自己创建的(废话,当然是管理员创建的),
当加载管理员之类的联系人的时候,遇到了权限错误
但是实际应用中很少有人很无聊的去点击自己这个联系人,所以影像不大
风险:
配置数据规则的时候,有很大的风险让系统崩溃,所以任何改动应该在测试/开发环境先试验,以防止宕机