From 915e6915923ca7da58795858e8e2f70988fbc503 Mon Sep 17 00:00:00 2001 From: David Vidal Date: Thu, 6 Sep 2018 11:24:20 +0200 Subject: [PATCH] [IMP] mail_tracking: email score performance (#299) --- mail_tracking/__manifest__.py | 2 +- mail_tracking/models/mail_tracking_email.py | 21 ++++++++++++++------- mail_tracking/tests/test_mail_tracking.py | 9 +++++++++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/mail_tracking/__manifest__.py b/mail_tracking/__manifest__.py index 6abefc0310..030c0f6779 100644 --- a/mail_tracking/__manifest__.py +++ b/mail_tracking/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Email tracking", "summary": "Email tracking system for all mails sent", - "version": "11.0.1.0.0", + "version": "11.0.1.1.0", "category": "Social Network", "website": "http://github.com/OCA/social", "author": "Tecnativa, " diff --git a/mail_tracking/models/mail_tracking_email.py b/mail_tracking/models/mail_tracking_email.py index f9a3e03f24..a69e321061 100644 --- a/mail_tracking/models/mail_tracking_email.py +++ b/mail_tracking/models/mail_tracking_email.py @@ -103,10 +103,12 @@ def email_is_bounced(self, email): @api.model def email_score_from_email(self, email): - if email: - return self.search([ - ('recipient_address', '=', email.lower())]).email_score() - return 0. + if not email: + return 0. + data = self.read_group([('recipient_address', '=', email.lower())], + ['recipient_address', 'state'], ['state']) + mapped_data = {state['state']: state['state_count'] for state in data} + return self.with_context(mt_states=mapped_data).email_score() @api.model def _email_score_weights(self): @@ -124,7 +126,7 @@ def _email_score_weights(self): def email_score(self): """Default email score algorimth. Ready to be inherited - + It can receive a recordset or mapped states dictionary via context. Must return a value beetwen 0.0 and 100.0 - Bad reputation: Value between 0 and 50.0 - Unknown reputation: Value 50.0 @@ -132,8 +134,13 @@ def email_score(self): """ weights = self._email_score_weights() score = 50.0 - for tracking in self: - score += weights.get(tracking.state, 0.0) + states = self.env.context.get('mt_states', False) + if states: + for state in states.keys(): + score += weights.get(state, 0.0) * states[state] + else: + for tracking in self: + score += weights.get(tracking.state, 0.0) if score > 100.0: score = 100.0 elif score < 0.0: diff --git a/mail_tracking/tests/test_mail_tracking.py b/mail_tracking/tests/test_mail_tracking.py index 4c9a0c7d6e..7dcb65c6a6 100644 --- a/mail_tracking/tests/test_mail_tracking.py +++ b/mail_tracking/tests/test_mail_tracking.py @@ -303,6 +303,15 @@ def test_process_several_bounce(self): self.assertEqual('bounced', tracking.state) self.assertEqual(0.0, self.recipient.email_score) + def test_recordset_email_score(self): + """For backwords compatibility sake""" + trackings = self.env['mail.tracking.email'] + for i in range(11): + mail, tracking = self.mail_send(self.recipient.email) + tracking.event_create('click', {}) + trackings |= tracking + self.assertEqual(100.0, trackings.email_score()) + def test_db(self): db = self.env.cr.dbname controller = MailTrackingController()