From b4cbad1bedc666c234dfa0809602341dbf8e7246 Mon Sep 17 00:00:00 2001 From: qmo-odoo Date: Mon, 14 Oct 2019 12:36:23 +0000 Subject: [PATCH] [IMP] mass_mailing_crm: Improve lead/opportunity computation Prior to this commit, two fields were used for lead and opportunities count. As both of these fields were set with the same values and only existed for labelling purposes, this commit replaces them by a single field and handles the the labels in the xml. This commit also improves the way lead count is computed by using a read_group instead of a search in a loop. LINKS: closes odoo/odoo#38707 Taskid: 2086863 Pr: #38707 Signed-off-by: Thibault Delavallee (tde) --- .../models/mailing_mailing.py | 54 ++++++------------- .../views/mailing_mailing_views.xml | 20 +++---- 2 files changed, 23 insertions(+), 51 deletions(-) diff --git a/addons/mass_mailing_crm/models/mailing_mailing.py b/addons/mass_mailing_crm/models/mailing_mailing.py index e4c23086bb4..97de181c798 100644 --- a/addons/mass_mailing_crm/models/mailing_mailing.py +++ b/addons/mass_mailing_crm/models/mailing_mailing.py @@ -10,50 +10,26 @@ class MassMailing(models.Model): _name = 'mailing.mailing' _inherit = 'mailing.mailing' - crm_lead_activated = fields.Boolean('Use Leads', compute='_compute_crm_lead_activated') - crm_lead_count = fields.Integer('Lead Count', groups='sales_team.group_sale_salesman', compute='_compute_crm_lead_and_opportunities_count') - crm_opportunities_count = fields.Integer('Opportunities Count', groups='sales_team.group_sale_salesman', compute='_compute_crm_lead_and_opportunities_count') + use_leads = fields.Boolean('Use Leads', compute='_compute_use_leads') + crm_lead_count = fields.Integer('Leads/Opportunities Count', groups='sales_team.group_sale_salesman', compute='_compute_crm_lead_count') - def _compute_crm_lead_activated(self): + def _compute_use_leads(self): for mass_mailing in self: - mass_mailing.crm_lead_activated = self.env.user.has_group('crm.group_use_lead') + mass_mailing.use_leads = self.env.user.has_group('crm.group_use_lead') - @api.depends('crm_lead_activated') - def _compute_crm_lead_and_opportunities_count(self): + def _compute_crm_lead_count(self): + lead_data = self.env['crm.lead'].with_context(active_test=False).read_group( + [('source_id', 'in', self.source_id.ids)], + ['source_id'], ['source_id'] + ) + mapped_data = {datum['source_id'][0]: datum['source_id_count'] for datum in lead_data} for mass_mailing in self: - lead_and_opportunities_count = mass_mailing.crm_lead_count = self.env['crm.lead'] \ - .with_context(active_test=False) \ - .search_count(self._get_crm_utm_domain()) - if mass_mailing.crm_lead_activated: - mass_mailing.crm_lead_count = lead_and_opportunities_count - mass_mailing.crm_opportunities_count = 0 - else: - mass_mailing.crm_lead_count = 0 - mass_mailing.crm_opportunities_count = lead_and_opportunities_count + mass_mailing.crm_lead_count = mapped_data.get(mass_mailing.source_id.id, 0) - def action_redirect_to_leads(self): - action = self.env.ref('crm.crm_lead_all_leads').read()[0] - action['domain'] = self._get_crm_utm_domain() - action['context'] = {'default_type': 'lead', 'active_test': False, 'create': False} - return action - - def action_redirect_to_opportunities(self): - action = self.env.ref('crm.crm_lead_opportunities').read()[0] + def action_redirect_to_leads_and_opportunities(self): + view = 'crm.crm_lead_all_leads' if self.use_leads else 'crm.crm_lead_opportunities' + action = self.env.ref(view).read()[0] action['view_mode'] = 'tree,kanban,graph,pivot,form,calendar' - action['domain'] = self._get_crm_utm_domain() + action['domain'] = [('source_id', 'in', self.source_id.ids)] action['context'] = {'active_test': False, 'create': False} return action - - def _get_crm_utm_domain(self): - """ We want all records that match the UTMs """ - domain = [] - if self.campaign_id: - domain = expression.AND([domain, [('campaign_id', '=', self.campaign_id.id)]]) - if self.source_id: - domain = expression.AND([domain, [('source_id', '=', self.source_id.id)]]) - if self.medium_id: - domain = expression.AND([domain, [('medium_id', '=', self.medium_id.id)]]) - if not domain: - domain = expression.AND([domain, [(0, '=', 1)]]) - - return domain diff --git a/addons/mass_mailing_crm/views/mailing_mailing_views.xml b/addons/mass_mailing_crm/views/mailing_mailing_views.xml index d8fd50830ac..e5edbd55c54 100644 --- a/addons/mass_mailing_crm/views/mailing_mailing_views.xml +++ b/addons/mass_mailing_crm/views/mailing_mailing_views.xml @@ -6,22 +6,18 @@ - - -