[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:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user