From 25c4f406f767cc31fa9e78d60510e70cdc596007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 24 Dec 2021 11:28:20 +0000 Subject: [PATCH] [IMP] crm: avoid unnecessary partner update on convert Currently when converting leads we may end up with False being compared to a void partner recordset. Due to the use of != this leads to unnecessary update of leads when no partner is involved in lead convert. By comparing recordsets everytime we save queries and performance each time a convert on a lead without customer is done. This leads to about saving 150 queries in heavy duty tests. Task-2722512 (Lead: performance in convert without customer) Task-2722513 (Lead: performance master task) closes odoo/odoo#81028 Related: odoo/enterprise#23094 Signed-off-by: Thibault Delavallee (tde) --- addons/crm/controllers/main.py | 2 +- addons/crm/models/crm_lead.py | 6 ++---- addons/crm/models/crm_team_member.py | 2 +- addons/crm/tests/test_crm_lead.py | 2 +- addons/crm/tests/test_crm_lead_convert.py | 8 ++++---- addons/crm/tests/test_performances.py | 4 ++-- addons/crm/wizard/crm_lead_to_opportunity.py | 2 +- addons/website_crm_partner_assign/models/crm_lead.py | 4 ++-- 8 files changed, 14 insertions(+), 16 deletions(-) diff --git a/addons/crm/controllers/main.py b/addons/crm/controllers/main.py index e1265aa0ad1..14de058d3dc 100644 --- a/addons/crm/controllers/main.py +++ b/addons/crm/controllers/main.py @@ -38,7 +38,7 @@ class CrmController(http.Controller): comparison, record, redirect = MailController._check_token_and_record_or_redirect('crm.lead', int(res_id), token) if comparison and record: try: - record.convert_opportunity(record.partner_id.id) + record.convert_opportunity(record.partner_id) except Exception: _logger.exception("Could not convert crm.lead to opportunity") return MailController._redirect_to_messaging() diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index eb267b54522..65c008f87cd 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -1532,10 +1532,8 @@ class Lead(models.Model): upd_values['stage_id'] = stage.id return upd_values - def convert_opportunity(self, partner_id, user_ids=False, team_id=False): - customer = False - if partner_id: - customer = self.env['res.partner'].browse(partner_id) + def convert_opportunity(self, partner, user_ids=False, team_id=False): + customer = partner if partner else self.env['res.partner'] for lead in self: if not lead.active or lead.probability == 100: continue diff --git a/addons/crm/models/crm_team_member.py b/addons/crm/models/crm_team_member.py index 8fcb27b8e79..75dcf662701 100644 --- a/addons/crm/models/crm_team_member.py +++ b/addons/crm/models/crm_team_member.py @@ -169,7 +169,7 @@ class TeamMember(models.Model): weights[member_index] = weights[member_index] - 1 lead.with_context(mail_auto_subscribe_no_notify=True).convert_opportunity( - lead.partner_id.id, + lead.partner_id, user_ids=member_data['team_member'].user_id.ids ) diff --git a/addons/crm/tests/test_crm_lead.py b/addons/crm/tests/test_crm_lead.py index 53be75ad5c2..4e557f652e2 100644 --- a/addons/crm/tests/test_crm_lead.py +++ b/addons/crm/tests/test_crm_lead.py @@ -455,7 +455,7 @@ class TestCRMLead(TestCrmCommon): lead = self.lead_1.with_user(self.env.user) self.assertEqual(lead.team_id, self.sales_team_1) - lead.convert_opportunity(self.contact_1.id) + lead.convert_opportunity(self.contact_1) self.assertEqual(lead.team_id, self.sales_team_1) lead.action_set_won() diff --git a/addons/crm/tests/test_crm_lead_convert.py b/addons/crm/tests/test_crm_lead_convert.py index e594914d302..52f41b83877 100644 --- a/addons/crm/tests/test_crm_lead_convert.py +++ b/addons/crm/tests/test_crm_lead_convert.py @@ -143,7 +143,7 @@ class TestLeadConvert(crm_common.TestLeadConvertCommon): self.assertEqual(lead.stage_id, self.stage_team1_1) self.assertEqual(lead.email_from, 'amy.wong@test.example.com') self.assertEqual(lead.lang_id, self.lang_fr) - lead.convert_opportunity(self.contact_2.id) + lead.convert_opportunity(self.contact_2) self.assertEqual(lead.type, 'opportunity') self.assertEqual(lead.partner_id, self.contact_2) @@ -162,7 +162,7 @@ class TestLeadConvert(crm_common.TestLeadConvertCommon): lead = self.lead_1.with_user(self.env.user) lead.action_archive() self.assertFalse(lead.active) - lead.convert_opportunity(self.contact_2.id) + lead.convert_opportunity(self.contact_2) self.assertEqual(lead.type, 'lead') self.assertEqual(lead.partner_id, self.env['res.partner']) @@ -177,7 +177,7 @@ class TestLeadConvert(crm_common.TestLeadConvertCommon): self.assertEqual(lead.stage_id, self.stage_gen_won) self.assertEqual(lead.probability, 100) - lead.convert_opportunity(self.contact_2.id) + lead.convert_opportunity(self.contact_2) self.assertEqual(lead.type, 'lead') self.assertEqual(lead.partner_id, self.env['res.partner']) @@ -356,7 +356,7 @@ class TestLeadConvert(crm_common.TestLeadConvertCommon): 'street': 'my street', 'city': 'my city', }) - lead.convert_opportunity(partner.id) + lead.convert_opportunity(partner) self.assertEqual(lead.email_from, 'demo@test.com', 'Email From should be preserved during conversion') self.assertEqual(lead.lang_id, self.lang_fr, 'Lang should be preserved during conversion') self.assertEqual(lead.street, 'my street', 'Street should be preserved during conversion') diff --git a/addons/crm/tests/test_performances.py b/addons/crm/tests/test_performances.py index e235da82206..d9618604fb0 100644 --- a/addons/crm/tests/test_performances.py +++ b/addons/crm/tests/test_performances.py @@ -48,7 +48,7 @@ class TestLeadAssignPerf(TestLeadAssignCommon): leads.flush() with self.with_user('user_sales_manager'): - with self.assertQueryCount(user_sales_manager=1388): # 1376-1379 generally + with self.assertQueryCount(user_sales_manager=1378): # 1366-1369 generally self.env['crm.team'].browse(self.sales_teams.ids)._action_assign_leads(work_days=2) # teams assign @@ -174,7 +174,7 @@ class TestLeadAssignPerf(TestLeadAssignCommon): leads.flush() with self.with_user('user_sales_manager'): - with self.assertQueryCount(user_sales_manager=7272): # 7263-7269 generally + with self.assertQueryCount(user_sales_manager=7152): # 7143-7149 generally self.env['crm.team'].browse(sales_teams.ids)._action_assign_leads(work_days=30) # teams assign diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py index 3e7f44f5573..5a2dbe81115 100644 --- a/addons/crm/wizard/crm_lead_to_opportunity.py +++ b/addons/crm/wizard/crm_lead_to_opportunity.py @@ -147,7 +147,7 @@ class Lead2OpportunityPartner(models.TransientModel): self._convert_handle_partner( lead, self.action, self.partner_id.id or lead.partner_id.id) - lead.convert_opportunity(lead.partner_id.id, user_ids=False, team_id=False) + lead.convert_opportunity(lead.partner_id, user_ids=False, team_id=False) leads_to_allocate = leads if not self.force_assignment: diff --git a/addons/website_crm_partner_assign/models/crm_lead.py b/addons/website_crm_partner_assign/models/crm_lead.py index dcb124cdd68..cd4ad33d2e9 100644 --- a/addons/website_crm_partner_assign/models/crm_lead.py +++ b/addons/website_crm_partner_assign/models/crm_lead.py @@ -186,7 +186,7 @@ class CrmLead(models.Model): message += '

%s

' % html_escape(comment) for lead in self: lead.message_post(body=message) - lead.sudo().convert_opportunity(lead.partner_id.id) # sudo required to convert partner data + lead.sudo().convert_opportunity(lead.partner_id) # sudo required to convert partner data def partner_desinterested(self, comment=False, contacted=False, spam=False): if contacted: @@ -274,7 +274,7 @@ class CrmLead(models.Model): lead = self.create(values) lead.assign_salesman_of_assigned_partner() - lead.convert_opportunity(lead.partner_id.id) + lead.convert_opportunity(lead.partner_id) return { 'id': lead.id }