[REF] crm: correctly name lost_reason field on lead
As this is a many2one, it should end with an ``_id`` suffix. Otherwise we may think this is a char field, which was probably the case at one point. Task-2671709 Part-of: odoo/odoo#78648
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
{
|
||||
'name': 'CRM',
|
||||
'version': '1.6',
|
||||
'version': '1.7',
|
||||
'category': 'Sales/CRM',
|
||||
'sequence': 15,
|
||||
'summary': 'Track leads and close opportunities',
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
<div t-if="lead.priority">
|
||||
Priority: <span t-field="lead.priority"/>
|
||||
</div>
|
||||
<div t-if="lead.lost_reason">
|
||||
Lost Reason: <span t-field="lead.lost_reason"/>
|
||||
<div t-if="lead.lost_reason_id">
|
||||
Lost Reason: <span t-field="lead.lost_reason_id"/>
|
||||
</div>
|
||||
<div>
|
||||
Created on: <span t-field="lead.create_date"/>
|
||||
|
||||
@@ -213,7 +213,7 @@ class Lead(models.Model):
|
||||
automated_probability = fields.Float('Automated Probability', compute='_compute_probabilities', readonly=True, store=True)
|
||||
is_automated_probability = fields.Boolean('Is automated probability?', compute="_compute_is_automated_probability")
|
||||
# Won/Lost
|
||||
lost_reason = fields.Many2one(
|
||||
lost_reason_id = fields.Many2one(
|
||||
'crm.lost.reason', string='Lost Reason',
|
||||
index=True, ondelete='restrict', tracking=True)
|
||||
# Statistics
|
||||
@@ -901,7 +901,7 @@ class Lead(models.Model):
|
||||
activated = self.filtered(lambda lead: lead.active)
|
||||
archived = self.filtered(lambda lead: not lead.active)
|
||||
if activated:
|
||||
activated.write({'lost_reason': False})
|
||||
activated.write({'lost_reason_id': False})
|
||||
activated._compute_probabilities()
|
||||
if archived:
|
||||
archived.write({'probability': 0, 'automated_probability': 0})
|
||||
@@ -1355,9 +1355,9 @@ class Lead(models.Model):
|
||||
'type': lambda fname, leads: 'opportunity' if any(lead.type == 'opportunity' for lead in leads) else 'lead',
|
||||
'priority': lambda fname, leads: max(leads.mapped('priority')) if leads else False,
|
||||
'tag_ids': lambda fname, leads: leads.mapped('tag_ids'),
|
||||
'lost_reason': lambda fname, leads:
|
||||
'lost_reason_id': lambda fname, leads:
|
||||
False if leads and leads[0].probability
|
||||
else next((lead.lost_reason for lead in leads if lead.lost_reason), False),
|
||||
else next((lead.lost_reason_id for lead in leads if lead.lost_reason_id), False),
|
||||
}
|
||||
|
||||
def _merge_get_fields(self):
|
||||
@@ -1723,7 +1723,7 @@ class Lead(models.Model):
|
||||
self.ensure_one()
|
||||
if 'stage_id' in init_values and self.probability == 100 and self.stage_id:
|
||||
return self.env.ref('crm.mt_lead_won')
|
||||
elif 'lost_reason' in init_values and self.lost_reason:
|
||||
elif 'lost_reason_id' in init_values and self.lost_reason_id:
|
||||
return self.env.ref('crm.mt_lead_lost')
|
||||
elif 'stage_id' in init_values:
|
||||
return self.env.ref('crm.mt_lead_stage')
|
||||
|
||||
@@ -13,8 +13,12 @@ class LostReason(models.Model):
|
||||
leads_count = fields.Integer('Leads Count', compute='_compute_leads_count')
|
||||
|
||||
def _compute_leads_count(self):
|
||||
lead_data = self.env['crm.lead'].with_context(active_test=False).read_group([('lost_reason', 'in', self.ids)], ['lost_reason'], ['lost_reason'])
|
||||
mapped_data = dict((data['lost_reason'][0], data['lost_reason_count']) for data in lead_data)
|
||||
lead_data = self.env['crm.lead'].with_context(active_test=False).read_group(
|
||||
[('lost_reason_id', 'in', self.ids)],
|
||||
['lost_reason_id'],
|
||||
['lost_reason_id']
|
||||
)
|
||||
mapped_data = dict((data['lost_reason_id'][0], data['lost_reason_id_count']) for data in lead_data)
|
||||
for reason in self:
|
||||
reason.leads_count = mapped_data.get(reason.id, 0)
|
||||
|
||||
@@ -22,7 +26,7 @@ class LostReason(models.Model):
|
||||
return {
|
||||
'name': _('Leads'),
|
||||
'view_mode': 'tree,form',
|
||||
'domain': [('lost_reason', 'in', self.ids)],
|
||||
'domain': [('lost_reason_id', 'in', self.ids)],
|
||||
'res_model': 'crm.lead',
|
||||
'type': 'ir.actions.act_window',
|
||||
'context': {'create': False, 'active_test': False},
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
<filter string="Conversion Date" context="{'group_by':'date_conversion:month'}" name="conversion_date" help="Conversion Date from Lead to Opportunity" groups="crm.group_use_lead"/>
|
||||
<filter string="Expected Closing" context="{'group_by':'date_deadline:month'}" name="date_deadline"/>
|
||||
<filter string="Closed Date" context="{'group_by':'date_closed'}" name="date_closed_groupby"/>
|
||||
<filter string="Lost Reason" name="lostreason" context="{'group_by':'lost_reason'}"/>
|
||||
<filter string="Lost Reason" name="lostreason" context="{'group_by':'lost_reason_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
|
||||
@@ -34,7 +34,7 @@ class TestLeadConvert(crm_common.TestCrmCommon):
|
||||
self.flush_tracking()
|
||||
|
||||
lead = self.env['crm.lead'].browse(self.lead_1.ids)
|
||||
self.assertFalse(lead.lost_reason)
|
||||
self.assertFalse(lead.lost_reason_id)
|
||||
self.assertEqual(lead.probability, 32)
|
||||
self.assertEqual(len(lead.message_ids), 2, 'Should have tracked new responsible')
|
||||
update_message = lead.message_ids[0]
|
||||
@@ -54,7 +54,7 @@ class TestLeadConvert(crm_common.TestCrmCommon):
|
||||
# check lead update
|
||||
self.assertFalse(lead.active)
|
||||
self.assertEqual(lead.automated_probability, 0)
|
||||
self.assertEqual(lead.lost_reason, self.lost_reason) # TDE FIXME: should be called lost_reason_id non didjou
|
||||
self.assertEqual(lead.lost_reason_id, self.lost_reason) # TDE FIXME: should be called lost_reason_id non didjou
|
||||
self.assertEqual(lead.probability, 0)
|
||||
# check messages
|
||||
self.assertEqual(len(lead.message_ids), 3, 'Should have logged a tracking message for lost lead with reason')
|
||||
@@ -64,7 +64,7 @@ class TestLeadConvert(crm_common.TestCrmCommon):
|
||||
self.assertTracking(
|
||||
update_message,
|
||||
[('active', 'boolean', True, False),
|
||||
('lost_reason', 'many2one', False, self.lost_reason)
|
||||
('lost_reason_id', 'many2one', False, self.lost_reason)
|
||||
]
|
||||
)
|
||||
|
||||
@@ -90,7 +90,7 @@ class TestLeadConvert(crm_common.TestCrmCommon):
|
||||
self.assertFalse(lead.active)
|
||||
self.assertEqual(lead.automated_probability, 0)
|
||||
self.assertEqual(lead.probability, 0)
|
||||
self.assertEqual(lead.lost_reason, self.lost_reason)
|
||||
self.assertEqual(lead.lost_reason_id, self.lost_reason)
|
||||
# check messages
|
||||
self.assertEqual(len(lead.message_ids), 3, 'Should have 3 messages: creation, lost, and log')
|
||||
lost_message = lead.message_ids.filtered(lambda msg: msg.subtype_id == self.env.ref('crm.mt_lead_lost'))
|
||||
@@ -98,7 +98,7 @@ class TestLeadConvert(crm_common.TestCrmCommon):
|
||||
self.assertTracking(
|
||||
lost_message,
|
||||
[('active', 'boolean', True, False),
|
||||
('lost_reason', 'many2one', False, self.lost_reason)
|
||||
('lost_reason_id', 'many2one', False, self.lost_reason)
|
||||
]
|
||||
)
|
||||
note_message = lead.message_ids.filtered(lambda msg: msg.subtype_id == self.env.ref('mail.mt_note'))
|
||||
|
||||
@@ -307,7 +307,7 @@ class TestLeadMerge(TestLeadMergeCommon):
|
||||
# because "lead_1" is not lost
|
||||
lost_reason = self.env['crm.lost.reason'].create({'name': 'Test Reason'})
|
||||
self.lead_w_partner.write({
|
||||
'lost_reason': lost_reason,
|
||||
'lost_reason_id': lost_reason,
|
||||
'probability': 0,
|
||||
})
|
||||
|
||||
@@ -317,7 +317,7 @@ class TestLeadMerge(TestLeadMergeCommon):
|
||||
name='Nibbler Spacecraft Request',
|
||||
partner_id=self.contact_company_1,
|
||||
priority='2',
|
||||
lost_reason=False,
|
||||
lost_reason_id=False,
|
||||
tag_ids=all_tags):
|
||||
leads._merge_opportunity(auto_unlink=False, max_length=None)
|
||||
|
||||
@@ -331,11 +331,11 @@ class TestLeadMerge(TestLeadMergeCommon):
|
||||
})
|
||||
|
||||
lost_reason = self.env['crm.lost.reason'].create({'name': 'Test Reason'})
|
||||
self.lead_w_partner.lost_reason = lost_reason
|
||||
self.lead_w_partner.lost_reason_id = lost_reason
|
||||
|
||||
leads = self.env['crm.lead'].browse(self.leads.ids)._sort_by_confidence_level(reverse=True)
|
||||
|
||||
with self.assertLeadMerged(leads[0], leads, lost_reason=lost_reason):
|
||||
with self.assertLeadMerged(leads[0], leads, lost_reason_id=lost_reason):
|
||||
leads._merge_opportunity(auto_unlink=False, max_length=None)
|
||||
|
||||
@users('user_sales_manager')
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}"/>
|
||||
</group>
|
||||
<group name="opportunity_info" attrs="{'invisible': [('type', '=', 'lead')]}">
|
||||
<field name="lost_reason" attrs="{'invisible': [('active', '=', True)]}"/>
|
||||
<field name="lost_reason_id" attrs="{'invisible': [('active', '=', True)]}"/>
|
||||
<field name="date_conversion" invisible="1"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
<field name="user_company_ids" invisible="1"/>
|
||||
@@ -985,7 +985,7 @@
|
||||
<filter name="stage" string="Stage" context="{'group_by':'stage_id'}"/>
|
||||
<filter name="city" string="City" context="{'group_by': 'city'}"/>
|
||||
<filter string="Country" name="country" context="{'group_by':'country_id'}" />
|
||||
<filter string="Lost Reason" name="lostreason" context="{'group_by':'lost_reason'}"/>
|
||||
<filter string="Lost Reason" name="lostreason" context="{'group_by':'lost_reason_id'}"/>
|
||||
<filter string="Company" name="company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
|
||||
<filter string="Campaign" name="compaign" domain="[]" context="{'group_by':'campaign_id'}"/>
|
||||
<filter string="Medium" name="medium" domain="[]" context="{'group_by':'medium_id'}"/>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import fields, models, _
|
||||
from odoo import fields, models
|
||||
from odoo.tools.mail import is_html_empty
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class CrmLeadLost(models.TransientModel):
|
||||
def action_lost_reason_apply(self):
|
||||
self.ensure_one()
|
||||
leads = self.env['crm.lead'].browse(self.env.context.get('active_ids'))
|
||||
res = leads.action_set_lost(lost_reason=self.lost_reason_id.id)
|
||||
res = leads.action_set_lost(lost_reason_id=self.lost_reason_id.id)
|
||||
if not is_html_empty(self.lost_feedback):
|
||||
leads._message_log_batch(
|
||||
bodies=dict(
|
||||
|
||||
Reference in New Issue
Block a user