From 8f88307c18b47f098b5f41d9072f343fbee3fe9e Mon Sep 17 00:00:00 2001 From: Munaf Khan Date: Fri, 26 Feb 2021 04:46:57 +0000 Subject: [PATCH] [FX][FIX] crm: prevent email_from propagation if only formatting differs Before this commit when we update the email_from field on lead with only formatting differing from partner a warning ribbon was displayed. It considered email had changed and had to be propagated. Moreover unnecessary update on partner was done to propagate the new email onto the customer. In this commit we propagate email only if normalized versions are different. It means that if lead email_from is "Hermes Conrad " and partner email is "Jonathan Conrad no update from lead to partner is performed. Indeed normalized versions are the same. Task ID-2461308 PR odoo/odoo#66890 X-Original-Commit odoo/odoo@3dd972c35bb899e1830fc23fdab7bbf654c97201 closes odoo/odoo#67859 Related: odoo/enterprise#17191 Signed-off-by: Thibault Delavallee (tde) --- addons/crm/models/crm_lead.py | 18 ++++++++++++++++-- addons/crm/tests/test_crm_lead.py | 14 ++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index cf8f64228f3..dc95c6a3f62 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -417,7 +417,15 @@ class Lead(models.Model): def _inverse_email_from(self): for lead in self: if lead.partner_id and lead.email_from != lead.partner_id.email: - lead.partner_id.email = lead.email_from + # force reset + if not lead.email_from or not lead.partner_id.email: + lead.partner_id.email = lead.email_from + # compare formatted values as we may have formatting differences between equivalent email + else: + lead_email_normalized = tools.email_normalize(lead.email_from) + partner_email_normalized = tools.email_normalize(lead.partner_id.email) + if lead_email_normalized != partner_email_normalized: + lead.partner_id.email = lead.email_from @api.depends('partner_id.phone') def _compute_phone(self): @@ -576,7 +584,13 @@ class Lead(models.Model): @api.depends('email_from', 'partner_id') def _compute_partner_email_update(self): for lead in self: - lead.partner_email_update = lead.partner_id and lead.email_from != lead.partner_id.email + will_write_email = False + if lead.partner_id: + # beware: void user input gives '' which is different from False + lead_email_normalized = tools.email_normalize(lead.email_from) or (lead.email_from if lead.email_from else False) + partner_email_normalized = tools.email_normalize(lead.partner_id.email) or lead.partner_id.email + will_write_email = lead_email_normalized != partner_email_normalized if lead.partner_id else False + lead.partner_email_update = will_write_email @api.depends('phone', 'partner_id') def _compute_partner_phone_update(self): diff --git a/addons/crm/tests/test_crm_lead.py b/addons/crm/tests/test_crm_lead.py index 667a1a6db16..d550eb157a3 100644 --- a/addons/crm/tests/test_crm_lead.py +++ b/addons/crm/tests/test_crm_lead.py @@ -278,6 +278,20 @@ class TestCRMLead(TestCrmCommon): self.assertEqual(lead.phone_sanitized, partner_mobile_sanitized, 'Lead: phone_sanitized computed field on mobile') + # for email_from, if only formatting differs, warning should not appear and + # email on partner should not be updated + lead_form.email_from = '"Hermes Conrad" <%s>' % partner_email_normalized + self.assertFalse(lead_form.partner_email_update) + lead_form.save() + self.assertEqual(partner.email, partner_email) + + # for phone, if only formatting differs, warning should not appear and + # phone on partner should not be updated + lead_form.phone = partner_phone_sanitized + self.assertFalse(lead_form.partner_phone_update) + lead_form.save() + self.assertEqual(partner.phone, partner_phone) + # LEAD/PARTNER SYNC: lead updates partner new_email = '"John Zoidberg" ' new_email_normalized = 'john.zoidberg@test.example.com'