summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorVictor Feyens <vfe@odoo.com>2020-02-11 12:20:39 +0000
committerThibault Delavallée <tde@odoo.com>2020-04-21 12:28:52 +0000
commit3f6625ef134c35ad8fab00ca99b451a7dfabee08 (patch)
tree1fd4dbc9de252a887fe91ed5b1cc7780bea6025a /addons
parent2457e7f6f45b23118ce73c47112d60802411cc4b (diff)
[IMP] link_tracker, mass_mailing: uuse read_group instead of computing len of one2many fields
PURPOSE Several counter fields are performed inefficiently. They use compute methods using length of 2many fields instead of making use of more efficient ORM methods like read_group. SPECIFICATIONS There may be a lot of clicks linked to a given link tracker. Compute the count of clicks in batch with a read_group to improve performance. Same for utm campaign mailing count performances. Some missing indexes are added to speedup queries. LINKS Task ID 2196182 PR #44662 Co-Authored-By: Victor Feyens <vfe@odoo.com> Co-Authored-By: Thibault Delavallee <tde@odoo.com>
Diffstat (limited to 'addons')
-rw-r--r--addons/link_tracker/models/link_tracker.py19
-rw-r--r--addons/mass_mailing/models/mailing.py2
-rw-r--r--addons/mass_mailing/models/utm.py11
3 files changed, 27 insertions, 5 deletions
diff --git a/addons/link_tracker/models/link_tracker.py b/addons/link_tracker/models/link_tracker.py
index ec73046e1be..8ea1a04f50e 100644
--- a/addons/link_tracker/models/link_tracker.py
+++ b/addons/link_tracker/models/link_tracker.py
@@ -38,8 +38,17 @@ class LinkTracker(models.Model):
@api.depends('link_click_ids.link_id')
def _compute_count(self):
+ if self.ids:
+ clicks_data = self.env['link.tracker.click'].read_group(
+ [('link_id', 'in', self.ids)],
+ ['link_id'],
+ ['link_id']
+ )
+ mapped_data = {m['link_id'][0]: m['link_id_count'] for m in clicks_data}
+ else:
+ mapped_data = dict()
for tracker in self:
- tracker.count = len(tracker.link_click_ids)
+ tracker.count = mapped_data.get(tracker.id, 0)
@api.depends('code')
def _compute_short_url(self):
@@ -187,8 +196,12 @@ class LinkTrackerClick(models.Model):
_rec_name = "link_id"
_description = "Link Tracker Click"
- campaign_id = fields.Many2one(string='UTM Campaign', comodel_name="utm.campaign", related="link_id.campaign_id", store=True)
- link_id = fields.Many2one('link.tracker', 'Link', required=True, ondelete='cascade')
+ campaign_id = fields.Many2one(
+ 'utm.campaign', 'UTM Campaign',
+ related="link_id.campaign_id", store=True)
+ link_id = fields.Many2one(
+ 'link.tracker', 'Link',
+ index=True, required=True, ondelete='cascade')
ip = fields.Char(string='Internet Protocol')
country_id = fields.Many2one('res.country', 'Country')
diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py
index 2446c03dd0a..e644f4b0d7c 100644
--- a/addons/mass_mailing/models/mailing.py
+++ b/addons/mass_mailing/models/mailing.py
@@ -65,7 +65,7 @@ class MassMailing(models.Model):
attachment_ids = fields.Many2many('ir.attachment', 'mass_mailing_ir_attachments_rel',
'mass_mailing_id', 'attachment_id', string='Attachments')
keep_archives = fields.Boolean(string='Keep Archives')
- campaign_id = fields.Many2one('utm.campaign', string='UTM Campaign')
+ campaign_id = fields.Many2one('utm.campaign', string='UTM Campaign', index=True)
source_id = fields.Many2one('utm.source', string='Source', required=True, ondelete='cascade',
help="This is the link source, e.g. Search Engine, another domain, or name of email list")
medium_id = fields.Many2one(
diff --git a/addons/mass_mailing/models/utm.py b/addons/mass_mailing/models/utm.py
index 783703d3961..54ea93bf62c 100644
--- a/addons/mass_mailing/models/utm.py
+++ b/addons/mass_mailing/models/utm.py
@@ -20,8 +20,17 @@ class UtmCampaign(models.Model):
@api.depends('mailing_mail_ids')
def _compute_mailing_mail_count(self):
+ if self.ids:
+ mailing_data = self.env['mailing.mailing'].read_group(
+ [('campaign_id', 'in', self.ids)],
+ ['campaign_id'],
+ ['campaign_id']
+ )
+ mapped_data = {m['campaign_id'][0]: m['campaign_id_count'] for m in mailing_data}
+ else:
+ mapped_data = dict()
for campaign in self:
- campaign.mailing_mail_count = len(campaign.mailing_mail_ids)
+ campaign.mailing_mail_count = mapped_data.get(campaign.id, 0)
def _compute_statistics(self):
""" Compute statistics of the mass mailing campaign """