summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Francois <tfr@openerp.com>2020-07-16 13:43:07 +0000
committerThibault Delavallée <tde@odoo.com>2020-08-04 15:08:56 +0000
commite6cb48b7e41693066f5d9ad55c4535793977aea2 (patch)
tree8ba4dc8d7adf1f4dbf43726d7402de975df2484b
parent62355b6ad3e2af16efabe1c3ca2fb053a6084bc1 (diff)
[FIX] crm_lead: do not erase computed field based on partner
Issue: When you write partner_id = False on a lead it erase all the values computed based on the res.partner this lead to data loss during the conversion to opportunies by the lead assignation process Solution: Revert to v13.0 behavior, don't erase the value of the address, phone, email when the partner is set to False + Fix typo in method name X-original-commit: 21db6cf93fea7d07ec4a8655fc6030a177abc36f
-rw-r--r--addons/crm/models/crm_lead.py34
-rw-r--r--addons/crm/tests/test_crm_lead.py32
2 files changed, 44 insertions, 22 deletions
diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py
index d13a6648a8d..101d285a1d2 100644
--- a/addons/crm/models/crm_lead.py
+++ b/addons/crm/models/crm_lead.py
@@ -48,6 +48,19 @@ CRM_LEAD_FIELDS_TO_MERGE = [
'email_cc',
'website']
+PARTNER_FIELDS_TO_SYNC = [
+ 'title',
+ 'street',
+ 'street2',
+ 'city',
+ 'state_id',
+ 'country_id',
+ 'mobile',
+ 'zip',
+ 'function',
+ 'website',
+]
+
# Those values have been determined based on benchmark to minimise
# computation time, number of transaction and transaction time.
PLS_COMPUTE_BATCH_STEP = 50000 # odoo.models.PREFETCH_MAX = 1000 but larger cluster can speed up global computation
@@ -422,21 +435,12 @@ class Lead(models.Model):
partner_name = partner.parent_id.name
if not partner_name and partner.is_company:
partner_name = partner.name
-
- return {
- 'partner_name': partner_name,
- 'contact_name': partner.name if not partner.is_company else False,
- 'title': partner.title.id,
- 'street': partner.street,
- 'street2': partner.street2,
- 'city': partner.city,
- 'state_id': partner.state_id.id,
- 'country_id': partner.country_id.id,
- 'mobile': partner.mobile,
- 'zip': partner.zip,
- 'function': partner.function,
- 'website': partner.website,
- }
+ values = {f: partner[f] or self[f] for f in PARTNER_FIELDS_TO_SYNC}
+ values.update({
+ 'partner_name': partner_name or self.partner_name,
+ 'contact_name': False if partner.is_company else partner.name or self.contact_name,
+ })
+ return values
# ------------------------------------------------------------
# ORM
diff --git a/addons/crm/tests/test_crm_lead.py b/addons/crm/tests/test_crm_lead.py
index 8473ed4a555..d55e42c2748 100644
--- a/addons/crm/tests/test_crm_lead.py
+++ b/addons/crm/tests/test_crm_lead.py
@@ -23,13 +23,31 @@ class TestCRMLead(TestCrmCommon):
# update to a partner, should udpate address
lead.write({'partner_id': self.contact_1.id})
- # self.assertEqual(lead.partner_name, self.contact_company_1.name)
- # self.assertEqual(lead.contact_name, self.contact_1.name)
- # self.assertEqual(lead.email_from, self.contact_1.email)
- # self.assertEqual(lead.street, self.contact_1.street)
- # self.assertEqual(lead.city, self.contact_1.city)
- # self.assertEqual(lead.zip, self.contact_1.zip)
- # self.assertEqual(lead.country_id, self.contact_1.country_id)
+ self.assertEqual(lead.partner_name, self.contact_company_1.name)
+ self.assertEqual(lead.contact_name, self.contact_1.name)
+ self.assertEqual(lead.email_from, self.contact_1.email)
+ self.assertEqual(lead.street, self.contact_1.street)
+ self.assertEqual(lead.city, self.contact_1.city)
+ self.assertEqual(lead.zip, self.contact_1.zip)
+ self.assertEqual(lead.country_id, self.contact_1.country_id)
+
+ def test_crm_lead_creation_no_partner(self):
+ belgium = self.env.ref('base.be')
+ lead_data = {
+ 'name': 'Test',
+ 'country_id': belgium.id,
+ 'email_from': 'test@odoo.com',
+ 'phone': '04584579646',
+ }
+ lead = self.env['crm.lead'].new(lead_data)
+ # get the street should not trigger cache miss
+ lead.street
+ # Create the lead and the write partner_id = False
+ # Country should remain
+ lead = self.env['crm.lead'].create(lead_data)
+ self.assertEqual(lead.country_id, belgium, "Country should be set on the lead")
+ lead.partner_id = False
+ self.assertEqual(lead.country_id, belgium, "Country should still be set on the lead")
@users('user_sales_manager')
def test_crm_lead_partner_sync(self):