You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

167 lines
6.0 KiB

# -*- coding: utf-8 -*-
# License AGPL-3: Antiun Ingenieria S.L. - Antonio Espinosa
# See README.rst file on addon root folder for more details
import datetime
from openerp import models, fields, api
class MailMandrillEvent(models.Model):
_name = 'mail.mandrill.event'
_order = 'timestamp desc'
_rec_name = 'event_type'
timestamp = fields.Integer(string='Mandrill UTC timestamp', readonly=True)
time = fields.Datetime(string='Mandrill time', readonly=True)
date = fields.Date(string='Mandrill date', readonly=True)
event_type = fields.Selection(string='Event type', selection=[
('send', 'Sent'),
('deferral', 'Deferral'),
('hard_bounce', 'Hard bounce'),
('soft_bounce', 'Soft bounce'),
('open', 'Opened'),
('click', 'Clicked'),
('spam', 'Spam'),
('unsub', 'Unsubscribed'),
('reject', 'Rejected'),
], readonly=True)
url = fields.Char(string='Clicked URL', readonly=True)
ip = fields.Char(string='User IP', readonly=True)
user_agent = fields.Char(string='User agent', readonly=True)
mobile = fields.Boolean(string='Is mobile?', readonly=True)
os_family = fields.Char(string='Operating system family', readonly=True)
ua_family = fields.Char(string='User agent family', readonly=True)
ua_type = fields.Char(string='User agent type', readonly=True)
user_country_id = fields.Many2one(string='User country', readonly=True,
comodel_name='res.country')
message_id = fields.Many2one(string='Message', readonly=True,
comodel_name='mail.mandrill.message')
def _country_search(self, country_code, state_name):
country = False
if country_code:
country = self.env['res.country'].search([
('code', 'ilike', country_code),
])
if not country and state_name:
state = self.env['res.country.state'].search([
('name', 'ilike', state_name),
])
if state:
country = state.country_id
if country:
return country.id
return False
def _process_bounce(self, message, event, event_type):
msg = event.get('msg')
bounce_type = msg.get('bounce_description', False) if msg else False
bounce_description = msg.get('diag', False) if msg else False
message.write({
'state': 'bounced',
'bounce_type': bounce_type,
'bounce_description': bounce_description,
})
ts = event.get('ts', 0)
time = datetime.datetime.fromtimestamp(ts)
return {
'message_id': message.id,
'event_type': event_type,
'timestamp': ts,
'time': time.strftime('%Y-%m-%d %H:%M:%S') if ts else False,
'date': time.strftime('%Y-%m-%d') if ts else False,
}
def _process_status(self, message, event, event_type, state):
message.write({
'state': state,
})
ts = event.get('ts', 0)
time = datetime.datetime.fromtimestamp(ts)
return {
'message_id': message.id,
'event_type': event_type,
'timestamp': ts,
'time': time.strftime('%Y-%m-%d %H:%M:%S') if ts else False,
'date': time.strftime('%Y-%m-%d') if ts else False,
}
def _process_action(self, message, event, event_type, state):
message.write({
'state': state,
})
ts = event.get('ts', 0)
url = event.get('url', False)
ip = event.get('ip', False)
user_agent = event.get('user_agent', False)
os_family = False
ua_family = False
ua_type = False
mobile = False
country_code = False
state = False
location = event.get('location')
if location:
country_code = location.get('country_short', False)
state = location.get('region', False)
ua_parsed = event.get('user_agent_parsed')
if ua_parsed:
os_family = ua_parsed.get('os_family', False)
ua_family = ua_parsed.get('ua_family', False)
ua_type = ua_parsed.get('type', False)
mobile = ua_parsed.get('mobile', False)
country_id = self._country_search(country_code, state)
time = datetime.datetime.fromtimestamp(ts)
return {
'message_id': message.id,
'event_type': event_type,
'timestamp': ts,
'time': time.strftime('%Y-%m-%d %H:%M:%S') if ts else False,
'date': time.strftime('%Y-%m-%d') if ts else False,
'user_country_id': country_id,
'ip': ip,
'url': url,
'mobile': mobile,
'user_agent': user_agent,
'os_family': os_family,
'ua_family': ua_family,
'ua_type': ua_type,
}
@api.model
def process_send(self, message, event):
return self._process_status(message, event, 'send', 'sent')
@api.model
def process_deferral(self, message, event):
return self._process_status(message, event, 'deferral', 'deferred')
@api.model
def process_hard_bounce(self, message, event):
return self._process_bounce(message, event, 'hard_bounce')
@api.model
def process_soft_bounce(self, message, event):
return self._process_bounce(message, event, 'soft_bounce')
@api.model
def process_open(self, message, event):
return self._process_action(message, event, 'open', 'opened')
@api.model
def process_click(self, message, event):
return self._process_action(message, event, 'click', 'opened')
@api.model
def process_spam(self, message, event):
return self._process_status(message, event, 'spam', 'spam')
@api.model
def process_unsub(self, message, event):
return self._process_status(message, event, 'unsub', 'unsub')
@api.model
def process_reject(self, message, event):
return self._process_status(message, event, 'reject', 'rejected')