[IMP] mail_tracking: email score performance (#299)

This commit is contained in:
David Vidal 2018-09-06 11:24:20 +02:00 committed by Jasmin Solanki
parent 8d9cebdf99
commit f1259fc0ec
3 changed files with 24 additions and 8 deletions

View File

@ -5,7 +5,7 @@
{ {
"name": "Email tracking", "name": "Email tracking",
"summary": "Email tracking system for all mails sent", "summary": "Email tracking system for all mails sent",
"version": "11.0.1.0.0", "version": "11.0.1.1.0",
"category": "Social Network", "category": "Social Network",
"website": "http://github.com/OCA/social", "website": "http://github.com/OCA/social",
"author": "Tecnativa, " "author": "Tecnativa, "

View File

@ -103,10 +103,12 @@ class MailTrackingEmail(models.Model):
@api.model @api.model
def email_score_from_email(self, email): def email_score_from_email(self, email):
if email: if not email:
return self.search([ return 0.
('recipient_address', '=', email.lower())]).email_score() data = self.read_group([('recipient_address', '=', email.lower())],
return 0. ['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 @api.model
def _email_score_weights(self): def _email_score_weights(self):
@ -124,7 +126,7 @@ class MailTrackingEmail(models.Model):
def email_score(self): def email_score(self):
"""Default email score algorimth. Ready to be inherited """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 Must return a value beetwen 0.0 and 100.0
- Bad reputation: Value between 0 and 50.0 - Bad reputation: Value between 0 and 50.0
- Unknown reputation: Value 50.0 - Unknown reputation: Value 50.0
@ -132,8 +134,13 @@ class MailTrackingEmail(models.Model):
""" """
weights = self._email_score_weights() weights = self._email_score_weights()
score = 50.0 score = 50.0
for tracking in self: states = self.env.context.get('mt_states', False)
score += weights.get(tracking.state, 0.0) 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: if score > 100.0:
score = 100.0 score = 100.0
elif score < 0.0: elif score < 0.0:

View File

@ -303,6 +303,15 @@ class TestMailTracking(TransactionCase):
self.assertEqual('bounced', tracking.state) self.assertEqual('bounced', tracking.state)
self.assertEqual(0.0, self.recipient.email_score) 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): def test_db(self):
db = self.env.cr.dbname db = self.env.cr.dbname
controller = MailTrackingController() controller = MailTrackingController()