Odoo Commit 每日一读/3 - 3b43dd

今天我们来介绍下odoo10代码中11月7日的提交3b43dd。

改进结果

这个提交是对销售线索中的复制方法进行了修改.

     @api.multi
    def copy(self, default=None):
        self.ensure_one()
        # set default value in context, if not already set (Put stage to 'new' stage)
        context = dict(self._context)
        context.setdefault('default_type', self.type)
        context.setdefault('default_team_id', self.team_id.id)
        # Set date_open to today if it is an opp
        default = default or {}
        default['date_open'] = fields.Datetime.now() if self.type == 'opportunity' else False
        # +++++++++++++++++
        # Do not assign to an archived user
        if not self.user_id.active:
            default['user_id'] = False
        # ++++++++++++++++++
        return super(Lead, self.with_context(context)).copy(default=default)

3b43dd新增代码用+++++包裹.查看新增的代码,我们发现在新的copy方法中.对销售线索的user_id 进行了判断,若当前销售线索中的用户已经不存在了.在复制的过程中就把user_id字段设为False.

为何要进行这个修改

我们知道,公司中的人员会时常发生变动,举个例子,公司中原有一个员工A ,在一个销售线索中(crm.lead) 我们指定销售员为A.

但是某些突发原因,A离职并交付了工作。于是人事把A员工的odoo账号归档。

现在,在创建新的销售线索时user_id (视图中显示为销售员)字段不会出现A员工的选项。

但是,当我们复制以前的指派A为销售员的销售线索时,我们会发现user_id字段的默认值还是A. 而且A的邮箱会收到新消息提醒信件,这会泄露公司的敏感数据.

bug重现

  • 创建用户A

    image.png

  • 创建新的销售线索marry要买iphone,指定销售员为A。点击保存

    image.png

  • 进入用户管理,把A用户设置为active字段设为False

    image.png

  • 在创建新销售线索中,销售员选项中已经没有A员工。

    image.png

  • 此时,我们对刚才的marry要买iphone销售线索进行复制。这时,我们的A用户的邮箱就收取到odoo的发送的信件。查看下方message 组件,账号已经注销的A被添加在message组中。

    image.png

  • 如果关注者较多,没有发现这个问题,那每次对销售线索的新建消息都会被同时发送到已经离职的A员工的邮箱中。这就造成了数据泄露

    image.png image.png

原始提交信息

Commit:     Nicolas Martinelli <[email protected]>
CommitDate: Tue Nov 7 14:47:31 2017 +0100

    [FIX] crm: default user when copy

    - Create a user A
    - Create a lead, assign to A
    - Deactivate user A
    - Duplicate the lead

    A notification email is sent to A (user assigned to the lead).

    Since the user is archived, he should not receive any email since it
    might contain sensitive information.

    opw-778825
---
 addons/crm/models/crm_lead.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py
index 879350c..f23d538 100644
--- a/addons/crm/models/crm_lead.py
+++ b/addons/crm/models/crm_lead.py
@@ -336,6 +336,9 @@ class Lead(FormatAddress, models.Model):
         # Set date_open to today if it is an opp
         default = default or {}
         default['date_open'] = fields.Datetime.now() if self.type == 'opportunity' else False
+        # Do not assign to an archived user
+        if not self.user_id.active:
+            default['user_id'] = False
         return super(Lead, self.with_context(context)).copy(default=default)

由此可见,3b43dd这个提交对复制后的销售线索的默认值进行了验证更新,剔除了被归档的用户。避免了敏感数据的泄露