# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.addons.crm.tests import common as crm_common from odoo.exceptions import AccessError from odoo.tests.common import tagged, users from odoo.tools import mute_logger @tagged('lead_manage', 'lead_lost') class TestLeadConvert(crm_common.TestCrmCommon): @classmethod def setUpClass(cls): super(TestLeadConvert, cls).setUpClass() cls.lost_reason = cls.env['crm.lost.reason'].create({ 'name': 'Test Reason' }) @users('user_sales_salesman') def test_lead_lost(self): """ Test setting a lead as lost using the wizard. Also check that an 'html editor' void content used as feedback is not logged on the lead. """ # Initial data self.assertEqual(len(self.lead_1.message_ids), 1, 'Should contain creation message') creation_message = self.lead_1.message_ids[0] self.assertEqual(creation_message.subtype_id, self.env.ref('crm.mt_lead_create')) # Update responsible as ACLs is "own only" for user_sales_salesman self.lead_1.with_user(self.user_sales_manager).write({ 'user_id': self.user_sales_salesman.id, 'probability': 32, }) self.flush_tracking() lead = self.env['crm.lead'].browse(self.lead_1.ids) 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] self.assertEqual(update_message.subtype_id, self.env.ref('mail.mt_note')) # mark as lost using the wizard lost_wizard = self.env['crm.lead.lost'].create({ 'lead_ids': lead.ids, 'lost_reason_id': self.lost_reason.id, 'lost_feedback': '

', # void content }) lost_wizard.action_lost_reason_apply() self.flush_tracking() # check lead update self.assertFalse(lead.active) self.assertEqual(lead.automated_probability, 0) 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') update_message = lead.message_ids[0] self.assertEqual(update_message.subtype_id, self.env.ref('crm.mt_lead_lost')) self.assertEqual(len(update_message.tracking_value_ids), 2, 'Tracking: active, lost reason') self.assertTracking( update_message, [('active', 'boolean', True, False), ('lost_reason_id', 'many2one', False, self.lost_reason) ] ) @users('user_sales_leads') def test_lead_lost_batch_wfeedback(self): """ Test setting leads as lost in batch using the wizard, including a log message. """ leads = self._create_leads_batch(lead_type='lead', count=10, probabilities=[10, 20, 30]) self.assertEqual(len(leads), 10) self.flush_tracking() lost_wizard = self.env['crm.lead.lost'].create({ 'lead_ids': leads.ids, 'lost_reason_id': self.lost_reason.id, 'lost_feedback': '

I cannot find it. It was in my closet and pouf, disappeared.

', }) lost_wizard.action_lost_reason_apply() self.flush_tracking() for lead in leads: # check content self.assertFalse(lead.active) self.assertEqual(lead.automated_probability, 0) self.assertEqual(lead.probability, 0) self.assertEqual(lead.lost_reason_id, self.lost_reason) # check messages self.assertEqual(len(lead.message_ids), 2, 'Should have 2 messages: creation, lost with log') lost_message = lead.message_ids.filtered(lambda msg: msg.subtype_id == self.env.ref('crm.mt_lead_lost')) self.assertTrue(lost_message) self.assertTracking( lost_message, [('active', 'boolean', True, False), ('lost_reason_id', 'many2one', False, self.lost_reason) ] ) self.assertIn('

I cannot find it. It was in my closet and pouf, disappeared.

', lost_message.body, 'Feedback should be included directly within tracking message') @users('user_sales_salesman') @mute_logger('odoo.addons.base.models') def test_lead_lost_crm_rights(self): """ Test ACLs of lost reasons management and usage """ lead = self.lead_1.with_user(self.env.user) # nice try little salesman but only managers can create lost reason to avoid bloating the DB with self.assertRaises(AccessError): lost_reason = self.env['crm.lost.reason'].create({ 'name': 'Test Reason' }) with self.with_user('user_sales_manager'): lost_reason = self.env['crm.lost.reason'].create({ 'name': 'Test Reason' }) # nice try little salesman, you cannot invoke a wizard to update other people leads with self.assertRaises(AccessError): # wizard needs to be here due to cache clearing in assertRaises # (ORM does not load m2m records unavailable to the user from database) lost_wizard = self.env['crm.lead.lost'].create({ 'lead_ids': lead.ids, 'lost_reason_id': lost_reason.id }) lost_wizard.action_lost_reason_apply()