[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) <tde@openerp.com>
This commit is contained in:
Thibault Delavallée
2021-12-24 14:57:03 +00:00
parent 65bb3a5710
commit 25c4f406f7
8 changed files with 14 additions and 16 deletions
+1 -1
View File
@@ -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()
+2 -4
View File
@@ -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
+1 -1
View File
@@ -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
)
+1 -1
View File
@@ -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()
+4 -4
View File
@@ -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')
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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:
@@ -186,7 +186,7 @@ class CrmLead(models.Model):
message += '<p>%s</p>' % 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
}