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
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')
|