diff --git a/calendar_ics/__init__.py b/calendar_ics/__init__.py
new file mode 100644
index 0000000..071a504
--- /dev/null
+++ b/calendar_ics/__init__.py
@@ -0,0 +1,2 @@
+import calendar
+import res_partner
diff --git a/calendar_ics/__init__.pyc b/calendar_ics/__init__.pyc
new file mode 100644
index 0000000..b33230b
Binary files /dev/null and b/calendar_ics/__init__.pyc differ
diff --git a/calendar_ics/__openerp__.py b/calendar_ics/__openerp__.py
new file mode 100644
index 0000000..d31a300
--- /dev/null
+++ b/calendar_ics/__openerp__.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution, third party addon
+# Copyright (C) 2004-2016 Vertel AB ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+{
+ 'name': 'Calendar ics-urls',
+ 'version': '0.1',
+ 'category': 'Tools',
+ 'summary': 'Subscription on calendar.ics-urls',
+ 'licence': 'AGPL-3',
+ 'description': """
+Adds and updates calendar objects according to an ics-url
+
+""",
+ 'author': 'Vertel AB',
+ 'website': 'http://www.vertel.se',
+ 'depends': ['calendar',],
+ 'data': [ 'res_partner_view.xml',
+ #'security/ir.model.access.csv',
+ 'res_partner_data.xml'
+ ],
+ 'application': False,
+ 'installable': True,
+ 'demo': ['calendar_ics_demo.xml',],
+}
+# vim:expandtab:smartindent:tabstop=4s:softtabstop=4:shiftwidth=4:
diff --git a/calendar_ics/calendar.py b/calendar_ics/calendar.py
new file mode 100644
index 0000000..3970b1f
--- /dev/null
+++ b/calendar_ics/calendar.py
@@ -0,0 +1,312 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution, third party addon
+# Copyright (C) 2004-2016 Vertel AB ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp import models, fields, api, _
+from pytz import timezone
+from openerp.exceptions import except_orm, Warning, RedirectWarning
+from datetime import datetime, timedelta, time
+from time import strptime, mktime, strftime
+from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
+import re
+
+from openerp import http
+from openerp.http import request
+
+import logging
+_logger = logging.getLogger(__name__)
+
+
+try:
+ from icalendar import Calendar, Event, vDatetime, FreeBusy
+except ImportError:
+ raise Warning('icalendar library missing, pip install icalendar')
+
+try:
+ import urllib2
+except ImportError:
+ raise Warning('urllib2 library missing, pip install urllib2')
+
+
+# calendar_ics -> res.partner
+
+# http://ical.oops.se/holidays/Sweden/-1,+1
+# http://www.skatteverketkalender.se/skvcal-manadsmoms-maxfyrtiomiljoner-ingenperiodisk-ingenrotrut-verk1.ics
+
+class calendar_event(models.Model):
+ _inherit = 'calendar.event'
+
+ ics_subscription = fields.Boolean(default=False) # partner_ids + ics_subscription -> its ok to delete
+
+ @api.multi
+ def set_ics_event(self, ics_file, partner):
+ for event in Calendar.from_ical(ics_file).walk('vevent'):
+ #~ if not event.get('uid'):
+ #~ event.add('uid',reduce(lambda x,y: x ^ y, map(ord, str(event.get('dtstart') and event.get('dtstart').dt or '' + event.get('summary') + event.get('dtend') and event.get('dtend').dt or ''))) % 1024)
+
+ summary = ''
+ description = unicode(event.get('description', ''))
+ if unicode(event.get('summary')) and len(unicode(event.get('summary'))) < 35:
+ summary = unicode(event.get('summary'))
+ elif len(unicode(event.get('summary'))) >= 35:
+ summary = unicode(event.get('summary'))[:35]
+ if not event.get('description'):
+ description = unicode(event.get('summary'))
+
+ record = {r[1]:r[2] for r in [ ('dtstart','start_date',event.get('dtstart') and event.get('dtstart').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
+ ('dtend','stop_date',event.get('dtend') and event.get('dtend').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
+ #~ ('dtstamp','start_datetime',event.get('dtstamp') and event.get('dtstamp').dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
+ #~ ('description','description',description),
+ ('duration','duration',event.get('duration')),
+ ('location','location',event.get('location') and unicode(event.get('location')) or partner.ics_location),
+ ('class','class',event.get('class') and str(event.get('class')) or partner.ics_class),
+ ('summary','name',summary),
+ ('rrule', 'rrule',event.get('rrule') and event.get('rrule').to_ical() or None),
+ ] if event.get(r[0])}
+
+ partner_ids = self.env['res.partner'].get_attendee_ids(event)
+ #~ raise Warning(partner_ids)
+ if partner_ids:
+ partner_ids.append(partner.id)
+ else:
+ partner_ids = [partner.id]
+
+ record['partner_ids'] = [(6,0,[partner_ids])]
+ #~ record['partner_ids'] = [(6,0,self.env['res.partner'].get_attendee_ids(event)[0] and self.env['res.partner'].get_attendee_ids(event)[0].append(partner.id) or [partner.id])]
+ #~ raise Warning(record['partner_ids'])
+ #~ record['attendee_ids'] = [(6,0,[attendee])]
+ record['ics_subscription'] = True
+ record['start'] = record.get('start_date')
+ record['stop'] = record.get('stop_date') or record.get('start')
+ record['description'] = description
+ record['show_as'] = partner.ics_show_as
+ record['allday'] = partner.ics_allday
+ #~ record['rrule'] = event.get('rrule').to_ical()
+ #~ raise Warning(record['rrule_type'].to_ical)
+
+ tmpStart = datetime.time(datetime.fromtimestamp(mktime(strptime(record['start'], DEFAULT_SERVER_DATETIME_FORMAT))))
+ tmpStop = datetime.fromtimestamp(mktime(strptime(record['stop'], DEFAULT_SERVER_DATETIME_FORMAT)))
+
+ if tmpStart == time(0,0,0) and tmpStart == datetime.time(tmpStop):
+ record['allday'] = True
+
+ if not record.get('stop_date'):
+ record['allday'] = True
+ record['stop_date'] = record['start_date']
+ elif record.get('stop_date') and record['allday']:
+ record['stop_date'] = vDatetime(tmpStop - timedelta(hours=24)).dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+ record['stop'] = record['stop_date']
+ _logger.error('ICS %s' % record)
+ self.env['calendar.event'].create(record)
+ #~ event_id = self.env['calendar.event'].create(record)
+#~
+ #~ attendee_values = self.env['res.partner'].get_attendee_ids(event)
+ #~ for i in range(len(attendee_values[0])):
+ #~ self.env['calendar.attendee'].create({
+ #~ 'event_id': event_id.id,
+ #~ 'partner_id': attendee_values[0][i],
+ #~ 'email': attendee_values[1][i],
+ #~ })
+
+ #~ 'state': fields.selection(STATE_SELECTION, 'Status', readonly=True, help="Status of the attendee's participation"),
+ #~ 'cn': fields.function(_compute_data, string='Common name', type="char", multi='cn', store=True),
+ #~ 'partner_id': fields.many2one('res.partner', 'Contact', readonly="True"),
+ #~ 'email': fields.char('Email', help="Email of Invited Person"),
+ #~ 'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
+ #~ 'access_token': fields.char('Invitation Token'),
+ #~ 'event_id': fields.many2one('calendar.event', 'Meeting linked', ondelete='cascade'),
+
+ @api.multi
+ def get_ics_event(self):
+ event = self[0]
+ ics = Event()
+ ics = self.env['calendar.attendee'].get_ics_file(event)
+ calendar = Calendar()
+ date_format = DEFAULT_SERVER_DATETIME_FORMAT
+
+
+ #~ for t in ics_record:
+ #~ ics[t[2]] = eval(t[3])
+ #~
+ #~ foo = {ics[t[2]]: event.read([t[1]]) for t in ics_record}
+ #~
+ #~
+ #~ ics['uid'] = event.id
+ #~ ics['allday'] = event.allday
+ #~
+ #~ if ics['allday']:
+ #~ date_format = DEFAULT_SERVER_DATE_FORMAT
+ #~
+ #~ ics['dtstart'] = vDatetime(datetime.fromtimestamp(mktime(strptime(event.start_date, date_format))))
+ #~ ics['dtend'] = vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop_date, date_format))))
+ #~ ics['summary'] = event.name
+ #~ ics['description'] = event.description
+ #~ ics['class'] = event.read(['class'])
+
+ #~ calendar.add_component(ics)
+ #~ raise Warning(calendar.to_ical())
+ return ics
+
+
+ @api.multi
+ def get_ics_file(self, events_exported, partner):
+ """
+ Returns iCalendar file for the event invitation.
+ @param event: event object (browse record)
+ @return: .ics file content
+ """
+ ics = Event()
+ event = self[0]
+
+ #~ raise Warning(self.env.cr.dbname)
+ #~ The method below needs som proper rewriting to avoid overusing libraries.
+ def ics_datetime(idate, allday=False):
+ if idate:
+ if allday:
+ return str(vDatetime(datetime.fromtimestamp(mktime(strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT)))).to_ical())[:8]
+ else:
+ return vDatetime(datetime.fromtimestamp(mktime(strptime(idate, DEFAULT_SERVER_DATETIME_FORMAT)))).to_ical() + 'Z'
+ return False
+
+ #~ try:
+ #~ # FIXME: why isn't this in CalDAV?
+ #~ import vobject
+ #~ except ImportError:
+ #~ return res
+
+ #~ cal = vobject.iCalendar()
+
+ #~ event = cal.add('vevent')
+ if not event.start or not event.stop:
+ raise osv.except_osv(_('Warning!'), _("First you have to specify the date of the invitation."))
+ ics['summary'] = event.name
+ if event.description:
+ ics['description'] = event.description
+ if event.location:
+ ics['location'] = event.location
+ if event.rrule:
+ ics['rrule'] = event.rrule
+ #~ ics.add('rrule', str(event.rrule), encode=0)
+ #~ raise Warning(ics['rrule'])
+
+ if event.alarm_ids:
+ for alarm in event.alarm_ids:
+ valarm = ics.add('valarm')
+ interval = alarm.interval
+ duration = alarm.duration
+ trigger = valarm.add('TRIGGER')
+ trigger.params['related'] = ["START"]
+ if interval == 'days':
+ delta = timedelta(days=duration)
+ elif interval == 'hours':
+ delta = timedelta(hours=duration)
+ elif interval == 'minutes':
+ delta = timedelta(minutes=duration)
+ trigger.value = delta
+ valarm.add('DESCRIPTION').value = alarm.name or 'Odoo'
+ if event.attendee_ids:
+ for attendee in event.attendee_ids:
+ attendee_add = ics.get('attendee')
+ attendee_add = attendee.cn and ('CN=' + attendee.cn) or ''
+ if attendee.cn and attendee.email:
+ attendee_add += ':'
+ attendee_add += attendee.email and ('MAILTO:' + attendee.email) or ''
+
+ ics.add('attendee', attendee_add, encode=0)
+
+ if events_exported:
+ event_not_found = True
+
+ for event_comparison in events_exported:
+ #~ raise Warning('event_comparison = %s ics = %s' % (event_comparison, ics))
+ if str(ics) == event_comparison:
+ event_not_found = False
+ break
+
+ if event_not_found:
+ events_exported.append(str(ics))
+
+ ics['uid'] = '%s@%s-%s' % (event.id, self.env.cr.dbname, partner.id)
+ ics['created'] = ics_datetime(strftime(DEFAULT_SERVER_DATETIME_FORMAT))
+ tmpStart = ics_datetime(event.start, event.allday)
+ tmpEnd = ics_datetime(event.stop, event.allday)
+
+ if event.allday:
+ ics['dtstart;value=date'] = tmpStart
+ else:
+ ics['dtstart'] = tmpStart
+
+ if tmpStart != tmpEnd or not event.allday:
+ if event.allday:
+ ics['dtend;value=date'] = str(vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop, DEFAULT_SERVER_DATETIME_FORMAT))) + timedelta(hours=24)).to_ical())[:8]
+ else:
+ ics['dtend'] = tmpEnd
+
+ return [ics, events_exported]
+
+ else:
+ events_exported.append(str(ics))
+
+ ics['uid'] = '%s@%s-%s' % (event.id, self.env.cr.dbname, partner.id)
+ ics['created'] = ics_datetime(strftime(DEFAULT_SERVER_DATETIME_FORMAT))
+ tmpStart = ics_datetime(event.start, event.allday)
+ tmpEnd = ics_datetime(event.stop, event.allday)
+
+ if event.allday:
+ ics['dtstart;value=date'] = tmpStart
+ else:
+ ics['dtstart'] = tmpStart
+
+ if tmpStart != tmpEnd or not event.allday:
+ if event.allday:
+ ics['dtend;value=date'] = str(vDatetime(datetime.fromtimestamp(mktime(strptime(event.stop, DEFAULT_SERVER_DATETIME_FORMAT))) + timedelta(hours=24)).to_ical())[:8]
+ else:
+ ics['dtend'] = tmpEnd
+
+ return [ics, events_exported]
+
+ @api.multi
+ def get_ics_freebusy(self):
+ """
+ Returns iCalendar file for the event invitation.
+ @param event: event object (browse record)
+ @return: .ics file content
+ """
+ #~ ics = FreeBusy()
+ event = self[0]
+
+ def ics_datetime(idate, iallday=False):
+ if idate:
+ return vDatetime(idate).to_ical()
+ return False
+
+ if not event.start or not event.stop:
+ raise osv.except_osv(_('Warning!'), _("First you have to specify the date of the invitation."))
+
+ allday = event.allday
+ event_start = datetime.fromtimestamp(mktime(strptime(event.start, DEFAULT_SERVER_DATETIME_FORMAT)))
+ event_stop = datetime.fromtimestamp(mktime(strptime(event.stop, DEFAULT_SERVER_DATETIME_FORMAT)))
+
+ if allday:
+ event_stop += timedelta(hours=23, minutes=59, seconds=59)
+
+ return '%s/%s' % (ics_datetime(event_start, allday), ics_datetime(event_stop, allday))
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/calendar_ics/calendar.pyc b/calendar_ics/calendar.pyc
new file mode 100644
index 0000000..926898d
Binary files /dev/null and b/calendar_ics/calendar.pyc differ
diff --git a/calendar_ics/calendar_ics_demo.xml b/calendar_ics/calendar_ics_demo.xml
new file mode 100644
index 0000000..6673e43
--- /dev/null
+++ b/calendar_ics/calendar_ics_demo.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+ Demo meeting about meat
+ Meeting to discuss project plan and hash out the details of implementation.
+
+
+
+
+
+ open
+
+
+
+
+
+
+ Demo Kickoff
+ Weekend at burneys
+
+
+
+
+
+ open
+
+
+
+
+
+
+ Demo Bring the meat.
+ All you can eat buffe.
+
+
+
+
+
+ open
+
+
+
+
+
+
+ Demo Trash the meat grinder
+ Bring your own hammers and tools
+ BurgerTown, 31 butcherstreet
+
+
+
+
+
+ open
+
+
+
+
+
+
+ Demo Trash the meat grinder reunion!
+ Bring your own hammers and tools AND meat this time
+ BurgerTown, 31 butcherstreet
+
+
+
+
+
+ open
+
+
+
diff --git a/calendar_ics/calendar_view.xml b/calendar_ics/calendar_view.xml
new file mode 100644
index 0000000..b8eaa0b
--- /dev/null
+++ b/calendar_ics/calendar_view.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+ Calendar - ics url
+ calendar.ics
+
+
+
+
+
+
+
+
+
+ Calendar ics-url
+ calendar.ics
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Calendar ics Search
+ calendar.ics
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Calendar ics
+ calendar.ics
+ tree,form
+
+
+
+
+ Click to schedule a new Calendar ics url.
+
+ The calendar events in the url updates the calendar.
+
+
+
+
+
+
+
+ tree
+
+
+
+
+
+ form
+
+
+
+
+
+
+
+
+
+
diff --git a/calendar_ics/res_partner - Copie.py b/calendar_ics/res_partner - Copie.py
new file mode 100644
index 0000000..6187b99
--- /dev/null
+++ b/calendar_ics/res_partner - Copie.py
@@ -0,0 +1,287 @@
+from openerp import models, fields, api, _
+from pytz import timezone
+from openerp.exceptions import except_orm, Warning, RedirectWarning
+from datetime import datetime, timedelta, time
+from time import strptime, mktime, strftime
+from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
+import re
+
+from openerp import http
+from openerp.http import request
+
+import logging
+_logger = logging.getLogger(__name__)
+
+#Debuggger package
+#import pdb
+## APPELER "pdb.set_trace()" pour faire un point de debuggage qu'on peut piloter ensuite depuis la console
+
+try:
+ from icalendar import Calendar, Event, vDatetime, FreeBusy
+except ImportError:
+ raise Warning('icalendar library missing, pip install icalendar')
+
+try:
+ import urllib2
+except ImportError:
+ raise Warning('urllib2 library missing, pip install urllib2')
+
+class res_partner_icalendar(http.Controller):
+# http://partner//calendar/[private.ics|freebusy.ics|public.ics]
+ #~ simple_blog_list = request.env['blog.post'].sudo().search([('blog_id', '=', simple_blog.id)], order='message_last_post desc')
+
+ #~ @http.route(['/partner//calendar/private.ics'], type='http', auth="public", website=True)
+ #~ def icalendar_private(self, partner=False, **post):
+ #~ if partner:
+ #~ document = partner.sudo().get_ics_calendar(type='private').to_ical()
+ #~ return request.make_response(
+ #~ headers=[('WWW-Authenticate', 'Basic realm="MaxRealm"')]
+ #~ )
+ #~ else:
+ #~ raise Warning("Private failed")
+ #~ pass # Some error page
+
+ @http.route(['/partner//calendar/freebusy.ics'], type='http', auth="public", website=True)
+ def icalendar_freebusy(self, partner=False, **post):
+ if partner:
+ #~ raise Warning("Public successfull %s" % partner.get_ics_calendar(type='public').to_ical())
+ #~ return partner.get_ics_calendar(type='public').to_ical()
+ document = partner.sudo().get_ics_calendar(type='freebusy').to_ical()
+ return request.make_response(
+ document,
+ headers=[
+ ('Content-Disposition', 'attachment; filename="freebusy.ifb"'),
+ ('Content-Type', 'text/calendar'),
+ ('Content-Length', len(document)),
+ ]
+ )
+ else:
+ raise Warning()
+ pass # Some error page
+
+ #@http.route(['/partner//calendar/public.ics'], type='http', auth="public", website=True)
+ @http.route(['/calendar-ics///public.ics'], auth="public")
+ def icalendar_public(self, partner_id, **post):
+ #pdb.set_trace()
+
+ partner = http.request.env['res.partner'].sudo().search([('id','=',partner_id)])
+ if partner:
+ #~ raise Warning("Public successfull %s" % partner.get_ics_calendar(type='public').to_ical())
+ #~ return partner.sudo().get_ics_calendar(type='public')
+ document = partner.sudo().get_ics_calendar(type='public')
+ return request.make_response(
+ document,
+ headers=[
+ ('Content-Disposition', 'attachment; filename="public.ics"'),
+ ('Content-Type', 'text/calendar'),
+ ('Content-Length', len(document)),
+ ]
+ )
+ else:
+ raise Warning("Public failed")
+ pass # Some error page
+
+class res_partner(models.Model):
+ _inherit = "res.partner"
+
+ ics_url = fields.Char(string='Url',required=False)
+ ics_active = fields.Boolean(string='Active',default=False)
+ ics_nextdate = fields.Datetime(string="Next")
+ #~ ics_frequency = fields.Integer(string="Frequency",default=60, help="Frequency in minutes, 60 = every hour, 1440 once per day, 10080 week, 43920 month, 131760 quarterly")
+ ics_frequency = fields.Selection([('15', 'Every fifteen minutes'), ('60', 'Every hour'), ('360', 'Four times a day'), ('1440', 'Once per day'), ('10080', 'Once every week'), ('43920', 'Once every month'), ('131760', 'Once every third month')], string='Frequency', default='60')
+ ics_class = fields.Selection([('private', 'Private'), ('public', 'Public'), ('confidential', 'Public for Employees')], string='Privacy', default='private')
+ ics_show_as = fields.Selection([('free', 'Free'), ('busy', 'Busy')], string='Show Time as')
+ ics_location = fields.Char(string='Location', help="Location of Event")
+ ics_allday = fields.Boolean(string='All Day')
+ ics_url_field = fields.Char(string='URL to the calendar', compute='create_ics_url')
+
+ @api.one
+ def create_ics_url(self):
+ self.ics_url_field = '%s/partner/%s/calendar/public.ics' % (self.env['ir.config_parameter'].sudo().get_param('web.base.url'), self.id)
+
+ @api.v7
+ def ics_cron_job(self, cr, uid, context=None):
+ for ics in self.pool.get('res.partner').browse(cr, uid, self.pool.get('res.partner').search(cr, uid, [('ics_active','=',True)])):
+ if (datetime.fromtimestamp(mktime(strptime(ics.ics_nextdate, DEFAULT_SERVER_DATETIME_FORMAT))) < datetime.today()):
+ ics.get_ics_events()
+ ics.ics_nextdate = datetime.fromtimestamp(mktime(strptime(ics.ics_nextdate, DEFAULT_SERVER_DATETIME_FORMAT))) + timedelta(minutes=int(ics.ics_frequency))
+ _logger.info('Cron job for %s done' % ics.name)
+
+ @api.one
+ def rm_ics_events(self):
+ self.env['calendar.event'].search(['&',('partner_ids','in',self.id),('ics_subscription','=',True)]).unlink()
+
+ @api.one
+ def get_ics_events(self):
+ if (self.ics_url):
+ try:
+ res = urllib2.urlopen(self.ics_url).read()
+ except urllib2.HTTPError as e:
+ _logger.error('ICS a %s %s' % (e.code, e.reason))
+ return False
+ except urllib2.URLError as e:
+ _logger.error('ICS c %s %s' % (e.code, e.reason))
+ return False
+ _logger.error('ICS %s' % res)
+
+ self.env['calendar.event'].search(['&',('partner_ids','in',self.id),('ics_subscription','=',True)]).unlink()
+ #~ for event in self.env['calendar.event'].search([('ics_id','=',self.id)]):
+ #~ event.unlink()
+
+ self.env['calendar.event'].set_ics_event(res, self)
+
+ @api.multi
+ def get_attendee_ids(self, event):
+ #~ raise Warning('get_attendee_ids run')
+ partner_ids = []
+ #~ attendee_mails = []
+ event_attendee_list = event.get('attendee')
+ if event_attendee_list:
+ if not (type(event_attendee_list) is list):
+ event_attendee_list = [event_attendee_list]
+
+ for vAttendee in event_attendee_list:
+ _logger.error('Attendee found %s' % vAttendee)
+ attendee_mailto = re.search('(:MAILTO:)([a-zA-Z0-9_@.\-]*)', vAttendee)
+ attendee_cn = re.search('(CN=)([^:]*)', vAttendee)
+ if attendee_mailto:
+ attendee_mailto = attendee_mailto.group(2)
+ if attendee_cn:
+ attendee_cn = attendee_cn.group(2)
+ elif not attendee_mailto and not attendee_cn:
+ attendee_cn = vAttendee
+ _logger.error('Attendee found %s' % attendee_cn)
+
+ #~ raise Warning('%s %s' % (vAttendee, attendee_cn))
+ if attendee_mailto:
+ partner_result = self.env['res.partner'].search([('email','=',attendee_mailto)])
+
+ if not partner_result:
+ partner_id = self.env['res.partner'].create({
+ 'email': attendee_mailto,
+ 'name': attendee_cn or attendee_mailto,
+ })
+ else:
+ partner_id = partner_result[0]
+ elif attendee_cn:
+ partner_result = self.env['res.partner'].search([('name','=',attendee_cn)])
+
+ if not partner_result:
+ partner_id = self.env['res.partner'].create({
+ 'name': attendee_cn or attendee_mailto,
+ })
+ else:
+ partner_id = partner_result[0]
+
+ #~ self.env['calendar.attendee'].create({
+ #~ 'event_id': event_id.id,
+ #~ 'partner_id': partner_id.id or None,
+ #~ 'email': attendee_mailto or '',
+ #~ })
+
+ partner_ids.append(partner_id.id or None)
+ #~ attendee_mails.append(attendee_mailto or '')
+
+ return partner_ids
+ #~ return [partner_ids, attendee_mails]
+
+ def get_ics_calendar(self,type='public'):
+ calendar = Calendar()
+ if type == 'private':
+ for event in self.env['calendar.event'].search([('partner_ids','in',self.id)]):
+ calendar.add_component(event.get_ics_file())
+ elif type == 'freebusy':
+ fc = FreeBusy()
+
+ organizer_add = self.name and ('CN=' + self.name) or ''
+ if self.name and self.email:
+ organizer_add += ':'
+ organizer_add += self.email and ('MAILTO:' + self.email) or ''
+ fc['organizer'] = organizer_add
+
+ for event in self.env['calendar.event'].search([('partner_ids','in',self.id)]):
+ fc.add('freebusy', event.get_ics_freebusy(), encode=0)
+ #~ fb.add_component(fc)
+ return fc
+ elif type == 'public':
+ #~ raise Warning(self.env['calendar.event'].search([('partner_ids','in',self.id)]))
+ exported_ics = []
+ for event in reversed(self.env['calendar.event'].search([('partner_ids','in',self.id)])):
+ temporary_ics = event.get_ics_file(exported_ics, self)
+ if temporary_ics:
+ exported_ics.append(temporary_ics[1])
+ #~ temporary_ics[0].add('url', self.ics_url_field, encode=0)
+ calendar.add_component(temporary_ics[0])
+ #~ calendar.add('vevent', temporary_ics[0], encode=0)
+
+ #~ for attendees in event.attendee_ids:
+ #~ calendar.add('attendee', event.get_event_attendees(attendees), encode=0)
+
+ tmpCalendar = calendar.to_ical()
+ tmpSearch = re.findall('RRULE:[^\n]*\\;[^\n]*', tmpCalendar)
+
+ for counter in range(len(tmpSearch)):
+ tmpCalendar = tmpCalendar.replace(tmpSearch[counter], tmpSearch[counter].replace('\\;', ';', tmpSearch[counter].count('\\;')))
+
+ #~ raise Warning(tmpCalendar)
+
+ return tmpCalendar
+
+ @api.multi
+ def ics_mail(self,context=None):
+ #raise Warning('%s | %s' % (ids,picking))
+ compose_form = self.env.ref('mail.email_compose_message_wizard_form', False)
+ #~ raise Warning("%s compose_form" % compose_form)
+ mail= self.env['mail.compose.message'].create({
+ 'template_id':self.env.ref('calendar_ics.email_ics_url').id,
+ 'model': 'res.partner',
+ 'res_id': self.id,
+ })
+ mail.write(mail.onchange_template_id( # gets defaults from template
+ self.env.ref('calendar_ics.email_ics_url').id, mail.composition_mode,
+ mail.model, mail.res_id,context=context
+ )['value'])
+ return {
+ 'name': _('Compose Email'),
+ 'type': 'ir.actions.act_window',
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'mail.compose.message',
+ 'res_id':mail.id,
+ 'views': [(compose_form.id, 'form')],
+ 'view_id': compose_form.id,
+ 'target': 'new',
+ }
+
+ return {'value': {'partner_id': False}, 'warning': {'title': 'Hello', 'message': 'Hejsan'}}
+
+
+ #~ ics['freebusy'] = '%s/%s' % (ics_datetime(event.start, event.allday), ics_datetime(event.stop, event.allday))
+
+ # vtodo, vjournal, vfreebusy
+
+
+ #~ eventprop = *(
+
+ #~ ; the following are optional,
+ #~ ; but MUST NOT occur more than once
+
+ #~ class / created / description / dtstart / geo /
+ #~ last-mod / location / organizer / priority /
+ #~ dtstamp / seq / status / summary / transp /
+ #~ uid / url / recurid /
+
+ #~ ; either 'dtend' or 'duration' may appear in
+ #~ ; a 'eventprop', but 'dtend' and 'duration'
+ #~ ; MUST NOT occur in the same 'eventprop'
+
+ #~ dtend / duration /
+
+ #~ ; the following are optional,
+ #~ ; and MAY occur more than once
+
+ #~ attach / attendee / categories / comment /
+ #~ contact / exdate / exrule / rstatus / related /
+ #~ resources / rdate / rrule / x-prop
+
+ #~ )
diff --git a/calendar_ics/res_partner.py b/calendar_ics/res_partner.py
new file mode 100644
index 0000000..6ac6e43
--- /dev/null
+++ b/calendar_ics/res_partner.py
@@ -0,0 +1,279 @@
+from openerp import models, fields, api, _
+from pytz import timezone
+from openerp.exceptions import except_orm, Warning, RedirectWarning
+from datetime import datetime, timedelta, time
+from time import strptime, mktime, strftime
+from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
+import re
+
+from openerp import http
+from openerp.http import request
+
+import logging
+_logger = logging.getLogger(__name__)
+
+try:
+ from icalendar import Calendar, Event, vDatetime, FreeBusy
+except ImportError:
+ raise Warning('icalendar library missing, pip install icalendar')
+
+try:
+ import urllib2
+except ImportError:
+ raise Warning('urllib2 library missing, pip install urllib2')
+
+class res_partner_icalendar(http.Controller):
+# http://partner//calendar/[private.ics|freebusy.ics|public.ics]
+ #~ simple_blog_list = request.env['blog.post'].sudo().search([('blog_id', '=', simple_blog.id)], order='message_last_post desc')
+
+ #~ @http.route(['/partner//calendar/private.ics'], type='http', auth="public", website=True)
+ #~ def icalendar_private(self, partner=False, **post):
+ #~ if partner:
+ #~ document = partner.sudo().get_ics_calendar(type='private').to_ical()
+ #~ return request.make_response(
+ #~ headers=[('WWW-Authenticate', 'Basic realm="MaxRealm"')]
+ #~ )
+ #~ else:
+ #~ raise Warning("Private failed")
+ #~ pass # Some error page
+
+ @http.route(['/partner//calendar/freebusy.ics'], type='http', auth="public", website=True)
+ def icalendar_freebusy(self, partner=False, **post):
+ if partner:
+ #~ raise Warning("Public successfull %s" % partner.get_ics_calendar(type='public').to_ical())
+ #~ return partner.get_ics_calendar(type='public').to_ical()
+ document = partner.sudo().get_ics_calendar(type='freebusy').to_ical()
+ return request.make_response(
+ document,
+ headers=[
+ ('Content-Disposition', 'attachment; filename="freebusy.ifb"'),
+ ('Content-Type', 'text/calendar'),
+ ('Content-Length', len(document)),
+ ]
+ )
+ else:
+ raise Warning()
+ pass # Some error page
+
+ @http.route(['/partner//calendar/public.ics'], type='http', auth="public", website=True)
+ def icalendar_public(self, partner=False, **post):
+ if partner:
+ #~ raise Warning("Public successfull %s" % partner.get_ics_calendar(type='public').to_ical())
+ #~ return partner.sudo().get_ics_calendar(type='public')
+ document = partner.sudo().get_ics_calendar(type='public')
+ return request.make_response(
+ document,
+ headers=[
+ ('Content-Disposition', 'attachment; filename="public.ics"'),
+ ('Content-Type', 'text/calendar'),
+ ('Content-Length', len(document)),
+ ]
+ )
+ else:
+ raise Warning("Public failed")
+ pass # Some error page
+
+class res_partner(models.Model):
+ _inherit = "res.partner"
+
+ ics_url = fields.Char(string='Url',required=False)
+ ics_active = fields.Boolean(string='Active',default=False)
+ ics_nextdate = fields.Datetime(string="Next")
+ #~ ics_frequency = fields.Integer(string="Frequency",default=60, help="Frequency in minutes, 60 = every hour, 1440 once per day, 10080 week, 43920 month, 131760 quarterly")
+ ics_frequency = fields.Selection([('15', 'Every fifteen minutes'), ('60', 'Every hour'), ('360', 'Four times a day'), ('1440', 'Once per day'), ('10080', 'Once every week'), ('43920', 'Once every month'), ('131760', 'Once every third month')], string='Frequency', default='60')
+ ics_class = fields.Selection([('private', 'Private'), ('public', 'Public'), ('confidential', 'Public for Employees')], string='Privacy', default='private')
+ ics_show_as = fields.Selection([('free', 'Free'), ('busy', 'Busy')], string='Show Time as')
+ ics_location = fields.Char(string='Location', help="Location of Event")
+ ics_allday = fields.Boolean(string='All Day')
+ ics_url_field = fields.Char(string='URL to the calendar', compute='create_ics_url')
+
+ @api.one
+ def create_ics_url(self):
+ self.ics_url_field = '%s/partner/%s/calendar/public.ics' % (self.env['ir.config_parameter'].sudo().get_param('web.base.url'), self.id)
+
+ @api.v7
+ def ics_cron_job(self, cr, uid, context=None):
+ for ics in self.pool.get('res.partner').browse(cr, uid, self.pool.get('res.partner').search(cr, uid, [('ics_active','=',True)])):
+ if (datetime.fromtimestamp(mktime(strptime(ics.ics_nextdate, DEFAULT_SERVER_DATETIME_FORMAT))) < datetime.today()):
+ ics.get_ics_events()
+ ics.ics_nextdate = datetime.fromtimestamp(mktime(strptime(ics.ics_nextdate, DEFAULT_SERVER_DATETIME_FORMAT))) + timedelta(minutes=int(ics.ics_frequency))
+ _logger.info('Cron job for %s done' % ics.name)
+
+ @api.one
+ def rm_ics_events(self):
+ self.env['calendar.event'].search(['&',('partner_ids','in',self.id),('ics_subscription','=',True)]).unlink()
+
+ @api.one
+ def get_ics_events(self):
+ if (self.ics_url):
+ try:
+ res = urllib2.urlopen(self.ics_url).read()
+ except urllib2.HTTPError as e:
+ _logger.error('ICS a %s %s' % (e.code, e.reason))
+ return False
+ except urllib2.URLError as e:
+ _logger.error('ICS c %s %s' % (e.code, e.reason))
+ return False
+ _logger.error('ICS %s' % res)
+
+ self.env['calendar.event'].search(['&',('partner_ids','in',self.id),('ics_subscription','=',True)]).unlink()
+ #~ for event in self.env['calendar.event'].search([('ics_id','=',self.id)]):
+ #~ event.unlink()
+
+ self.env['calendar.event'].set_ics_event(res, self)
+
+ @api.multi
+ def get_attendee_ids(self, event):
+ #~ raise Warning('get_attendee_ids run')
+ partner_ids = []
+ #~ attendee_mails = []
+ event_attendee_list = event.get('attendee')
+ if event_attendee_list:
+ if not (type(event_attendee_list) is list):
+ event_attendee_list = [event_attendee_list]
+
+ for vAttendee in event_attendee_list:
+ _logger.error('Attendee found %s' % vAttendee)
+ attendee_mailto = re.search('(:MAILTO:)([a-zA-Z0-9_@.\-]*)', vAttendee)
+ attendee_cn = re.search('(CN=)([^:]*)', vAttendee)
+ if attendee_mailto:
+ attendee_mailto = attendee_mailto.group(2)
+ if attendee_cn:
+ attendee_cn = attendee_cn.group(2)
+ elif not attendee_mailto and not attendee_cn:
+ attendee_cn = vAttendee
+ _logger.error('Attendee found %s' % attendee_cn)
+
+ #~ raise Warning('%s %s' % (vAttendee, attendee_cn))
+ if attendee_mailto:
+ partner_result = self.env['res.partner'].search([('email','=',attendee_mailto)])
+
+ if not partner_result:
+ partner_id = self.env['res.partner'].create({
+ 'email': attendee_mailto,
+ 'name': attendee_cn or attendee_mailto,
+ })
+ else:
+ partner_id = partner_result[0]
+ elif attendee_cn:
+ partner_result = self.env['res.partner'].search([('name','=',attendee_cn)])
+
+ if not partner_result:
+ partner_id = self.env['res.partner'].create({
+ 'name': attendee_cn or attendee_mailto,
+ })
+ else:
+ partner_id = partner_result[0]
+
+ #~ self.env['calendar.attendee'].create({
+ #~ 'event_id': event_id.id,
+ #~ 'partner_id': partner_id.id or None,
+ #~ 'email': attendee_mailto or '',
+ #~ })
+
+ partner_ids.append(partner_id.id or None)
+ #~ attendee_mails.append(attendee_mailto or '')
+
+ return partner_ids
+ #~ return [partner_ids, attendee_mails]
+
+ def get_ics_calendar(self,type='public'):
+ calendar = Calendar()
+ if type == 'private':
+ for event in self.env['calendar.event'].search([('partner_ids','in',self.id)]):
+ calendar.add_component(event.get_ics_file())
+ elif type == 'freebusy':
+ fc = FreeBusy()
+
+ organizer_add = self.name and ('CN=' + self.name) or ''
+ if self.name and self.email:
+ organizer_add += ':'
+ organizer_add += self.email and ('MAILTO:' + self.email) or ''
+ fc['organizer'] = organizer_add
+
+ for event in self.env['calendar.event'].search([('partner_ids','in',self.id)]):
+ fc.add('freebusy', event.get_ics_freebusy(), encode=0)
+ #~ fb.add_component(fc)
+ return fc
+ elif type == 'public':
+ #~ raise Warning(self.env['calendar.event'].search([('partner_ids','in',self.id)]))
+ exported_ics = []
+ for event in reversed(self.env['calendar.event'].search([('partner_ids','in',self.id)])):
+ temporary_ics = event.get_ics_file(exported_ics, self)
+ if temporary_ics:
+ exported_ics.append(temporary_ics[1])
+ #~ temporary_ics[0].add('url', self.ics_url_field, encode=0)
+ calendar.add_component(temporary_ics[0])
+ #~ calendar.add('vevent', temporary_ics[0], encode=0)
+
+ #~ for attendees in event.attendee_ids:
+ #~ calendar.add('attendee', event.get_event_attendees(attendees), encode=0)
+
+ tmpCalendar = calendar.to_ical()
+ tmpSearch = re.findall('RRULE:[^\n]*\\;[^\n]*', tmpCalendar)
+
+ for counter in range(len(tmpSearch)):
+ tmpCalendar = tmpCalendar.replace(tmpSearch[counter], tmpSearch[counter].replace('\\;', ';', tmpSearch[counter].count('\\;')))
+
+ #~ raise Warning(tmpCalendar)
+
+ return tmpCalendar
+
+ @api.multi
+ def ics_mail(self,context=None):
+ #raise Warning('%s | %s' % (ids,picking))
+ compose_form = self.env.ref('mail.email_compose_message_wizard_form', False)
+ #~ raise Warning("%s compose_form" % compose_form)
+ mail= self.env['mail.compose.message'].create({
+ 'template_id':self.env.ref('calendar_ics.email_ics_url').id,
+ 'model': 'res.partner',
+ 'res_id': self.id,
+ })
+ mail.write(mail.onchange_template_id( # gets defaults from template
+ self.env.ref('calendar_ics.email_ics_url').id, mail.composition_mode,
+ mail.model, mail.res_id,context=context
+ )['value'])
+ return {
+ 'name': _('Compose Email'),
+ 'type': 'ir.actions.act_window',
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'mail.compose.message',
+ 'res_id':mail.id,
+ 'views': [(compose_form.id, 'form')],
+ 'view_id': compose_form.id,
+ 'target': 'new',
+ }
+
+ return {'value': {'partner_id': False}, 'warning': {'title': 'Hello', 'message': 'Hejsan'}}
+
+
+ #~ ics['freebusy'] = '%s/%s' % (ics_datetime(event.start, event.allday), ics_datetime(event.stop, event.allday))
+
+ # vtodo, vjournal, vfreebusy
+
+
+ #~ eventprop = *(
+
+ #~ ; the following are optional,
+ #~ ; but MUST NOT occur more than once
+
+ #~ class / created / description / dtstart / geo /
+ #~ last-mod / location / organizer / priority /
+ #~ dtstamp / seq / status / summary / transp /
+ #~ uid / url / recurid /
+
+ #~ ; either 'dtend' or 'duration' may appear in
+ #~ ; a 'eventprop', but 'dtend' and 'duration'
+ #~ ; MUST NOT occur in the same 'eventprop'
+
+ #~ dtend / duration /
+
+ #~ ; the following are optional,
+ #~ ; and MAY occur more than once
+
+ #~ attach / attendee / categories / comment /
+ #~ contact / exdate / exrule / rstatus / related /
+ #~ resources / rdate / rrule / x-prop
+
+ #~ )
diff --git a/calendar_ics/res_partner.pyc b/calendar_ics/res_partner.pyc
new file mode 100644
index 0000000..932c099
Binary files /dev/null and b/calendar_ics/res_partner.pyc differ
diff --git a/calendar_ics/res_partner_data.xml b/calendar_ics/res_partner_data.xml
new file mode 100644
index 0000000..7e5bbad
--- /dev/null
+++ b/calendar_ics/res_partner_data.xml
@@ -0,0 +1,29 @@
+
+
+
+
+ ics_url
+ admin@example.com
+
+ Calendar ics url
+ ${(object.email or '')|safe}
+
+
+ Use this url for the ${object.name} calendar:
+ ${object.ics_url_field}
+ ]]>
+
+
+
+ Generate Recurring Calendar updates for Partners
+ 15
+ minutes
+ -1
+
+
+
+
+
+
diff --git a/calendar_ics/res_partner_view.xml b/calendar_ics/res_partner_view.xml
new file mode 100644
index 0000000..4812722
--- /dev/null
+++ b/calendar_ics/res_partner_view.xml
@@ -0,0 +1,32 @@
+
+
+
+
+ res.partner.ics
+ res.partner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/calendar_ics/security/ir.model.access.csv b/calendar_ics/security/ir.model.access.csv
new file mode 100644
index 0000000..bdd5aa6
--- /dev/null
+++ b/calendar_ics/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
+access_calendar_ics_manager,res.groups,model_calendar_ics,base.group_erp_manager,1,1,1,1
+access_calendar_ics_all,res.groups,model_calendar_ics,,1,0,0,0
diff --git a/google_account/__init__.py b/google_account/__init__.py
new file mode 100644
index 0000000..24a68d8
--- /dev/null
+++ b/google_account/__init__.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+import google_account
+import controllers
+
+from .google_account import TIMEOUT # noqa
diff --git a/google_account/__openerp__.py b/google_account/__openerp__.py
new file mode 100644
index 0000000..c7f4791
--- /dev/null
+++ b/google_account/__openerp__.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2010 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+
+{
+ 'name': 'Google Users',
+ 'version': '1.0',
+ 'category': 'Tools',
+ 'description': """
+The module adds google user in res user.
+========================================
+""",
+ 'author': 'OpenERP SA',
+ 'website': 'https://www.odoo.com',
+ 'depends': ['base_setup'],
+ 'data': [
+ 'google_account_data.xml',
+ ],
+ 'demo': [],
+ 'installable': True,
+ 'auto_install': False,
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/google_account/controllers/__init__.py b/google_account/controllers/__init__.py
new file mode 100644
index 0000000..8ee9bae
--- /dev/null
+++ b/google_account/controllers/__init__.py
@@ -0,0 +1 @@
+import main
diff --git a/google_account/controllers/main.py b/google_account/controllers/main.py
new file mode 100644
index 0000000..2a3a4ae
--- /dev/null
+++ b/google_account/controllers/main.py
@@ -0,0 +1,32 @@
+import simplejson
+import urllib
+import openerp
+from openerp import http
+from openerp.http import request
+import openerp.addons.web.controllers.main as webmain
+from openerp.addons.web.http import SessionExpiredException
+from werkzeug.exceptions import BadRequest
+import werkzeug.utils
+
+class google_auth(http.Controller):
+
+ @http.route('/google_account/authentication', type='http', auth="none")
+ def oauth2callback(self, **kw):
+ """ This route/function is called by Google when user Accept/Refuse the consent of Google """
+
+ state = simplejson.loads(kw['state'])
+ dbname = state.get('d')
+ service = state.get('s')
+ url_return = state.get('f')
+
+ registry = openerp.modules.registry.RegistryManager.get(dbname)
+ with registry.cursor() as cr:
+ if kw.get('code',False):
+ registry.get('google.%s' % service).set_all_tokens(cr,request.session.uid,kw['code'])
+ return werkzeug.utils.redirect(url_return)
+ elif kw.get('error'):
+ return werkzeug.utils.redirect("%s%s%s" % (url_return ,"?error=" , kw.get('error')))
+ else:
+ return werkzeug.utils.redirect("%s%s" % (url_return ,"?error=Unknown_error"))
+
+
diff --git a/google_account/google_account.py b/google_account/google_account.py
new file mode 100644
index 0000000..ea1482d
--- /dev/null
+++ b/google_account/google_account.py
@@ -0,0 +1,189 @@
+# -*- coding: utf-8 -*-
+
+import openerp
+from openerp.http import request
+from openerp.osv import osv
+from openerp import SUPERUSER_ID
+from openerp.tools.translate import _
+from datetime import datetime
+from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
+
+import werkzeug.urls
+import urllib2
+import simplejson
+
+import logging
+_logger = logging.getLogger(__name__)
+
+TIMEOUT = 20
+
+class google_service(osv.osv_memory):
+ _name = 'google.service'
+
+ def generate_refresh_token(self, cr, uid, service, authorization_code, context=None):
+ ir_config = self.pool['ir.config_parameter']
+ client_id = ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service)
+ client_secret = ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_secret' % service)
+ redirect_uri = ir_config.get_param(cr, SUPERUSER_ID, 'google_redirect_uri')
+
+ #Get the Refresh Token From Google And store it in ir.config_parameter
+ headers = {"Content-type": "application/x-www-form-urlencoded"}
+ data = dict(code=authorization_code, client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri, grant_type="authorization_code")
+ data = werkzeug.url_encode(data)
+ try:
+ req = urllib2.Request("https://accounts.google.com/o/oauth2/token", data, headers)
+ content = urllib2.urlopen(req, timeout=TIMEOUT).read()
+ except urllib2.HTTPError:
+ error_msg = "Something went wrong during your token generation. Maybe your Authorization Code is invalid or already expired"
+ raise self.pool.get('res.config.settings').get_config_warning(cr, _(error_msg), context=context)
+
+ content = simplejson.loads(content)
+ return content.get('refresh_token')
+
+ def _get_google_token_uri(self, cr, uid, service, scope, context=None):
+ ir_config = self.pool['ir.config_parameter']
+ params = {
+ 'scope': scope,
+ 'redirect_uri': ir_config.get_param(cr, SUPERUSER_ID, 'google_redirect_uri'),
+ 'client_id': ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service),
+ 'response_type': 'code',
+ 'client_id': ir_config.get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % service),
+ }
+ uri = 'https://accounts.google.com/o/oauth2/auth?%s' % werkzeug.url_encode(params)
+ return uri
+
+ # If no scope is passed, we use service by default to get a default scope
+ def _get_authorize_uri(self, cr, uid, from_url, service, scope=False, context=None):
+ """ This method return the url needed to allow this instance of OpenErp to access to the scope of gmail specified as parameters """
+ state_obj = dict(d=cr.dbname, s=service, f=from_url)
+
+ base_url = self.get_base_url(cr, uid, context)
+ client_id = self.get_client_id(cr, uid, service, context)
+
+ params = {
+ 'response_type': 'code',
+ 'client_id': client_id,
+ 'state': simplejson.dumps(state_obj),
+ 'scope': scope or 'https://www.googleapis.com/auth/%s' % (service,),
+ 'redirect_uri': base_url + '/google_account/authentication',
+ 'approval_prompt': 'force',
+ 'access_type': 'offline'
+ }
+
+ uri = self.get_uri_oauth(a='auth') + "?%s" % werkzeug.url_encode(params)
+ return uri
+
+ def _get_google_token_json(self, cr, uid, authorize_code, service, context=None):
+ res = False
+ base_url = self.get_base_url(cr, uid, context)
+ client_id = self.get_client_id(cr, uid, service, context)
+ client_secret = self.get_client_secret(cr, uid, service, context)
+
+ params = {
+ 'code': authorize_code,
+ 'client_id': client_id,
+ 'client_secret': client_secret,
+ 'grant_type': 'authorization_code',
+ 'redirect_uri': base_url + '/google_account/authentication'
+ }
+
+ headers = {"content-type": "application/x-www-form-urlencoded"}
+
+ try:
+ uri = self.get_uri_oauth(a='token')
+ data = werkzeug.url_encode(params)
+
+ st, res, ask_time = self._do_request(cr, uid, uri, params=data, headers=headers, type='POST', preuri='', context=context)
+ except urllib2.HTTPError:
+ error_msg = "Something went wrong during your token generation. Maybe your Authorization Code is invalid"
+ raise self.pool.get('res.config.settings').get_config_warning(cr, _(error_msg), context=context)
+ return res
+
+ def _refresh_google_token_json(self, cr, uid, refresh_token, service, context=None): # exchange_AUTHORIZATION vs Token (service = calendar)
+ res = False
+ client_id = self.get_client_id(cr, uid, service, context)
+ client_secret = self.get_client_secret(cr, uid, service, context)
+
+ params = {
+ 'refresh_token': refresh_token,
+ 'client_id': client_id,
+ 'client_secret': client_secret,
+ 'grant_type': 'refresh_token',
+ }
+
+ headers = {"content-type": "application/x-www-form-urlencoded"}
+
+ try:
+ uri = self.get_uri_oauth(a='token')
+
+ data = werkzeug.url_encode(params)
+ st, res, ask_time = self._do_request(cr, uid, uri, params=data, headers=headers, type='POST', preuri='', context=context)
+ except urllib2.HTTPError, e:
+ if e.code == 400: # invalid grant
+ registry = openerp.modules.registry.RegistryManager.get(request.session.db)
+ with registry.cursor() as cur:
+ self.pool['res.users'].write(cur, uid, [uid], {'google_%s_rtoken' % service: False}, context=context)
+ error_key = simplejson.loads(e.read()).get("error", "nc")
+ _logger.exception("Bad google request : %s !" % error_key)
+ error_msg = "Something went wrong during your token generation. Maybe your Authorization Code is invalid or already expired [%s]" % error_key
+ raise self.pool.get('res.config.settings').get_config_warning(cr, _(error_msg), context=context)
+ return res
+
+ def _do_request(self, cr, uid, uri, params={}, headers={}, type='POST', preuri="https://www.googleapis.com", context=None):
+ if context is None:
+ context = {}
+
+ """ Return a tuple ('HTTP_CODE', 'HTTP_RESPONSE') """
+ _logger.debug("Uri: %s - Type : %s - Headers: %s - Params : %s !" % (uri, type, headers, werkzeug.url_encode(params) if type == 'GET' else params))
+
+ status = 418
+ response = ""
+ ask_time = datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+ try:
+ if type.upper() == 'GET' or type.upper() == 'DELETE':
+ data = werkzeug.url_encode(params)
+ req = urllib2.Request(preuri + uri + "?" + data)
+ elif type.upper() == 'POST' or type.upper() == 'PATCH' or type.upper() == 'PUT':
+ req = urllib2.Request(preuri + uri, params, headers)
+ else:
+ raise ('Method not supported [%s] not in [GET, POST, PUT, PATCH or DELETE]!' % (type))
+ req.get_method = lambda: type.upper()
+
+ request = urllib2.urlopen(req, timeout=TIMEOUT)
+ status = request.getcode()
+
+ if int(status) in (204, 404): # Page not found, no response
+ response = False
+ else:
+ content = request.read()
+ response = simplejson.loads(content)
+
+ try:
+ ask_time = datetime.strptime(request.headers.get('date'), "%a, %d %b %Y %H:%M:%S %Z")
+ except:
+ pass
+ except urllib2.HTTPError, e:
+ if e.code in (204, 404):
+ status = e.code
+ response = ""
+ else:
+ _logger.exception("Bad google request : %s !" % e.read())
+ if e.code in (400, 401, 410):
+ raise e
+ raise self.pool.get('res.config.settings').get_config_warning(cr, _("Something went wrong with your request to google"), context=context)
+ return (status, response, ask_time)
+
+ def get_base_url(self, cr, uid, context=None):
+ return self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='http://www.openerp.com?NoBaseUrl', context=context)
+
+ def get_client_id(self, cr, uid, service, context=None):
+ return self.pool.get('ir.config_parameter').get_param(cr, SUPERUSER_ID, 'google_%s_client_id' % (service,), default=False, context=context)
+
+ def get_client_secret(self, cr, uid, service, context=None):
+ return self.pool.get('ir.config_parameter').get_param(cr, SUPERUSER_ID, 'google_%s_client_secret' % (service,), default=False, context=context)
+
+ def get_uri_oauth(self, a=''): # a = optional action
+ return "https://accounts.google.com/o/oauth2/%s" % (a,)
+
+ def get_uri_api(self):
+ return 'https://www.googleapis.com'
diff --git a/google_account/google_account.xml b/google_account/google_account.xml
new file mode 100644
index 0000000..c6748df
--- /dev/null
+++ b/google_account/google_account.xml
@@ -0,0 +1,9 @@
+
+
+
+
+ google_redirect_uri
+ urn:ietf:wg:oauth:2.0:oob
+
+
+
\ No newline at end of file
diff --git a/google_account/google_account_data.xml b/google_account/google_account_data.xml
new file mode 100644
index 0000000..c6748df
--- /dev/null
+++ b/google_account/google_account_data.xml
@@ -0,0 +1,9 @@
+
+
+
+
+ google_redirect_uri
+ urn:ietf:wg:oauth:2.0:oob
+
+
+
\ No newline at end of file
diff --git a/google_account/i18n/af.po b/google_account/i18n/af.po
new file mode 100644
index 0000000..8a57404
--- /dev/null
+++ b/google_account/i18n/af.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-18 11:29+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: Afrikaans (http://www.transifex.com/odoo/odoo-8/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Geskep deur"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Geskep op"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Laas Opgedateer deur"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Laas Opgedateer op"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Iets het foutgegaan met jou versoek aan google"
diff --git a/google_account/i18n/ar.po b/google_account/i18n/ar.po
new file mode 100644
index 0000000..4d50993
--- /dev/null
+++ b/google_account/i18n/ar.po
@@ -0,0 +1,52 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# hoxhe aits , 2015
+# Mustafa Rawi , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-09-12 22:29+0000\n"
+"Last-Translator: Mustafa Rawi \n"
+"Language-Team: Arabic (http://www.transifex.com/odoo/odoo-8/language/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "أُنشئ بواسطة"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "أنشئ في"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "المعرف"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "آخر تحديث بواسطة"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "آخر تحديث في"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "حدث خطأ ما مع طلبك إلى جوجل"
diff --git a/google_account/i18n/bg.po b/google_account/i18n/bg.po
new file mode 100644
index 0000000..ddc6838
--- /dev/null
+++ b/google_account/i18n/bg.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Radina , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-01 12:32+0000\n"
+"Last-Translator: Radina \n"
+"Language-Team: Bulgarian (http://www.transifex.com/odoo/odoo-8/language/bg/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Създадено от"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Създадено на"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Последно обновено от"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Последно обновено на"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Нещо се обърка с Вашето искане до Google"
diff --git a/google_account/i18n/bs.po b/google_account/i18n/bs.po
new file mode 100644
index 0000000..b675b99
--- /dev/null
+++ b/google_account/i18n/bs.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-11 16:53+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Bosnian (http://www.transifex.com/odoo/odoo-8/language/bs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: bs\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Kreirao"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Kreirano"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Zadnji ažurirao"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Zadnje ažurirano"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/ca.po b/google_account/i18n/ca.po
new file mode 100644
index 0000000..9777c8c
--- /dev/null
+++ b/google_account/i18n/ca.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-11-25 18:54+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Catalan (http://www.transifex.com/odoo/odoo-8/language/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creat per"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creat el"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Actualitzat per última vegada per"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Actualitzat per última vegada el dia"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Alguna cosa ha fallat amb la seva sol·licitud a google"
diff --git a/google_account/i18n/cs.po b/google_account/i18n/cs.po
new file mode 100644
index 0000000..538043b
--- /dev/null
+++ b/google_account/i18n/cs.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-27 09:14+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Czech (http://www.transifex.com/projects/p/odoo-8/language/cs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: cs\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Vytvořil(a)"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Vytvořeno"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Naposled upraveno"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Naposled upraveno"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/da.po b/google_account/i18n/da.po
new file mode 100644
index 0000000..0c4cb73
--- /dev/null
+++ b/google_account/i18n/da.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-27 09:14+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Danish (http://www.transifex.com/odoo/odoo-8/language/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Oprettet af"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Oprettet den"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "Id"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Sidst opdateret af"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Sidst opdateret den"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/de.po b/google_account/i18n/de.po
new file mode 100644
index 0000000..b7d95ca
--- /dev/null
+++ b/google_account/i18n/de.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# Mathias Neef , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-11-05 15:35+0000\n"
+"Last-Translator: Mathias Neef \n"
+"Language-Team: German (http://www.transifex.com/odoo/odoo-8/language/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Erstellt von"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Erstellt am"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Zuletzt aktualisiert durch"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Zuletzt aktualisiert am"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Etwas ging schief mit Ihrer Anfrage an Google"
diff --git a/google_account/i18n/el.po b/google_account/i18n/el.po
new file mode 100644
index 0000000..a7672c1
--- /dev/null
+++ b/google_account/i18n/el.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Goutoudis Kostas , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-12-05 19:26+0000\n"
+"Last-Translator: Goutoudis Kostas \n"
+"Language-Team: Greek (http://www.transifex.com/odoo/odoo-8/language/el/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: el\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Δημιουργήθηκε από"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Δημιουργήθηκε στις"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "Κωδικός"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Τελευταία Ενημέρωση από"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Τελευταία Ενημέρωση στις"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Κάτι πήγε λάθος με το αίτημα στην Google"
diff --git a/google_account/i18n/en_GB.po b/google_account/i18n/en_GB.po
new file mode 100644
index 0000000..091dc7d
--- /dev/null
+++ b/google_account/i18n/en_GB.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/odoo/odoo-8/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Created by"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Created on"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Last Updated by"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Last Updated on"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/es.po b/google_account/i18n/es.po
new file mode 100644
index 0000000..57c7942
--- /dev/null
+++ b/google_account/i18n/es.po
@@ -0,0 +1,52 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# David Perez , 2015
+# FIRST AUTHOR , 2014
+# Pedro M. Baeza , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Pedro M. Baeza \n"
+"Language-Team: Spanish (http://www.transifex.com/odoo/odoo-8/language/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID (identificación)"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización de"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Algo fue mal en la petición a Google"
diff --git a/google_account/i18n/es_AR.po b/google_account/i18n/es_AR.po
new file mode 100644
index 0000000..b84f1bb
--- /dev/null
+++ b/google_account/i18n/es_AR.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Leonardo Germán Chianea , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-08-20 21:41+0000\n"
+"Last-Translator: Leonardo Germán Chianea \n"
+"Language-Team: Spanish (Argentina) (http://www.transifex.com/odoo/odoo-8/language/es_AR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_AR\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización realizada por"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización el"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Algo salió mal con su solicitud a google"
diff --git a/google_account/i18n/es_BO.po b/google_account/i18n/es_BO.po
new file mode 100644
index 0000000..b6e9616
--- /dev/null
+++ b/google_account/i18n/es_BO.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-18 11:29+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: Spanish (Bolivia) (http://www.transifex.com/odoo/odoo-8/language/es_BO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_BO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización de"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/es_CL.po b/google_account/i18n/es_CL.po
new file mode 100644
index 0000000..97cdc94
--- /dev/null
+++ b/google_account/i18n/es_CL.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-18 11:29+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: Spanish (Chile) (http://www.transifex.com/odoo/odoo-8/language/es_CL/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_CL\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID (identificación)"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización de"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/es_CO.po b/google_account/i18n/es_CO.po
new file mode 100644
index 0000000..b286471
--- /dev/null
+++ b/google_account/i18n/es_CO.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-23 05:10+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Spanish (Colombia) (http://www.transifex.com/odoo/odoo-8/language/es_CO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_CO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Actualizado por"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Actualizado"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Algo salió mal con su petición a Google"
diff --git a/google_account/i18n/es_CR.po b/google_account/i18n/es_CR.po
new file mode 100644
index 0000000..966fde6
--- /dev/null
+++ b/google_account/i18n/es_CR.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Spanish (Costa Rica) (http://www.transifex.com/odoo/odoo-8/language/es_CR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_CR\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/es_DO.po b/google_account/i18n/es_DO.po
new file mode 100644
index 0000000..ede6a09
--- /dev/null
+++ b/google_account/i18n/es_DO.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-11-08 17:05+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Spanish (Dominican Republic) (http://www.transifex.com/odoo/odoo-8/language/es_DO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_DO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID (identificación)"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización de"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Algo fue mal en la petición a Google"
diff --git a/google_account/i18n/es_EC.po b/google_account/i18n/es_EC.po
new file mode 100644
index 0000000..94f3994
--- /dev/null
+++ b/google_account/i18n/es_EC.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-14 01:51+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Spanish (Ecuador) (http://www.transifex.com/odoo/odoo-8/language/es_EC/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_EC\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por:"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Ultima Actualización por"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Actualizado en"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Ha existido un error cuando enviamos el requerimiento a Google"
diff --git a/google_account/i18n/es_MX.po b/google_account/i18n/es_MX.po
new file mode 100644
index 0000000..55bb6b1
--- /dev/null
+++ b/google_account/i18n/es_MX.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2016-01-18 18:41+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Spanish (Mexico) (http://www.transifex.com/odoo/odoo-8/language/es_MX/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_MX\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Ultima actualizacion por"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Ultima actualización realizada"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Algo enviado esta mal con el requerimiento de google"
diff --git a/google_account/i18n/es_PA.po b/google_account/i18n/es_PA.po
new file mode 100644
index 0000000..f5b63ea
--- /dev/null
+++ b/google_account/i18n/es_PA.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-18 11:29+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: Spanish (Panama) (http://www.transifex.com/odoo/odoo-8/language/es_PA/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_PA\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización de"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/es_PE.po b/google_account/i18n/es_PE.po
new file mode 100644
index 0000000..b14dbbd
--- /dev/null
+++ b/google_account/i18n/es_PE.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Luis Miguel Sarabia , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-21 14:52+0000\n"
+"Last-Translator: Luis Miguel Sarabia \n"
+"Language-Team: Spanish (Peru) (http://www.transifex.com/odoo/odoo-8/language/es_PE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_PE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Actualizado última vez por"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Ultima Actualización"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Algo ha fallado en su envío a google"
diff --git a/google_account/i18n/es_PY.po b/google_account/i18n/es_PY.po
new file mode 100644
index 0000000..d7bc23e
--- /dev/null
+++ b/google_account/i18n/es_PY.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Spanish (Paraguay) (http://www.transifex.com/odoo/odoo-8/language/es_PY/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_PY\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/es_VE.po b/google_account/i18n/es_VE.po
new file mode 100644
index 0000000..dbdd116
--- /dev/null
+++ b/google_account/i18n/es_VE.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2016-05-15 18:49+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Spanish (Venezuela) (http://www.transifex.com/odoo/odoo-8/language/es_VE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_VE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización realizada por"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Ultima actualizacion en"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/et.po b/google_account/i18n/et.po
new file mode 100644
index 0000000..8891ac2
--- /dev/null
+++ b/google_account/i18n/et.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2016-03-12 14:09+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Estonian (http://www.transifex.com/odoo/odoo-8/language/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Loonud"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Loodud"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Viimati uuendatud"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Viimati uuendatud"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/eu.po b/google_account/i18n/eu.po
new file mode 100644
index 0000000..46a588d
--- /dev/null
+++ b/google_account/i18n/eu.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Oihane Crucelaegui , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-14 15:10+0000\n"
+"Last-Translator: Oihane Crucelaegui \n"
+"Language-Team: Basque (http://www.transifex.com/odoo/odoo-8/language/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Nork sortua"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Noiz sortua"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Nork eguneratua"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Noiz eguneratua"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Zerbait oker joan da googleko zure eskaerarekin"
diff --git a/google_account/i18n/fa.po b/google_account/i18n/fa.po
new file mode 100644
index 0000000..6e34202
--- /dev/null
+++ b/google_account/i18n/fa.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Persian (http://www.transifex.com/odoo/odoo-8/language/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fa\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "ایجاد شده توسط"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "ایجاد شده در"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "شناسه"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "آخرین به روز رسانی توسط"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "آخرین به روز رسانی در"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/fi.po b/google_account/i18n/fi.po
new file mode 100644
index 0000000..57d5f62
--- /dev/null
+++ b/google_account/i18n/fi.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# Kari Lindgren , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-22 16:16+0000\n"
+"Last-Translator: Kari Lindgren \n"
+"Language-Team: Finnish (http://www.transifex.com/odoo/odoo-8/language/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Luonut"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Luotu"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Viimeksi päivittänyt"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Viimeksi päivitetty"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Jotakin meni vikaan google pyynnössäsi"
diff --git a/google_account/i18n/fr.po b/google_account/i18n/fr.po
new file mode 100644
index 0000000..03ad40e
--- /dev/null
+++ b/google_account/i18n/fr.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# Simon CARRIER , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-09-07 09:22+0000\n"
+"Last-Translator: Florian Hatat\n"
+"Language-Team: French (http://www.transifex.com/odoo/odoo-8/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Créé par"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Créé le"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Dernière modification par"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Dernière mise à jour le"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Quelque chose ne s'est pas passé comme prévu avec votre demande à Google"
diff --git a/google_account/i18n/fr_BE.po b/google_account/i18n/fr_BE.po
new file mode 100644
index 0000000..6074de1
--- /dev/null
+++ b/google_account/i18n/fr_BE.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-18 11:29+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: French (Belgium) (http://www.transifex.com/odoo/odoo-8/language/fr_BE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr_BE\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Créé par"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Créé le"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Derniere fois mis à jour par"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Dernière mis à jour le"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/fr_CA.po b/google_account/i18n/fr_CA.po
new file mode 100644
index 0000000..4a07c7b
--- /dev/null
+++ b/google_account/i18n/fr_CA.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-09 05:52+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: French (Canada) (http://www.transifex.com/odoo/odoo-8/language/fr_CA/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr_CA\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Créé par"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Créé le"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "Identifiant"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Dernière mise à jour par"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Dernière mise à jour le"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Quelque chose se passait mal avec votre demande chez Google"
diff --git a/google_account/i18n/gl.po b/google_account/i18n/gl.po
new file mode 100644
index 0000000..56a71dd
--- /dev/null
+++ b/google_account/i18n/gl.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Galician (http://www.transifex.com/odoo/odoo-8/language/gl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: gl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creado o"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/google_account.pot b/google_account/i18n/google_account.pot
new file mode 100644
index 0000000..a7e5dd6
--- /dev/null
+++ b/google_account/i18n/google_account.pot
@@ -0,0 +1,48 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-01-21 14:08+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
+
diff --git a/google_account/i18n/google_base_account.pot b/google_account/i18n/google_base_account.pot
new file mode 100644
index 0000000..44698f1
--- /dev/null
+++ b/google_account/i18n/google_base_account.pot
@@ -0,0 +1,106 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * google_base_account
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0alpha\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-21 17:05+0000\n"
+"PO-Revision-Date: 2012-12-21 17:05+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: google_base_account
+#: field:res.users,gmail_user:0
+msgid "Username"
+msgstr ""
+
+#. module: google_base_account
+#: model:ir.actions.act_window,name:google_base_account.act_google_login_form
+msgid "Google Login"
+msgstr ""
+
+#. module: google_base_account
+#: code:addons/google_base_account/wizard/google_login.py:29
+#, python-format
+msgid "Google Contacts Import Error!"
+msgstr ""
+
+#. module: google_base_account
+#: model:ir.model,name:google_base_account.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: google_base_account
+#: view:google.login:0
+msgid "or"
+msgstr ""
+
+#. module: google_base_account
+#: view:google.login:0
+msgid "Google login"
+msgstr ""
+
+#. module: google_base_account
+#: field:google.login,password:0
+msgid "Google Password"
+msgstr ""
+
+#. module: google_base_account
+#: code:addons/google_base_account/wizard/google_login.py:77
+#, python-format
+msgid "Error!"
+msgstr ""
+
+#. module: google_base_account
+#: view:res.users:0
+msgid "Google Account"
+msgstr ""
+
+#. module: google_base_account
+#: view:res.users:0
+msgid "Synchronization"
+msgstr ""
+
+#. module: google_base_account
+#: code:addons/google_base_account/wizard/google_login.py:77
+#, python-format
+msgid "Authentication failed. Check the user and password."
+msgstr ""
+
+#. module: google_base_account
+#: code:addons/google_base_account/wizard/google_login.py:29
+#, python-format
+msgid "Please install gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list"
+msgstr ""
+
+#. module: google_base_account
+#: model:ir.model,name:google_base_account.model_google_login
+msgid "Google Contact"
+msgstr ""
+
+#. module: google_base_account
+#: view:google.login:0
+msgid "Cancel"
+msgstr ""
+
+#. module: google_base_account
+#: field:google.login,user:0
+msgid "Google Username"
+msgstr ""
+
+#. module: google_base_account
+#: field:res.users,gmail_password:0
+msgid "Password"
+msgstr ""
+
+#. module: google_base_account
+#: view:google.login:0
+msgid "_Login"
+msgstr ""
+
diff --git a/google_account/i18n/gu.po b/google_account/i18n/gu.po
new file mode 100644
index 0000000..09b6352
--- /dev/null
+++ b/google_account/i18n/gu.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Gujarati (http://www.transifex.com/odoo/odoo-8/language/gu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: gu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ઓળખ"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/he.po b/google_account/i18n/he.po
new file mode 100644
index 0000000..7377efd
--- /dev/null
+++ b/google_account/i18n/he.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Hebrew (http://www.transifex.com/odoo/odoo-8/language/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: he\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "נוצר על ידי"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "נוצר ב-"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "מזהה"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "עודכן לאחרונה על ידי"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "עודכן לאחרונה על"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/hi.po b/google_account/i18n/hi.po
new file mode 100644
index 0000000..32d1070
--- /dev/null
+++ b/google_account/i18n/hi.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Lata Verma , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2016-09-02 17:51+0000\n"
+"Last-Translator: Lata Verma \n"
+"Language-Team: Hindi (http://www.transifex.com/odoo/odoo-8/language/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "निर्माण कर्ता"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "निर्माण तिथि"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "पहचान"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "अंतिम सुधारकर्ता"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "अंतिम सुधार की तिथि"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "गूगल करने के लिए आपके अनुरोध के साथ कुछ गलत हुआ।"
diff --git a/google_account/i18n/hr.po b/google_account/i18n/hr.po
new file mode 100644
index 0000000..fe9af06
--- /dev/null
+++ b/google_account/i18n/hr.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-15 18:04+0000\n"
+"Last-Translator: Davor Bojkić \n"
+"Language-Team: Croatian (http://www.transifex.com/odoo/odoo-8/language/hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: hr\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Kreirao"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Vrijeme kreiranja"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Promijenio"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Vrijeme promjene"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Nešto je pogrešno u vašem zahtjevu prema Google-u"
diff --git a/google_account/i18n/hu.po b/google_account/i18n/hu.po
new file mode 100644
index 0000000..63eec94
--- /dev/null
+++ b/google_account/i18n/hu.po
@@ -0,0 +1,52 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# krnkris, 2015
+# Tóth Csaba , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: krnkris\n"
+"Language-Team: Hungarian (http://www.transifex.com/odoo/odoo-8/language/hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Készítette"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Létrehozás dátuma"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Utoljára frissítette"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Utoljára frissítve"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Valami hiba lépett fel a google felé feladott kérés közben"
diff --git a/google_account/i18n/id.po b/google_account/i18n/id.po
new file mode 100644
index 0000000..991d9c4
--- /dev/null
+++ b/google_account/i18n/id.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# oon arfiandwi , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-12-18 06:51+0000\n"
+"Last-Translator: oon arfiandwi \n"
+"Language-Team: Indonesian (http://www.transifex.com/odoo/odoo-8/language/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Dibuat oleh"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Dibuat pada"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Diperbaharui oleh"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Diperbaharui pada"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Terjadi kesalahan pada permintaan layanan ke google"
diff --git a/google_account/i18n/is.po b/google_account/i18n/is.po
new file mode 100644
index 0000000..d26ee14
--- /dev/null
+++ b/google_account/i18n/is.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Icelandic (http://www.transifex.com/odoo/odoo-8/language/is/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: is\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Búið til af"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "Auðkenni"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/it.po b/google_account/i18n/it.po
new file mode 100644
index 0000000..c36efe3
--- /dev/null
+++ b/google_account/i18n/it.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2016-01-04 22:33+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Italian (http://www.transifex.com/odoo/odoo-8/language/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creato da"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creato il"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Ultima modifica di"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Ultima modifica il"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Qualcosa è andata male con la tua richiesta a google"
diff --git a/google_account/i18n/ja.po b/google_account/i18n/ja.po
new file mode 100644
index 0000000..46058ea
--- /dev/null
+++ b/google_account/i18n/ja.po
@@ -0,0 +1,52 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# Manami Hashi , 2015
+# Yoshi Tashiro , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-23 15:32+0000\n"
+"Last-Translator: Yoshi Tashiro \n"
+"Language-Team: Japanese (http://www.transifex.com/odoo/odoo-8/language/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "作成者"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "作成日"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "最終更新者"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "最終更新日"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Googleへのリクエストに異常があるようです"
diff --git a/google_account/i18n/ka.po b/google_account/i18n/ka.po
new file mode 100644
index 0000000..634b510
--- /dev/null
+++ b/google_account/i18n/ka.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-11-04 12:01+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Georgian (http://www.transifex.com/odoo/odoo-8/language/ka/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ka\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "შემქმნელი"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "შექმნის თარიღი"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "იდენტიფიკატორი"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "ბოლოს განაახლა"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "ბოლოს განახლებულია"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/kab.po b/google_account/i18n/kab.po
new file mode 100644
index 0000000..e06534c
--- /dev/null
+++ b/google_account/i18n/kab.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Belkacem Mohammed , 2015
+# FIRST AUTHOR , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Belkacem Mohammed \n"
+"Language-Team: Kabyle (http://www.transifex.com/odoo/odoo-8/language/kab/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: kab\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Yerna-t"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Yerna di"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "Asulay"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Asnifel aneggaru sɣur"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Aleqqem aneggaru di"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/ko.po b/google_account/i18n/ko.po
new file mode 100644
index 0000000..833abac
--- /dev/null
+++ b/google_account/i18n/ko.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-08-17 07:49+0000\n"
+"Last-Translator: choijaeho \n"
+"Language-Team: Korean (http://www.transifex.com/odoo/odoo-8/language/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "작성자"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "작성일"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "최근 갱신한 사람"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "최근 갱신 날짜"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "귀하가 Google에 요청한 것에 무언가 문제가 발생했습니다"
diff --git a/google_account/i18n/ln.po b/google_account/i18n/ln.po
new file mode 100644
index 0000000..46f89d5
--- /dev/null
+++ b/google_account/i18n/ln.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Lingala (http://www.transifex.com/odoo/odoo-8/language/ln/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ln\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/lt.po b/google_account/i18n/lt.po
new file mode 100644
index 0000000..d5261c7
--- /dev/null
+++ b/google_account/i18n/lt.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Lithuanian (http://www.transifex.com/odoo/odoo-8/language/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: lt\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Sukūrė"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Sukurta"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Paskutini kartą atnaujino"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Paskutinį kartą atnaujinta"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/lv.po b/google_account/i18n/lv.po
new file mode 100644
index 0000000..ad2c1ae
--- /dev/null
+++ b/google_account/i18n/lv.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Latvian (http://www.transifex.com/odoo/odoo-8/language/lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Izveidoja"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Izveidots"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Pēdējo reizi atjaunoja"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Pēdējās izmaiņas"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/mk.po b/google_account/i18n/mk.po
new file mode 100644
index 0000000..64a96ce
--- /dev/null
+++ b/google_account/i18n/mk.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Aleksandar Vangelovski , 2015
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-09-22 11:46+0000\n"
+"Last-Translator: Aleksandar Vangelovski \n"
+"Language-Team: Macedonian (http://www.transifex.com/odoo/odoo-8/language/mk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: mk\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Креирано од"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Креирано на"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Последно ажурирање од"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Последно ажурирање на"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Се извинуваме но има некој проблем со вашето барање до google"
diff --git a/google_account/i18n/ml_IN.po b/google_account/i18n/ml_IN.po
new file mode 100644
index 0000000..182c88d
--- /dev/null
+++ b/google_account/i18n/ml_IN.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Shoble Thomas , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2016-04-22 12:17+0000\n"
+"Last-Translator: Shoble Thomas \n"
+"Language-Team: Malayalam (India) (http://www.transifex.com/odoo/odoo-8/language/ml_IN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ml_IN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "നിർമിച്ചത്"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "നിർമിച്ച ദിവസം"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ഐ ഡി"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "അവസാനം അപ്ഡേറ്റ് ചെയ്തത്"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "അവസാനം അപ്ഡേറ്റ് ചെയ്ത ദിവസം"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "താങ്കൾ ഗൂഗിൾ ലിൽ കൊടുത്ത അപേക്ഷ യിൽ എന്തോ കുഴപ്പം സംഭവിച്ചു "
diff --git a/google_account/i18n/mn.po b/google_account/i18n/mn.po
new file mode 100644
index 0000000..c65457f
--- /dev/null
+++ b/google_account/i18n/mn.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Mongolian (http://www.transifex.com/odoo/odoo-8/language/mn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: mn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Үүсгэгч"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Үүсгэсэн огноо"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Сүүлийн засвар хийсэн"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Сүүлийн засвар хийсэн огноо"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/nb.po b/google_account/i18n/nb.po
new file mode 100644
index 0000000..8ba41cc
--- /dev/null
+++ b/google_account/i18n/nb.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Norwegian Bokmål (http://www.transifex.com/odoo/odoo-8/language/nb/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: nb\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Opprettet av"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Opprettet"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Sist oppdatert av"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Sist oppdatert"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/nl.po b/google_account/i18n/nl.po
new file mode 100644
index 0000000..751e89d
--- /dev/null
+++ b/google_account/i18n/nl.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# Yenthe Van Ginneken , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-09-22 09:50+0000\n"
+"Last-Translator: Yenthe Van Ginneken \n"
+"Language-Team: Dutch (http://www.transifex.com/odoo/odoo-8/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Aangemaakt door"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Aangemaakt op"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Laatst aangepast door"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Laatst aangepast op"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Er ging iets fout tijdens het verbinden met Google"
diff --git a/google_account/i18n/nl_BE.po b/google_account/i18n/nl_BE.po
new file mode 100644
index 0000000..5868b3c
--- /dev/null
+++ b/google_account/i18n/nl_BE.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Dutch (Belgium) (http://www.transifex.com/odoo/odoo-8/language/nl_BE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: nl_BE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Gemaakt door"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Gemaakt op"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Laatst bijgewerkt door"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Laatst bijgewerkt op"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/pl.po b/google_account/i18n/pl.po
new file mode 100644
index 0000000..ca32ada
--- /dev/null
+++ b/google_account/i18n/pl.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-08 14:15+0000\n"
+"Last-Translator: Dariusz Żbikowski \n"
+"Language-Team: Polish (http://www.transifex.com/odoo/odoo-8/language/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pl\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Utworzone przez"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Data utworzenia"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Ostatnio modyfikowane przez"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Data ostatniej modyfikacji"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Coś poszło nie tak z twoim zapytaniem do Google"
diff --git a/google_account/i18n/pt.po b/google_account/i18n/pt.po
new file mode 100644
index 0000000..7d2401f
--- /dev/null
+++ b/google_account/i18n/pt.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-11-25 14:30+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Portuguese (http://www.transifex.com/odoo/odoo-8/language/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Criada por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Fundado em"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Últimamente Actualizado por"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Última Actualização em"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Aconteceu algo errado com o seu pedido à Google"
diff --git a/google_account/i18n/pt_BR.po b/google_account/i18n/pt_BR.po
new file mode 100644
index 0000000..db61655
--- /dev/null
+++ b/google_account/i18n/pt_BR.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# Mateus Cerqueira Lopes , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: danimaribeiro \n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/odoo/odoo-8/language/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Criado por"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Criado em"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Última atualização por"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Última atualização em"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Algo deu errado com o seu pedido para o Google"
diff --git a/google_account/i18n/ro.po b/google_account/i18n/ro.po
new file mode 100644
index 0000000..a170376
--- /dev/null
+++ b/google_account/i18n/ro.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 18:23+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Romanian (http://www.transifex.com/odoo/odoo-8/language/ro/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ro\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Creat de"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Creat în"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Ultima actualizare făcută de"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Ultima actualizare în"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/ru.po b/google_account/i18n/ru.po
new file mode 100644
index 0000000..7da0b6b
--- /dev/null
+++ b/google_account/i18n/ru.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Eduard, 2015
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-11-13 19:44+0000\n"
+"Last-Translator: Eduard\n"
+"Language-Team: Russian (http://www.transifex.com/odoo/odoo-8/language/ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ru\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Создано"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Создан"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Последний раз обновлено"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Последний раз обновлено"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Что-то пошло не так с вашим запросом к google"
diff --git a/google_account/i18n/sk.po b/google_account/i18n/sk.po
new file mode 100644
index 0000000..ede0349
--- /dev/null
+++ b/google_account/i18n/sk.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-08 05:16+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Slovak (http://www.transifex.com/odoo/odoo-8/language/sk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sk\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Vytvoril"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Vytvorené"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Naposledy upravoval"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Naposledy upravované"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Niečo sa pokazilo na vašej požiadavke na google"
diff --git a/google_account/i18n/sl.po b/google_account/i18n/sl.po
new file mode 100644
index 0000000..3f5e40d
--- /dev/null
+++ b/google_account/i18n/sl.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+# Matjaž Mozetič , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Matjaž Mozetič \n"
+"Language-Team: Slovenian (http://www.transifex.com/odoo/odoo-8/language/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Ustvaril"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Ustvarjeno"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Zadnji posodobil"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Zadnjič posodobljeno"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Pri vašem zahtevku google je prišlo do težav."
diff --git a/google_account/i18n/sq.po b/google_account/i18n/sq.po
new file mode 100644
index 0000000..53343de
--- /dev/null
+++ b/google_account/i18n/sq.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-18 11:29+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: Albanian (http://www.transifex.com/odoo/odoo-8/language/sq/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sq\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Krijuar nga"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Krijuar me"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Modifikuar per here te fundit nga"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Modifikuar per here te fundit me"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/sr.po b/google_account/i18n/sr.po
new file mode 100644
index 0000000..60bc018
--- /dev/null
+++ b/google_account/i18n/sr.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Serbian (http://www.transifex.com/odoo/odoo-8/language/sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sr\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Kreiran"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/sr@latin.po b/google_account/i18n/sr@latin.po
new file mode 100644
index 0000000..5486c64
--- /dev/null
+++ b/google_account/i18n/sr@latin.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-10-31 16:30+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Serbian (Latin) (http://www.transifex.com/odoo/odoo-8/language/sr@latin/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sr@latin\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Kreirao"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Kreiran"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Zadnja izmjena"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Zadnja izmjena"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/sv.po b/google_account/i18n/sv.po
new file mode 100644
index 0000000..840778b
--- /dev/null
+++ b/google_account/i18n/sv.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Anders Wallenquist , 2015
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-12-11 13:25+0000\n"
+"Last-Translator: Anders Wallenquist \n"
+"Language-Team: Swedish (http://www.transifex.com/odoo/odoo-8/language/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Skapad av"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Skapad den"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Senast uppdaterad av"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Senast uppdaterad"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Något gick fel med Google-anropet"
diff --git a/google_account/i18n/ta.po b/google_account/i18n/ta.po
new file mode 100644
index 0000000..5e96128
--- /dev/null
+++ b/google_account/i18n/ta.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-05-18 11:29+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: Tamil (http://www.transifex.com/odoo/odoo-8/language/ta/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ta\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "உருவாக்கியவர்"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "உருவாக்கப்பட்ட \nதேதி"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "கடைசியாக புதுப்பிக்கப்பட்டது"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "கடைசியாக புதுப்பிக்கப்பட்டது"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "உங்கள் கோரிக்கை Google க்கு கொண்டு ஏதோ தவறு நடந்துவிட்டது"
diff --git a/google_account/i18n/th.po b/google_account/i18n/th.po
new file mode 100644
index 0000000..ea98ea8
--- /dev/null
+++ b/google_account/i18n/th.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Thai (http://www.transifex.com/odoo/odoo-8/language/th/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: th\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "จัดทำโดย"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "สร้างเมื่อ"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "อัพเดทครั้งสุดท้ายโดย"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "อัพเดทครั้งสุดท้ายเมื่อ"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/tr.po b/google_account/i18n/tr.po
new file mode 100644
index 0000000..31ab698
--- /dev/null
+++ b/google_account/i18n/tr.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-07-17 07:11+0000\n"
+"Last-Translator: Murat Kaplan \n"
+"Language-Team: Turkish (http://www.transifex.com/odoo/odoo-8/language/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Oluşturan"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Oluşturulma"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Son Güncelleyen"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Son Güncelleme"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Google da yaptığınız isteğinizle ilgili bir şeyler yanlış gitti"
diff --git a/google_account/i18n/uk.po b/google_account/i18n/uk.po
new file mode 100644
index 0000000..56019ff
--- /dev/null
+++ b/google_account/i18n/uk.po
@@ -0,0 +1,50 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# Bogdan, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-08-22 14:18+0000\n"
+"Last-Translator: Bogdan\n"
+"Language-Team: Ukrainian (http://www.transifex.com/odoo/odoo-8/language/uk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: uk\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Створив"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Створено"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Востаннє відредаговано"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Дата останньої зміни"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "Щось пішло не так з вашим запитом в google"
diff --git a/google_account/i18n/vi.po b/google_account/i18n/vi.po
new file mode 100644
index 0000000..7f6c59d
--- /dev/null
+++ b/google_account/i18n/vi.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2016-02-23 04:22+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Vietnamese (http://www.transifex.com/odoo/odoo-8/language/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "Tạo bởi"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "Tạo trên"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "Cập nhật lần cuối bởi"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "Cập nhật lần cuối"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/google_account/i18n/zh_CN.po b/google_account/i18n/zh_CN.po
new file mode 100644
index 0000000..b979ff8
--- /dev/null
+++ b/google_account/i18n/zh_CN.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+# FIRST AUTHOR , 2012,2014
+# mrshelly , 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-08-07 12:18+0000\n"
+"Last-Translator: mrshelly \n"
+"Language-Team: Chinese (China) (http://www.transifex.com/odoo/odoo-8/language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "创建人"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "创建"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "标识"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "最后更新"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "最后一次更新"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr "你对谷歌的访问出错了"
diff --git a/google_account/i18n/zh_TW.po b/google_account/i18n/zh_TW.po
new file mode 100644
index 0000000..e6c4f76
--- /dev/null
+++ b/google_account/i18n/zh_TW.po
@@ -0,0 +1,49 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * google_account
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-21 14:08+0000\n"
+"PO-Revision-Date: 2015-12-04 06:06+0000\n"
+"Last-Translator: Martin Trigaux\n"
+"Language-Team: Chinese (Taiwan) (http://www.transifex.com/odoo/odoo-8/language/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. module: google_account
+#: field:google.service,create_uid:0
+msgid "Created by"
+msgstr "建立者"
+
+#. module: google_account
+#: field:google.service,create_date:0
+msgid "Created on"
+msgstr "建立於"
+
+#. module: google_account
+#: field:google.service,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: google_account
+#: field:google.service,write_uid:0
+msgid "Last Updated by"
+msgstr "最後更新:"
+
+#. module: google_account
+#: field:google.service,write_date:0
+msgid "Last Updated on"
+msgstr "最後更新於"
+
+#. module: google_account
+#: code:addons/google_account/google_account.py:168
+#, python-format
+msgid "Something went wrong with your request to google"
+msgstr ""
diff --git a/mail_tracking/README.rst b/mail_tracking/README.rst
new file mode 100644
index 0000000..e2a9bd2
--- /dev/null
+++ b/mail_tracking/README.rst
@@ -0,0 +1,112 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+=============
+Mail tracking
+=============
+
+This module shows email notification tracking status for any messages in
+mail thread (chatter). Each notified partner will have an intuitive icon just
+right to his name.
+
+
+Installation
+============
+
+If you're using a multi-database installation (with or without dbfilter option)
+where /web/databse/selector returns a list of more than one database, then
+you need to add ``mail_tracking`` addon to wide load addons list
+(by default, only ``web`` addon), setting ``--load`` option.
+For example, ``--load=web,mail_tracking``
+
+
+Usage
+=====
+
+When user sends a message in mail_thread (chatter), for instance in partner
+form, then an email tracking is created for each email notification. Then a
+status icon will appear just right to name of notified partner.
+
+These are all available status icons:
+
+.. |sent| image:: mail_tracking/static/src/img/sent.png
+ :width: 10px
+
+.. |delivered| image:: mail_tracking/static/src/img/delivered.png
+ :width: 15px
+
+.. |opened| image:: mail_tracking/static/src/img/opened.png
+ :width: 15px
+
+.. |error| image:: mail_tracking/static/src/img/error.png
+ :width: 10px
+
+.. |waiting| image:: mail_tracking/static/src/img/waiting.png
+ :width: 10px
+
+.. |unknown| image:: mail_tracking/static/src/img/unknown.png
+ :width: 10px
+
+|unknown| **Unknown**: No email tracking info available. Maybe this notified partner has 'Receive Inbox Notifications by Email' == 'Never'
+
+|waiting| **Waiting**: Waiting to be sent
+
+|error| **Error**: Error while sending
+
+|sent| **Sent**: Sent to SMTP server configured
+
+|delivered| **Delivered**: Delivered to final MX server
+
+|opened| **Opened**: Opened by partner
+
+
+.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
+ :alt: Try me on Runbot
+ :target: https://runbot.odoo-community.org/runbot/205/8.0
+
+If you want to see all tracking emails and events you can go to
+
+* Settings > Technical > Email > Tracking emails
+* Settings > Technical > Email > Tracking events
+
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues
+`_. In case of trouble, please
+check there if your issue has already been reported. If you spotted it first,
+help us smashing it by providing a detailed and welcomed feedback.
+
+Credits
+=======
+
+Images
+------
+
+* Odoo Community Association: `Icon `_.
+* Thanks to `LlubNek `_ and `Openclipart
+ `_ for `the icon
+ `_.
+
+Contributors
+------------
+
+* Pedro M. Baeza
+* Antonio Espinosa
+
+Maintainer
+----------
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+This module is maintained by the OCA.
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+To contribute to this module, please visit https://odoo-community.org.
diff --git a/mail_tracking/__init__.py b/mail_tracking/__init__.py
new file mode 100644
index 0000000..e32deff
--- /dev/null
+++ b/mail_tracking/__init__.py
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+# flake8: noqa
+
+from . import models
+from . import controllers
+from .hooks import pre_init_hook
diff --git a/mail_tracking/__init__.pyc b/mail_tracking/__init__.pyc
new file mode 100644
index 0000000..8fdc647
Binary files /dev/null and b/mail_tracking/__init__.pyc differ
diff --git a/mail_tracking/__openerp__.py b/mail_tracking/__openerp__.py
new file mode 100644
index 0000000..36cf73e
--- /dev/null
+++ b/mail_tracking/__openerp__.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+{
+ "name": "Email tracking",
+ "summary": "Email tracking system for all mails sent",
+ "version": "8.0.2.0.2",
+ "category": "Social Network",
+ "website": "http://www.tecnativa.com",
+ "author": "Tecnativa, "
+ "Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "application": False,
+ "installable": True,
+ "depends": [
+ "decimal_precision",
+ "mail",
+ ],
+ "data": [
+ "data/tracking_data.xml",
+ "security/ir.model.access.csv",
+ "views/assets.xml",
+ "views/mail_tracking_email_view.xml",
+ "views/mail_tracking_event_view.xml",
+ "views/res_partner_view.xml",
+ ],
+ "qweb": [
+ "static/src/xml/mail_tracking.xml",
+ ],
+ "pre_init_hook": "pre_init_hook",
+}
diff --git a/mail_tracking/controllers/__init__.py b/mail_tracking/controllers/__init__.py
new file mode 100644
index 0000000..73e1105
--- /dev/null
+++ b/mail_tracking/controllers/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+# flake8: noqa
+
+from . import main
diff --git a/mail_tracking/controllers/__init__.pyc b/mail_tracking/controllers/__init__.pyc
new file mode 100644
index 0000000..d0b9c81
Binary files /dev/null and b/mail_tracking/controllers/__init__.pyc differ
diff --git a/mail_tracking/controllers/main.py b/mail_tracking/controllers/main.py
new file mode 100644
index 0000000..91e6063
--- /dev/null
+++ b/mail_tracking/controllers/main.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import werkzeug
+from psycopg2 import OperationalError
+from openerp import api, http, registry, SUPERUSER_ID
+import logging
+_logger = logging.getLogger(__name__)
+
+BLANK = 'R0lGODlhAQABAIAAANvf7wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='
+
+
+def _env_get(db):
+ reg = False
+ try:
+ reg = registry(db)
+ except OperationalError:
+ _logger.warning("Selected BD '%s' not found", db)
+ except: # pragma: no cover
+ _logger.warning("Selected BD '%s' connection error", db)
+ if reg:
+ return api.Environment(reg.cursor(), SUPERUSER_ID, {})
+ return False
+
+
+class MailTrackingController(http.Controller):
+
+ def _request_metadata(self):
+ request = http.request.httprequest
+ return {
+ 'ip': request.remote_addr or False,
+ 'user_agent': request.user_agent or False,
+ 'os_family': request.user_agent.platform or False,
+ 'ua_family': request.user_agent.browser or False,
+ }
+
+ @http.route('/mail/tracking/all/',
+ type='http', auth='none')
+ def mail_tracking_all(self, db, **kw):
+ env = _env_get(db)
+ if not env:
+ return 'NOT FOUND'
+ metadata = self._request_metadata()
+ response = env['mail.tracking.email'].event_process(
+ http.request, kw, metadata)
+ env.cr.commit()
+ env.cr.close()
+ return response
+
+ @http.route('/mail/tracking/event//',
+ type='http', auth='none')
+ def mail_tracking_event(self, db, event_type, **kw):
+ env = _env_get(db)
+ if not env:
+ return 'NOT FOUND'
+ metadata = self._request_metadata()
+ response = env['mail.tracking.email'].event_process(
+ http.request, kw, metadata, event_type=event_type)
+ env.cr.commit()
+ env.cr.close()
+ return response
+
+ @http.route('/mail/tracking/open/'
+ '//blank.gif',
+ type='http', auth='none')
+ def mail_tracking_open(self, db, tracking_email_id, **kw):
+ env = _env_get(db)
+ if env:
+ tracking_email = env['mail.tracking.email'].search([
+ ('id', '=', tracking_email_id),
+ ])
+ if tracking_email:
+ metadata = self._request_metadata()
+ tracking_email.event_create('open', metadata)
+ else:
+ _logger.warning(
+ "MailTracking email '%s' not found", tracking_email_id)
+ env.cr.commit()
+ env.cr.close()
+
+ # Always return GIF blank image
+ response = werkzeug.wrappers.Response()
+ response.mimetype = 'image/gif'
+ response.data = BLANK.decode('base64')
+ return response
diff --git a/mail_tracking/controllers/main.pyc b/mail_tracking/controllers/main.pyc
new file mode 100644
index 0000000..eff55b7
Binary files /dev/null and b/mail_tracking/controllers/main.pyc differ
diff --git a/mail_tracking/data/tracking_data.xml b/mail_tracking/data/tracking_data.xml
new file mode 100644
index 0000000..4bcb2cb
--- /dev/null
+++ b/mail_tracking/data/tracking_data.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ MailTracking Timestamp
+ 6
+
+
+
+
diff --git a/mail_tracking/hooks.py b/mail_tracking/hooks.py
new file mode 100644
index 0000000..8d3dc43
--- /dev/null
+++ b/mail_tracking/hooks.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import logging
+from psycopg2.extensions import AsIs
+
+_logger = logging.getLogger(__name__)
+
+
+def column_exists(cr, table, column):
+ cr.execute("""
+ SELECT column_name
+ FROM information_schema.columns
+ WHERE table_name = %s AND column_name = %s""", (table, column))
+ return bool(cr.fetchall())
+
+
+def column_add_with_value(cr, table, column, field_type, value):
+ if not column_exists(cr, table, column):
+ cr.execute("""
+ ALTER TABLE %s
+ ADD COLUMN %s %s""", (AsIs(table), AsIs(column), AsIs(field_type)))
+ cr.execute("""
+ UPDATE %s SET %s = %s""", (AsIs(table), AsIs(column), value))
+
+
+def pre_init_hook(cr):
+ _logger.info("Creating res.partner.tracking_emails_count column "
+ "with value 0")
+ column_add_with_value(
+ cr, "res_partner", "tracking_emails_count", "integer", 0)
+ _logger.info("Creating res.partner.email_score column "
+ "with value 50.0")
+ column_add_with_value(
+ cr, "res_partner", "email_score", "double precision", 50.0)
diff --git a/mail_tracking/hooks.pyc b/mail_tracking/hooks.pyc
new file mode 100644
index 0000000..5fcfba9
Binary files /dev/null and b/mail_tracking/hooks.pyc differ
diff --git a/mail_tracking/i18n/am.po b/mail_tracking/i18n/am.po
new file mode 100644
index 0000000..d35d4ba
--- /dev/null
+++ b/mail_tracking/i18n/am.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Amharic (https://www.transifex.com/oca/teams/23907/am/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: am\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/ca.po b/mail_tracking/i18n/ca.po
new file mode 100644
index 0000000..544b533
--- /dev/null
+++ b/mail_tracking/i18n/ca.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Creat per"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Creat el"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Darrera Actualització per"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Darrera Actualització el"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/de.po b/mail_tracking/i18n/de.po
new file mode 100644
index 0000000..5f34e1d
--- /dev/null
+++ b/mail_tracking/i18n/de.po
@@ -0,0 +1,449 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+# Ermin Trevisan , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: Ermin Trevisan , 2016\n"
+"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr "Anzeigename"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr "Email"
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr "Zuletzt geändert am"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Zuletzt geändert von"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/el_GR.po b/mail_tracking/i18n/el_GR.po
new file mode 100644
index 0000000..1e36d9e
--- /dev/null
+++ b/mail_tracking/i18n/el_GR.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Greek (Greece) (https://www.transifex.com/oca/teams/23907/el_GR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: el_GR\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Δημιουργήθηκε από "
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Δημιουργήθηκε στις"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "Κωδικός"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Τελευταία ενημέρωση από"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Τελευταία ενημέρωση στις"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/es.po b/mail_tracking/i18n/es.po
new file mode 100644
index 0000000..1524845
--- /dev/null
+++ b/mail_tracking/i18n/es.po
@@ -0,0 +1,440 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-08 00:45+0000\n"
+"PO-Revision-Date: 2016-08-08 00:45+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr "Fecha"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr "Nombre mostrado"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr "Correo electrónico"
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr "Última modificación en"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr "Mes"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/es_ES.po b/mail_tracking/i18n/es_ES.po
new file mode 100644
index 0000000..096b0ed
--- /dev/null
+++ b/mail_tracking/i18n/es_ES.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Spanish (Spain) (https://www.transifex.com/oca/teams/23907/es_ES/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_ES\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Última actualización por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/fi.po b/mail_tracking/i18n/fi.po
new file mode 100644
index 0000000..2119a94
--- /dev/null
+++ b/mail_tracking/i18n/fi.po
@@ -0,0 +1,449 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+# Jarmo Kortetjärvi , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: Jarmo Kortetjärvi , 2016\n"
+"Language-Team: Finnish (https://www.transifex.com/oca/teams/23907/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Luonut"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Luotu"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr "Nimi"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr "Viimeksi muokattu"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Viimeksi päivittänyt"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Viimeksi päivitetty"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr "Tila"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/fr.po b/mail_tracking/i18n/fr.po
new file mode 100644
index 0000000..ceb2230
--- /dev/null
+++ b/mail_tracking/i18n/fr.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-02 02:43+0000\n"
+"PO-Revision-Date: 2016-09-02 02:43+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr "Erreurs de remise"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr "Descriptif du rebond"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr "Type de rebond"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr "Rebonds"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr "Cliquer"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr "Cliqué"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr "URL cliquée"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr "Pays"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Créée par"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Créée le"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr "Date"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr "Déférer"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr "Livré"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr "Nom à afficher"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr "Nom affiché"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr "Courriel"
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr "Score du courriel"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr "Erreur"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr "Erreur du serveur SMTP"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr "Desciptif de l'erreur"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr "Type d'erreur"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr "Type d'évènement"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr "Échec"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr "Regrouper par"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr "Est mobile?"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr "Dernière modification le"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Dernière modification par"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Modifié le"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr "Suivi du courriel: courriel"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr "Suivi du courriel: recherche du courriel"
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr "Suivi du courriel: courriels"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr "Suivi du courriel: évènement"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr "Suivi du courriel: recherche d'un évènement"
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr "Suivi du courriel: évènements"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr "Message"
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr "Destinataire du courriel"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr "Mois"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr "Ouverte"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr "Famille du système d'exploitation"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Courriels sortants"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr "Partenaire"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr "Destinataire"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr "Courriel du destinataire "
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr "Adresse de courriel du destinataire"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr "Refusé"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr "Serveur SMTP"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr "Émetteur"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr "Courriel de l'expéditeur"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr "Envoyé"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr "Pourriel"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr "État"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr "Objet"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr "Heure"
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr "Suivi du courriel: courriels"
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr "Suivi du courriel: nombre de courriels"
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr "Suivi du courriel: évènements"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr "Type"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr "URL"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr "Horodatage en UTC"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr "Se désabonner"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr "Désincrit"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr "IP de l'utilisateur"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr "Navigateur"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr "Famille du navigateur"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr "type de navigateur"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr "Pays de l'utilisateur"
diff --git a/mail_tracking/i18n/gl.po b/mail_tracking/i18n/gl.po
new file mode 100644
index 0000000..6c5aadd
--- /dev/null
+++ b/mail_tracking/i18n/gl.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Galician (https://www.transifex.com/oca/teams/23907/gl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: gl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Creado en"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "ültima actualización por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Última actualización en"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/it.po b/mail_tracking/i18n/it.po
new file mode 100644
index 0000000..2957c50
--- /dev/null
+++ b/mail_tracking/i18n/it.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Creato da"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Creato il"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr "Nome da visualizzare"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr "Ultima modifica il"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Ultimo aggiornamento di"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Ultimo aggiornamento il"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/nl.po b/mail_tracking/i18n/nl.po
new file mode 100644
index 0000000..71b4a97
--- /dev/null
+++ b/mail_tracking/i18n/nl.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Dutch (https://www.transifex.com/oca/teams/23907/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr "Te tonen naam"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr "Groepeer op"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr "Laatst bijgewerkt op"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr "Relatie"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr "Type"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/pt.po b/mail_tracking/i18n/pt.po
new file mode 100644
index 0000000..b3b8c35
--- /dev/null
+++ b/mail_tracking/i18n/pt.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Portuguese (https://www.transifex.com/oca/teams/23907/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Criado por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Criado em"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Atualizado pela última vez por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Atualizado pela última vez em"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/pt_BR.po b/mail_tracking/i18n/pt_BR.po
new file mode 100644
index 0000000..a974729
--- /dev/null
+++ b/mail_tracking/i18n/pt_BR.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/23907/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Criado por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Criado em"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "Identificação"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Última atualização por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Última atualização em"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/pt_PT.po b/mail_tracking/i18n/pt_PT.po
new file mode 100644
index 0000000..d7e0d2b
--- /dev/null
+++ b/mail_tracking/i18n/pt_PT.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/teams/23907/pt_PT/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt_PT\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Criado por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Criado em"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Atualizado pela última vez por"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Atualizado pela última vez em"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/i18n/sl.po b/mail_tracking/i18n/sl.po
new file mode 100644
index 0000000..93a1695
--- /dev/null
+++ b/mail_tracking/i18n/sl.po
@@ -0,0 +1,458 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+# Matjaž Mozetič , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-02 02:43+0000\n"
+"PO-Revision-Date: 2016-09-02 02:43+0000\n"
+"Last-Translator: Matjaž Mozetič , 2016\n"
+"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+" * Stanje 'Napaka' pomeni, da je prišlo do napake pri pošiljanju e-pošte, npr. 'Ni veljavnih prejemnikov'\n"
+" * Stanje 'Poslano' pomeni, da je bilo sporočilo uspešno poslano preko izhodnega e-poštnega strežnika (SMTP).\n"
+" * Stanje 'Dostavljeno' pomeni, da je bilo sporočilo uspešno dostavljeno na prejemnikov Mail Exchange (MX) strežnik.\n"
+" * Stanje 'Odprto' pomeni, da je prejemnik sporočilo odprl ali kliknil.\n"
+" * Stanje 'Zavrnjeno' pomeni, da je prejemnikov e-poštni naslov na črni listi odhodnega e-poštnega strežnika (SMTP). Priporočeno je, da se ta e-poštni naslov izbriše.\n"
+" * Stanje 'Neželjeno' pomeni, da izhodni strežnik (SMTP) obravnava to sporočilo kot neželjeno pošto.\n"
+" * Stanje 'Izpisan' pomeni, da je prejemnik zahteval izpis iz seznama prejemnikov tega sporočila.\n"
+" * Stanje 'Odbito' pomeni, da je bilo sporočilo odbito s strani prejemnikovega Mail Exchange (MX) strežnika.\n"
+" * Stanje 'Mehko odbito' pomeni, da je bilo sporočilo 'mehko' odbito s strani prejemnikovega Mail Exchange (MX) strežnika.\n"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr "Odboj"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr "Opis odboja"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr "Tip odboja"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr "Odbito"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr "Kilk"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr "Kliknjeno"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr "Kliknjena URL"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr "Država"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Ustvaril"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Ustvarjeno"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr "Datum"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr "Odložitev"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr "Odloženo"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr "Dostavljeno"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr "Prikazni naziv"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr "Prikazni naziv"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr "E-pošta"
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr "Točkovanje e-pošte"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr "Napaka"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr "Napaka SMTP strežnika"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr "Opis napake"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr "Podrobnosti o napaki"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr "Tip napake"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr "Tip dogodka"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr "Neuspelo"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr "Združi po"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr "Trdo odbito"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr "Mobilno?"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr "Zadnjič spremenjeno"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Zadnji posodobil"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Zadnjič posodobljeno"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr "Sledenje e-pošte"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr "Iskalnik sledenja e-pošte"
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr "Sporočila sledenja"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr "Dogodek sledenja e-pošte"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr "Iskalnik dogodkov sledenja e-pošte"
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr "Dogodki sledenja e-pošte"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr "Sporočilo"
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr "Sledenje sporočila"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr "Mesec"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr "Odprto"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr "Družina operacijskega sistema"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Izhodna pošta"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr "Partner"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr "Prejemnik"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr "Prejemnikova e-pošta"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr "Prejemnikova e-pošta"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr "Zavrnjeno"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr "SMTP strežnik"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr "Pošiljatelj"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr "Pošiljateljeva e-pošta"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr "Poslano"
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr "Mehki odboj"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr "Mehko odbito"
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr "Spam"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr "Stanje"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr "Zadeva"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr "Čas"
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr "Sledilna e-pošta"
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr "Števec sledenja e-pošte"
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr "Sledilni dogodki"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr "Tip"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr "URL"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr "UTC časovni žig"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr "Odjava"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr "Odjavljeno"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr "Uporabnikov IP"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr "Uporabnikov odjemalec"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr "Družina uporabnikovih odjemalcev"
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr "Tip uporabnikovega odjemalca"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr "Država uporabnika"
diff --git a/mail_tracking/i18n/tr.po b/mail_tracking/i18n/tr.po
new file mode 100644
index 0000000..f9d8fe8
--- /dev/null
+++ b/mail_tracking/i18n/tr.po
@@ -0,0 +1,448 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: mail_tracking
+#: help:mail.tracking.email,state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_description:0
+msgid "Bounce description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,bounce_type:0
+msgid "Bounce type"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Click"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Clicked"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,url:0
+msgid "Clicked URL"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_uid:0
+#: field:mail.tracking.event,create_uid:0
+msgid "Created by"
+msgstr "Oluşturan"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,create_date:0
+#: field:mail.tracking.event,create_date:0
+msgid "Created on"
+msgstr "Oluşturuldu"
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,date:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,date:0
+msgid "Date"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Deferral"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+msgid "Deferred"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Delivered"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,display_name:0
+msgid "Display Name"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,display_name:0
+msgid "Display name"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,mail_id:0
+msgid "Email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "Error"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_smtp_server:0
+msgid "Error SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_description:0
+#: field:mail.tracking.event,error_description:0
+msgid "Error description"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,error_details:0
+msgid "Error details"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,error_type:0
+#: field:mail.tracking.event,error_type:0
+msgid "Error type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,event_type:0
+msgid "Event type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Failed"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Group By"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Hard bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,id:0 field:mail.tracking.event,id:0
+msgid "ID"
+msgstr "ID"
+
+#. module: mail_tracking
+#: field:mail.tracking.event,mobile:0
+msgid "Is mobile?"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,__last_update:0
+#: field:mail.tracking.event,__last_update:0
+msgid "Last Modified on"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_uid:0 field:mail.tracking.event,write_uid:0
+msgid "Last Updated by"
+msgstr "Son güncelleyen"
+
+#. module: mail_tracking
+#: field:mail.tracking.email,write_date:0
+#: field:mail.tracking.event,write_date:0
+msgid "Last Updated on"
+msgstr "Son güncelleme"
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+msgid "MailTracking email search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_email
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "MailTracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_form
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "MailTracking event search"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.actions.act_window,name:mail_tracking.action_view_mail_tracking_event
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+msgid "MailTracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_message
+#: field:mail.tracking.email,mail_message_id:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,tracking_email_id:0
+msgid "Message"
+msgstr ""
+
+#. module: mail_tracking
+#. openerp-web
+#: code:addons/mail_tracking/static/src/js/mail_tracking.js:30
+#, python-format
+msgid "Message tracking"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Month"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Open"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,os_family:0
+msgid "Operating system family"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_mail_mail
+msgid "Outgoing Mails"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.model,name:mail_tracking.model_res_partner
+#: field:mail.tracking.email,partner_id:0
+msgid "Partner"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,recipient:0
+msgid "Recipient"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient:0
+msgid "Recipient email"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,recipient_address:0
+msgid "Recipient email address"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Rejected"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,smtp_server:0
+msgid "SMTP server"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_tree
+msgid "Sender"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,sender:0
+msgid "Sender email"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: selection:mail.tracking.event,event_type:0
+msgid "Sent"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.event,event_type:0
+msgid "Soft bounce"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+msgid "Soft bounced"
+msgstr ""
+
+#. module: mail_tracking
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Spam"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,name:0
+msgid "Subject"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: field:mail.tracking.email,time:0
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,time:0
+msgid "Time"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_email
+#: view:res.partner:mail_tracking.view_partner_form
+#: field:res.partner,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking
+#: field:res.partner,tracking_emails_count:0
+msgid "Tracking emails count"
+msgstr ""
+
+#. module: mail_tracking
+#: model:ir.ui.menu,name:mail_tracking.menu_mail_tracking_event
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: field:mail.tracking.email,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Type"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "URL"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.email,timestamp:0 field:mail.tracking.event,timestamp:0
+msgid "UTC timestamp"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+msgid "Unsubscribe"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_search
+#: selection:mail.tracking.email,state:0
+#: selection:mail.tracking.event,event_type:0
+msgid "Unsubscribed"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ip:0
+msgid "User IP"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.email:mail_tracking.view_mail_tracking_email_form
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_tree
+#: field:mail.tracking.event,user_agent:0
+msgid "User agent"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,ua_family:0
+msgid "User agent family"
+msgstr ""
+
+#. module: mail_tracking
+#: view:mail.tracking.event:mail_tracking.view_mail_tracking_event_search
+#: field:mail.tracking.event,ua_type:0
+msgid "User agent type"
+msgstr ""
+
+#. module: mail_tracking
+#: field:mail.tracking.event,user_country_id:0
+msgid "User country"
+msgstr ""
diff --git a/mail_tracking/models/__init__.py b/mail_tracking/models/__init__.py
new file mode 100644
index 0000000..42a28f5
--- /dev/null
+++ b/mail_tracking/models/__init__.py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+# flake8: noqa
+
+from . import ir_mail_server
+from . import mail_mail
+from . import mail_message
+from . import mail_tracking_email
+from . import mail_tracking_event
+from . import res_partner
diff --git a/mail_tracking/models/__init__.pyc b/mail_tracking/models/__init__.pyc
new file mode 100644
index 0000000..2250ce9
Binary files /dev/null and b/mail_tracking/models/__init__.pyc differ
diff --git a/mail_tracking/models/ir_mail_server.py b/mail_tracking/models/ir_mail_server.py
new file mode 100644
index 0000000..e364a57
--- /dev/null
+++ b/mail_tracking/models/ir_mail_server.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import re
+import threading
+from openerp import models, api, tools
+
+
+class IrMailServer(models.Model):
+ _inherit = "ir.mail_server"
+
+ def _tracking_headers_add(self, tracking_email_id, headers):
+ """Allow other addons to add its own tracking SMTP headers"""
+ headers = headers or {}
+ headers['X-Odoo-Database'] = getattr(
+ threading.currentThread(), 'dbname', None),
+ headers['X-Odoo-Tracking-ID'] = tracking_email_id
+ return headers
+
+ def _tracking_email_id_body_get(self, body):
+ body = body or ''
+ tracking_email_id = False
+ # https://regex101.com/r/lW4cB1/2
+ match = re.search(
+ r' ]* data-odoo-tracking-email=["\']([0-9]*)["\']', body)
+ if match:
+ try:
+ tracking_email_id = int(match.group(1))
+ except: # pragma: no cover
+ pass
+ return tracking_email_id
+
+ def build_email(self, email_from, email_to, subject, body, email_cc=None,
+ email_bcc=None, reply_to=False, attachments=None,
+ message_id=None, references=None, object_id=False,
+ subtype='plain', headers=None, body_alternative=None,
+ subtype_alternative='plain'):
+ tracking_email_id = self._tracking_email_id_body_get(body)
+ if tracking_email_id:
+ headers = self._tracking_headers_add(tracking_email_id, headers)
+ msg = super(IrMailServer, self).build_email(
+ email_from, email_to, subject, body, email_cc=email_cc,
+ email_bcc=email_bcc, reply_to=reply_to, attachments=attachments,
+ message_id=message_id, references=references, object_id=object_id,
+ subtype=subtype, headers=headers,
+ body_alternative=body_alternative,
+ subtype_alternative=subtype_alternative)
+ return msg
+
+ def _tracking_email_get(self, message):
+ tracking_email_id = False
+ if message.get('X-Odoo-Tracking-ID', '').isdigit():
+ tracking_email_id = int(message['X-Odoo-Tracking-ID'])
+ return self.env['mail.tracking.email'].browse(tracking_email_id)
+
+ def _smtp_server_get(self, mail_server_id, smtp_server):
+ smtp_server_used = False
+ mail_server = None
+ if mail_server_id:
+ mail_server = self.browse(mail_server_id)
+ elif not smtp_server:
+ mail_server_ids = self.search([], order='sequence', limit=1)
+ mail_server = mail_server_ids[0] if mail_server_ids else None
+ if mail_server:
+ smtp_server_used = mail_server.smtp_host
+ else: # pragma: no cover
+ smtp_server_used = smtp_server or tools.config.get('smtp_server')
+ return smtp_server_used
+
+ @api.model
+ def send_email(self, message, mail_server_id=None, smtp_server=None,
+ smtp_port=None, smtp_user=None, smtp_password=None,
+ smtp_encryption=None, smtp_debug=False):
+ message_id = False
+ tracking_email = self._tracking_email_get(message)
+ smtp_server_used = self._smtp_server_get(
+ mail_server_id, smtp_server)
+ try:
+ message_id = super(IrMailServer, self).send_email(
+ message, mail_server_id=mail_server_id,
+ smtp_server=smtp_server, smtp_port=smtp_port,
+ smtp_user=smtp_user, smtp_password=smtp_password,
+ smtp_encryption=smtp_encryption, smtp_debug=smtp_debug)
+ except Exception as e:
+ if tracking_email:
+ tracking_email.smtp_error(self, smtp_server_used, e)
+ raise
+ if message_id and tracking_email:
+ vals = tracking_email._tracking_sent_prepare(
+ self, smtp_server_used, message, message_id)
+ if vals:
+ self.env['mail.tracking.event'].sudo().create(vals)
+ return message_id
diff --git a/mail_tracking/models/ir_mail_server.pyc b/mail_tracking/models/ir_mail_server.pyc
new file mode 100644
index 0000000..ebd8cf5
Binary files /dev/null and b/mail_tracking/models/ir_mail_server.pyc differ
diff --git a/mail_tracking/models/mail_mail.py b/mail_tracking/models/mail_mail.py
new file mode 100644
index 0000000..9f5b004
--- /dev/null
+++ b/mail_tracking/models/mail_mail.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import time
+from datetime import datetime
+from email.utils import COMMASPACE
+
+from openerp import models, api, fields
+
+
+class MailMail(models.Model):
+ _inherit = 'mail.mail'
+
+ @api.model
+ def _tracking_email_prepare(self, mail, partner, email):
+ ts = time.time()
+ dt = datetime.utcfromtimestamp(ts)
+ email_to_list = email.get('email_to', [])
+ email_to = COMMASPACE.join(email_to_list)
+ return {
+ 'name': email.get('subject', False),
+ 'timestamp': '%.6f' % ts,
+ 'time': fields.Datetime.to_string(dt),
+ 'mail_id': mail.id if mail else False,
+ 'mail_message_id': mail.mail_message_id.id if mail else False,
+ 'partner_id': partner.id if partner else False,
+ 'recipient': email_to,
+ 'sender': mail.email_from,
+ }
+
+ @api.model
+ def send_get_email_dict(self, mail, partner=None):
+ email = super(MailMail, self).send_get_email_dict(
+ mail, partner=partner)
+ m_tracking = self.env['mail.tracking.email']
+ tracking_email = False
+ if mail:
+ vals = self._tracking_email_prepare(mail, partner, email)
+ tracking_email = m_tracking.sudo().create(vals)
+ if tracking_email:
+ email = tracking_email.tracking_img_add(email)
+ return email
diff --git a/mail_tracking/models/mail_mail.pyc b/mail_tracking/models/mail_mail.pyc
new file mode 100644
index 0000000..9fcb77d
Binary files /dev/null and b/mail_tracking/models/mail_mail.pyc differ
diff --git a/mail_tracking/models/mail_message.py b/mail_tracking/models/mail_message.py
new file mode 100644
index 0000000..682ef61
--- /dev/null
+++ b/mail_tracking/models/mail_message.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, api
+import logging
+_logger = logging.getLogger(__name__)
+
+
+class MailMessage(models.Model):
+ _inherit = "mail.message"
+
+ def _tracking_status_map_get(self):
+ return {
+ 'False': 'waiting',
+ 'error': 'error',
+ 'deferred': 'sent',
+ 'sent': 'sent',
+ 'delivered': 'delivered',
+ 'opened': 'opened',
+ 'rejected': 'error',
+ 'spam': 'error',
+ 'unsub': 'opened',
+ 'bounced': 'error',
+ 'soft-bounced': 'error',
+ }
+
+ def _partner_tracking_status_get(self, tracking_email):
+ tracking_status_map = self._tracking_status_map_get()
+ status = 'unknown'
+ if tracking_email:
+ tracking_email_status = str(tracking_email.state)
+ status = tracking_status_map.get(tracking_email_status, 'unknown')
+ return status
+
+ @api.model
+ def _message_read_dict_postprocess(self, messages, message_tree):
+ res = super(MailMessage, self)._message_read_dict_postprocess(
+ messages, message_tree)
+ for message_dict in messages:
+ mail_message_id = message_dict.get('id', False)
+ if mail_message_id:
+ partner_trackings = {}
+ for partner in message_dict.get('partner_ids', []):
+ partner_id = partner[0]
+ tracking_email = self.env['mail.tracking.email'].search([
+ ('mail_message_id', '=', mail_message_id),
+ ('partner_id', '=', partner_id),
+ ], limit=1)
+ status = self._partner_tracking_status_get(tracking_email)
+ partner_trackings[str(partner_id)] = (
+ status, tracking_email.id)
+ message_dict['partner_trackings'] = partner_trackings
+ return res
diff --git a/mail_tracking/models/mail_message.pyc b/mail_tracking/models/mail_message.pyc
new file mode 100644
index 0000000..c9400ad
Binary files /dev/null and b/mail_tracking/models/mail_message.pyc differ
diff --git a/mail_tracking/models/mail_tracking_email.py b/mail_tracking/models/mail_tracking_email.py
new file mode 100644
index 0000000..d063581
--- /dev/null
+++ b/mail_tracking/models/mail_tracking_email.py
@@ -0,0 +1,312 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import logging
+import urlparse
+import time
+import re
+from datetime import datetime
+
+from openerp import models, api, fields, tools
+import openerp.addons.decimal_precision as dp
+
+_logger = logging.getLogger(__name__)
+
+EVENT_OPEN_DELTA = 10 # seconds
+EVENT_CLICK_DELTA = 5 # seconds
+
+
+class MailTrackingEmail(models.Model):
+ _name = "mail.tracking.email"
+ _order = 'time desc'
+ _rec_name = 'display_name'
+ _description = 'MailTracking email'
+
+ name = fields.Char(string="Subject", readonly=True, index=True)
+ display_name = fields.Char(
+ string="Display name", readonly=True, store=True,
+ compute="_compute_display_name")
+ timestamp = fields.Float(
+ string='UTC timestamp', readonly=True,
+ digits=dp.get_precision('MailTracking Timestamp'))
+ time = fields.Datetime(string="Time", readonly=True)
+ date = fields.Date(
+ string="Date", readonly=True, compute="_compute_date", store=True)
+ mail_message_id = fields.Many2one(
+ string="Message", comodel_name='mail.message', readonly=True)
+ mail_id = fields.Many2one(
+ string="Email", comodel_name='mail.mail', readonly=True)
+ partner_id = fields.Many2one(
+ string="Partner", comodel_name='res.partner', readonly=True)
+ recipient = fields.Char(string='Recipient email', readonly=True)
+ recipient_address = fields.Char(
+ string='Recipient email address', readonly=True, store=True,
+ compute='_compute_recipient_address')
+ sender = fields.Char(string='Sender email', readonly=True)
+ state = fields.Selection([
+ ('error', 'Error'),
+ ('deferred', 'Deferred'),
+ ('sent', 'Sent'),
+ ('delivered', 'Delivered'),
+ ('opened', 'Opened'),
+ ('rejected', 'Rejected'),
+ ('spam', 'Spam'),
+ ('unsub', 'Unsubscribed'),
+ ('bounced', 'Bounced'),
+ ('soft-bounced', 'Soft bounced'),
+ ], string='State', index=True, readonly=True, default=False,
+ help=" * The 'Error' status indicates that there was an error "
+ "when trying to sent the email, for example, "
+ "'No valid recipient'\n"
+ " * The 'Sent' status indicates that message was succesfully "
+ "sent via outgoing email server (SMTP).\n"
+ " * The 'Delivered' status indicates that message was "
+ "succesfully delivered to recipient Mail Exchange (MX) server.\n"
+ " * The 'Opened' status indicates that message was opened or "
+ "clicked by recipient.\n"
+ " * The 'Rejected' status indicates that recipient email "
+ "address is blacklisted by outgoing email server (SMTP). "
+ "It is recomended to delete this email address.\n"
+ " * The 'Spam' status indicates that outgoing email "
+ "server (SMTP) consider this message as spam.\n"
+ " * The 'Unsubscribed' status indicates that recipient has "
+ "requested to be unsubscribed from this message.\n"
+ " * The 'Bounced' status indicates that message was bounced "
+ "by recipient Mail Exchange (MX) server.\n"
+ " * The 'Soft bounced' status indicates that message was soft "
+ "bounced by recipient Mail Exchange (MX) server.\n")
+ error_smtp_server = fields.Char(string='Error SMTP server', readonly=True)
+ error_type = fields.Char(string='Error type', readonly=True)
+ error_description = fields.Char(
+ string='Error description', readonly=True)
+ bounce_type = fields.Char(string='Bounce type', readonly=True)
+ bounce_description = fields.Char(
+ string='Bounce description', readonly=True)
+ tracking_event_ids = fields.One2many(
+ string="Tracking events", comodel_name='mail.tracking.event',
+ inverse_name='tracking_email_id', readonly=True)
+
+ @api.model
+ def tracking_ids_recalculate(self, model, email_field, tracking_field,
+ email, new_tracking=None):
+ objects = self.env[model].search([
+ (email_field, '=ilike', email),
+ ])
+ for obj in objects:
+ trackings = obj[tracking_field]
+ if new_tracking:
+ trackings |= new_tracking
+ trackings = trackings._email_score_tracking_filter()
+ if set(obj[tracking_field].ids) != set(trackings.ids):
+ if trackings:
+ obj.write({
+ tracking_field: [(6, False, trackings.ids)]
+ })
+ else:
+ obj.write({
+ tracking_field: [(5, False, False)]
+ })
+ return objects
+
+ @api.model
+ def _tracking_ids_to_write(self, email):
+ trackings = self.env['mail.tracking.email'].search([
+ ('recipient_address', '=ilike', email)
+ ])
+ trackings = trackings._email_score_tracking_filter()
+ if trackings:
+ return [(6, False, trackings.ids)]
+ else:
+ return [(5, False, False)]
+
+ @api.multi
+ def _email_score_tracking_filter(self):
+ """Default email score filter for tracking emails"""
+ # Consider only last 10 tracking emails
+ return self.sorted(key=lambda r: r.time, reverse=True)[:10]
+
+ @api.model
+ def email_score_from_email(self, email):
+ trackings = self.env['mail.tracking.email'].search([
+ ('recipient_address', '=ilike', email)
+ ])
+ return trackings.email_score()
+
+ @api.multi
+ def email_score(self):
+ """Default email score algorimth"""
+ score = 50.0
+ trackings = self._email_score_tracking_filter()
+ for tracking in trackings:
+ if tracking.state in ('error',):
+ score -= 50.0
+ elif tracking.state in ('rejected', 'spam', 'bounced'):
+ score -= 25.0
+ elif tracking.state in ('soft-bounced', 'unsub'):
+ score -= 10.0
+ elif tracking.state in ('delivered',):
+ score += 5.0
+ elif tracking.state in ('opened',):
+ score += 10.0
+ if score > 100.0:
+ score = 100.0
+ return score
+
+ @api.multi
+ @api.depends('recipient')
+ def _compute_recipient_address(self):
+ for email in self:
+ matches = re.search(r'<(.*@.*)>', email.recipient)
+ if matches:
+ email.recipient_address = matches.group(1)
+ else:
+ email.recipient_address = email.recipient
+
+ @api.multi
+ @api.depends('name', 'recipient')
+ def _compute_display_name(self):
+ for email in self:
+ parts = [email.name]
+ if email.recipient:
+ parts.append(email.recipient)
+ email.display_name = ' - '.join(parts)
+
+ @api.multi
+ @api.depends('time')
+ def _compute_date(self):
+ for email in self:
+ email.date = fields.Date.to_string(
+ fields.Date.from_string(email.time))
+
+ @api.model
+ def create(self, vals):
+ tracking = super(MailTrackingEmail, self).create(vals)
+ self.tracking_ids_recalculate(
+ 'res.partner', 'email', 'tracking_email_ids',
+ tracking.recipient_address, new_tracking=tracking)
+ return tracking
+
+ def _get_mail_tracking_img(self):
+ base_url = self.env['ir.config_parameter'].get_param('web.base.url')
+ path_url = (
+ 'mail/tracking/open/%(db)s/%(tracking_email_id)s/blank.gif' % {
+ 'db': self.env.cr.dbname,
+ 'tracking_email_id': self.id,
+ })
+ track_url = urlparse.urljoin(base_url, path_url)
+ return (
+ ' ' % {
+ 'url': track_url,
+ 'tracking_email_id': self.id,
+ })
+
+ @api.multi
+ def smtp_error(self, mail_server, smtp_server, exception):
+ self.sudo().write({
+ 'error_smtp_server': tools.ustr(smtp_server),
+ 'error_type': exception.__class__.__name__,
+ 'error_description': tools.ustr(exception),
+ 'state': 'error',
+ })
+ return True
+
+ @api.multi
+ def tracking_img_add(self, email):
+ self.ensure_one()
+ tracking_url = self._get_mail_tracking_img()
+ if tracking_url:
+ body = tools.append_content_to_html(
+ email.get('body', ''), tracking_url, plaintext=False,
+ container_tag='div')
+ email['body'] = body
+ return email
+
+ def _message_partners_check(self, message, message_id):
+ mail_message = self.mail_message_id
+ partners = mail_message.notified_partner_ids | mail_message.partner_ids
+ if (self.partner_id and self.partner_id not in partners):
+ # If mail_message haven't tracking partner, then
+ # add it in order to see his trackking status in chatter
+ if mail_message.subtype_id:
+ mail_message.sudo().write({
+ 'notified_partner_ids': [(4, self.partner_id.id)],
+ })
+ else:
+ mail_message.sudo().write({
+ 'partner_ids': [(4, self.partner_id.id)],
+ })
+ return True
+
+ @api.multi
+ def _tracking_sent_prepare(self, mail_server, smtp_server, message,
+ message_id):
+ self.ensure_one()
+ ts = time.time()
+ dt = datetime.utcfromtimestamp(ts)
+ self._message_partners_check(message, message_id)
+ self.sudo().write({'state': 'sent'})
+ return {
+ 'recipient': message['To'],
+ 'timestamp': '%.6f' % ts,
+ 'time': fields.Datetime.to_string(dt),
+ 'tracking_email_id': self.id,
+ 'event_type': 'sent',
+ 'smtp_server': smtp_server,
+ }
+
+ def _event_prepare(self, event_type, metadata):
+ self.ensure_one()
+ m_event = self.env['mail.tracking.event']
+ method = getattr(m_event, 'process_' + event_type, None)
+ if method and hasattr(method, '__call__'):
+ return method(self, metadata)
+ else: # pragma: no cover
+ _logger.info('Unknown event type: %s' % event_type)
+ return False
+
+ def _concurrent_events(self, event_type, metadata):
+ m_event = self.env['mail.tracking.event']
+ self.ensure_one()
+ concurrent_event_ids = False
+ if event_type in {'open', 'click'}:
+ ts = metadata.get('timestamp', time.time())
+ delta = EVENT_OPEN_DELTA if event_type == 'open' \
+ else EVENT_CLICK_DELTA
+ domain = [
+ ('timestamp', '>=', ts - delta),
+ ('timestamp', '<=', ts + delta),
+ ('tracking_email_id', '=', self.id),
+ ('event_type', '=', event_type),
+ ]
+ if event_type == 'click':
+ domain.append(('url', '=', metadata.get('url', False)))
+ concurrent_event_ids = m_event.search(domain)
+ return concurrent_event_ids
+
+ @api.multi
+ def event_create(self, event_type, metadata):
+ event_ids = self.env['mail.tracking.event']
+ for tracking_email in self:
+ other_ids = tracking_email._concurrent_events(event_type, metadata)
+ if not other_ids:
+ vals = tracking_email._event_prepare(event_type, metadata)
+ if vals:
+ event_ids += event_ids.sudo().create(vals)
+ partners = self.tracking_ids_recalculate(
+ 'res.partner', 'email', 'tracking_email_ids',
+ tracking_email.recipient_address)
+ if partners:
+ partners.email_score_calculate()
+ else:
+ _logger.debug("Concurrent event '%s' discarded", event_type)
+ return event_ids
+
+ @api.model
+ def event_process(self, request, post, metadata, event_type=None):
+ # Generic event process hook, inherit it and
+ # - return 'OK' if processed
+ # - return 'NONE' if this request is not for you
+ # - return 'ERROR' if any error
+ return 'NONE' # pragma: no cover
diff --git a/mail_tracking/models/mail_tracking_email.pyc b/mail_tracking/models/mail_tracking_email.pyc
new file mode 100644
index 0000000..250220f
Binary files /dev/null and b/mail_tracking/models/mail_tracking_email.pyc differ
diff --git a/mail_tracking/models/mail_tracking_event.py b/mail_tracking/models/mail_tracking_event.py
new file mode 100644
index 0000000..728f88c
--- /dev/null
+++ b/mail_tracking/models/mail_tracking_event.py
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import time
+from datetime import datetime
+
+from openerp import models, api, fields
+import openerp.addons.decimal_precision as dp
+
+
+class MailTrackingEvent(models.Model):
+ _name = "mail.tracking.event"
+ _order = 'timestamp desc'
+ _rec_name = 'event_type'
+ _description = 'MailTracking event'
+
+ recipient = fields.Char(string="Recipient", readonly=True)
+ timestamp = fields.Float(
+ string='UTC timestamp', readonly=True,
+ digits=dp.get_precision('MailTracking Timestamp'))
+ time = fields.Datetime(string="Time", readonly=True)
+ date = fields.Date(
+ string="Date", readonly=True, compute="_compute_date", store=True)
+ tracking_email_id = fields.Many2one(
+ string='Message', readonly=True,
+ comodel_name='mail.tracking.email')
+ event_type = fields.Selection(string='Event type', selection=[
+ ('sent', 'Sent'),
+ ('delivered', 'Delivered'),
+ ('deferral', 'Deferral'),
+ ('hard_bounce', 'Hard bounce'),
+ ('soft_bounce', 'Soft bounce'),
+ ('open', 'Open'),
+ ('click', 'Clicked'),
+ ('spam', 'Spam'),
+ ('unsub', 'Unsubscribed'),
+ ('reject', 'Rejected'),
+ ], readonly=True)
+ smtp_server = fields.Char(string='SMTP server', 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')
+ error_type = fields.Char(string='Error type', readonly=True)
+ error_description = fields.Char(string='Error description', readonly=True)
+ error_details = fields.Text(string='Error details', readonly=True)
+
+ @api.multi
+ @api.depends('time')
+ def _compute_date(self):
+ for email in self:
+ email.date = fields.Date.to_string(
+ fields.Date.from_string(email.time))
+
+ def _process_data(self, tracking_email, metadata, event_type, state):
+ ts = time.time()
+ dt = datetime.utcfromtimestamp(ts)
+ return {
+ 'recipient': metadata.get('recipient', tracking_email.recipient),
+ 'timestamp': metadata.get('timestamp', ts),
+ 'time': metadata.get('time', fields.Datetime.to_string(dt)),
+ 'date': metadata.get('date', fields.Date.to_string(dt)),
+ 'tracking_email_id': tracking_email.id,
+ 'event_type': event_type,
+ 'ip': metadata.get('ip', False),
+ 'url': metadata.get('url', False),
+ 'user_agent': metadata.get('user_agent', False),
+ 'mobile': metadata.get('mobile', False),
+ 'os_family': metadata.get('os_family', False),
+ 'ua_family': metadata.get('ua_family', False),
+ 'ua_type': metadata.get('ua_type', False),
+ 'user_country_id': metadata.get('user_country_id', False),
+ 'error_type': metadata.get('error_type', False),
+ 'error_description': metadata.get('error_description', False),
+ 'error_details': metadata.get('error_details', False),
+ }
+
+ def _process_status(self, tracking_email, metadata, event_type, state):
+ tracking_email.sudo().write({'state': state})
+ return self._process_data(tracking_email, metadata, event_type, state)
+
+ def _process_bounce(self, tracking_email, metadata, event_type, state):
+ tracking_email.sudo().write({
+ 'state': state,
+ 'bounce_type': metadata.get('bounce_type', False),
+ 'bounce_description': metadata.get('bounce_description', False),
+ })
+ return self._process_data(tracking_email, metadata, event_type, state)
+
+ @api.model
+ def process_delivered(self, tracking_email, metadata):
+ return self._process_status(
+ tracking_email, metadata, 'delivered', 'delivered')
+
+ @api.model
+ def process_deferral(self, tracking_email, metadata):
+ return self._process_status(
+ tracking_email, metadata, 'deferral', 'deferred')
+
+ @api.model
+ def process_hard_bounce(self, tracking_email, metadata):
+ return self._process_bounce(
+ tracking_email, metadata, 'hard_bounce', 'bounced')
+
+ @api.model
+ def process_soft_bounce(self, tracking_email, metadata):
+ return self._process_bounce(
+ tracking_email, metadata, 'soft_bounce', 'soft-bounced')
+
+ @api.model
+ def process_open(self, tracking_email, metadata):
+ return self._process_status(tracking_email, metadata, 'open', 'opened')
+
+ @api.model
+ def process_click(self, tracking_email, metadata):
+ return self._process_status(
+ tracking_email, metadata, 'click', 'opened')
+
+ @api.model
+ def process_spam(self, tracking_email, metadata):
+ return self._process_status(tracking_email, metadata, 'spam', 'spam')
+
+ @api.model
+ def process_unsub(self, tracking_email, metadata):
+ return self._process_status(tracking_email, metadata, 'unsub', 'unsub')
+
+ @api.model
+ def process_reject(self, tracking_email, metadata):
+ return self._process_status(
+ tracking_email, metadata, 'reject', 'rejected')
diff --git a/mail_tracking/models/mail_tracking_event.pyc b/mail_tracking/models/mail_tracking_event.pyc
new file mode 100644
index 0000000..c8d313f
Binary files /dev/null and b/mail_tracking/models/mail_tracking_event.pyc differ
diff --git a/mail_tracking/models/res_partner.py b/mail_tracking/models/res_partner.py
new file mode 100644
index 0000000..908f119
--- /dev/null
+++ b/mail_tracking/models/res_partner.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, api, fields
+
+
+class ResPartner(models.Model):
+ _inherit = 'res.partner'
+
+ tracking_email_ids = fields.Many2many(
+ string="Tracking emails", comodel_name="mail.tracking.email",
+ readonly=True)
+ tracking_emails_count = fields.Integer(
+ string="Tracking emails count", store=True, readonly=True,
+ compute="_compute_tracking_emails_count")
+ email_score = fields.Float(
+ string="Email score", readonly=True, default=50.0)
+
+ @api.multi
+ def email_score_calculate(self):
+ # This is not a compute method because is causing a inter-block
+ # in mail_tracking_email PostgreSQL table
+ # We suspect that tracking_email write to state field block that
+ # table and then inside write ORM try to read from DB
+ # tracking_email_ids because it's not in cache.
+ # PostgreSQL blocks read because we have not committed yet the write
+ for partner in self:
+ partner.email_score = partner.tracking_email_ids.email_score()
+
+ @api.one
+ @api.depends('tracking_email_ids')
+ def _compute_tracking_emails_count(self):
+ self.tracking_emails_count = self.env['mail.tracking.email'].\
+ search_count([
+ ('recipient_address', '=ilike', self.email)
+ ])
+
+ @api.multi
+ def write(self, vals):
+ email = vals.get('email')
+ if email is not None:
+ m_track = self.env['mail.tracking.email']
+ vals['tracking_email_ids'] = m_track._tracking_ids_to_write(email)
+ vals['email_score'] = m_track.email_score_from_email(email)
+ return super(ResPartner, self).write(vals)
diff --git a/mail_tracking/models/res_partner.pyc b/mail_tracking/models/res_partner.pyc
new file mode 100644
index 0000000..eca67ff
Binary files /dev/null and b/mail_tracking/models/res_partner.pyc differ
diff --git a/mail_tracking/security/ir.model.access.csv b/mail_tracking/security/ir.model.access.csv
new file mode 100644
index 0000000..ab17dc3
--- /dev/null
+++ b/mail_tracking/security/ir.model.access.csv
@@ -0,0 +1,5 @@
+"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_mail_tracking_email_group_user","mail_tracking_email group_user","model_mail_tracking_email","base.group_user",1,0,0,0
+"access_mail_tracking_event_group_user","mail_tracking_event group_user","model_mail_tracking_event","base.group_user",1,0,0,0
+"access_mail_tracking_email_group_system","mail_tracking_email group_system","model_mail_tracking_email","base.group_system",1,1,1,1
+"access_mail_tracking_event_group_system","mail_tracking_event group_system","model_mail_tracking_event","base.group_system",1,1,1,1
diff --git a/mail_tracking/static/description/icon.png b/mail_tracking/static/description/icon.png
new file mode 100644
index 0000000..c1af495
Binary files /dev/null and b/mail_tracking/static/description/icon.png differ
diff --git a/mail_tracking/static/src/css/mail_tracking.css b/mail_tracking/static/src/css/mail_tracking.css
new file mode 100644
index 0000000..63d1ac4
--- /dev/null
+++ b/mail_tracking/static/src/css/mail_tracking.css
@@ -0,0 +1,13 @@
+/* © 2016 Antonio Espinosa -
+ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). */
+
+.mail_tracking span {
+ color: #909090;
+}
+.mail_tracking_pointer {
+ cursor: pointer;
+}
+
+.mail_tracking span.mail_tracking_opened {
+ color: #a34a8b;
+}
diff --git a/mail_tracking/static/src/img/delivered.png b/mail_tracking/static/src/img/delivered.png
new file mode 100644
index 0000000..25f9803
Binary files /dev/null and b/mail_tracking/static/src/img/delivered.png differ
diff --git a/mail_tracking/static/src/img/error.png b/mail_tracking/static/src/img/error.png
new file mode 100644
index 0000000..e8e114a
Binary files /dev/null and b/mail_tracking/static/src/img/error.png differ
diff --git a/mail_tracking/static/src/img/opened.png b/mail_tracking/static/src/img/opened.png
new file mode 100644
index 0000000..a5ce70f
Binary files /dev/null and b/mail_tracking/static/src/img/opened.png differ
diff --git a/mail_tracking/static/src/img/sent.png b/mail_tracking/static/src/img/sent.png
new file mode 100644
index 0000000..0abeb1e
Binary files /dev/null and b/mail_tracking/static/src/img/sent.png differ
diff --git a/mail_tracking/static/src/img/unknown.png b/mail_tracking/static/src/img/unknown.png
new file mode 100644
index 0000000..c17c681
Binary files /dev/null and b/mail_tracking/static/src/img/unknown.png differ
diff --git a/mail_tracking/static/src/img/waiting.png b/mail_tracking/static/src/img/waiting.png
new file mode 100644
index 0000000..12af3b2
Binary files /dev/null and b/mail_tracking/static/src/img/waiting.png differ
diff --git a/mail_tracking/static/src/js/mail_tracking.js b/mail_tracking/static/src/js/mail_tracking.js
new file mode 100644
index 0000000..2122517
--- /dev/null
+++ b/mail_tracking/static/src/js/mail_tracking.js
@@ -0,0 +1,62 @@
+/* © 2016 Antonio Espinosa -
+ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). */
+
+(function ($, window, document) {
+ 'use strict';
+
+ openerp.mail_tracking = function (instance) {
+ var _t = instance.web._t,
+ _lt = instance.web._lt;
+ var QWeb = instance.web.qweb;
+ var mail_orig = instance.mail;
+ var mail_inherit = function() {
+ instance.mail.MessageCommon.include({
+ init: function (parent, datasets, options) {
+ this._super(parent, datasets, options);
+ this.partner_trackings = datasets.partner_trackings || [];
+ }
+ });
+ instance.mail.ThreadMessage.include({
+ bind_events: function () {
+ this._super();
+ this.$('.oe_mail_action_tracking').on('click', this.on_tracking_status_clicked);
+ },
+ on_tracking_status_clicked: function (event) {
+ event.preventDefault();
+ var tracking_email_id = $(event.delegateTarget).data('tracking');
+ var state = {
+ 'model': 'mail.tracking.email',
+ 'id': tracking_email_id,
+ 'title': _t("Message tracking"),
+ };
+ instance.webclient.action_manager.do_push_state(state);
+ var action = {
+ type:'ir.actions.act_window',
+ view_type: 'form',
+ view_mode: 'form',
+ res_model: 'mail.tracking.email',
+ views: [[false, 'form']],
+ target: 'new',
+ res_id: tracking_email_id,
+ };
+ this.do_action(action);
+ }
+ });
+ };
+
+ // Tricky way to guarantee that this module is loaded always
+ // after mail module.
+ // When --load=web,mail_tracking is specified in init script, then
+ // web and mail_tracking are the first modules to load in JS
+ if (instance.mail.MessageCommon === undefined) {
+ instance.mail = function(instance) {
+ instance.mail = mail_orig;
+ instance.mail(instance, instance.mail);
+ mail_inherit();
+ };
+ } else {
+ mail_inherit();
+ }
+ };
+
+}(window.jQuery, window, document));
diff --git a/mail_tracking/static/src/xml/mail_tracking.xml b/mail_tracking/static/src/xml/mail_tracking.xml
new file mode 100644
index 0000000..db534ee
--- /dev/null
+++ b/mail_tracking/static/src/xml/mail_tracking.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mail_tracking/tests/__init__.py b/mail_tracking/tests/__init__.py
new file mode 100644
index 0000000..ce3de1c
--- /dev/null
+++ b/mail_tracking/tests/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+# flake8: noqa
+
+from . import test_mail_tracking
diff --git a/mail_tracking/tests/test_mail_tracking.py b/mail_tracking/tests/test_mail_tracking.py
new file mode 100644
index 0000000..5e855f3
--- /dev/null
+++ b/mail_tracking/tests/test_mail_tracking.py
@@ -0,0 +1,261 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import mock
+import base64
+import time
+from openerp.tests.common import TransactionCase
+from ..controllers.main import MailTrackingController, BLANK
+
+mock_request = 'openerp.http.request'
+mock_send_email = ('openerp.addons.base.ir.ir_mail_server.'
+ 'ir_mail_server.send_email')
+
+
+class FakeUserAgent(object):
+ browser = 'Test browser'
+ platform = 'Test platform'
+
+ def __str__(self):
+ """Return name"""
+ return 'Test suite'
+
+
+# One test case per method
+class TestMailTracking(TransactionCase):
+ # Use case : Prepare some data for current test case
+ def setUp(self):
+ super(TestMailTracking, self).setUp()
+ self.sender = self.env['res.partner'].create({
+ 'name': 'Test sender',
+ 'email': 'sender@example.com',
+ 'notify_email': 'always',
+ })
+ self.recipient = self.env['res.partner'].create({
+ 'name': 'Test recipient',
+ 'email': 'recipient@example.com',
+ 'notify_email': 'always',
+ })
+ self.request = {
+ 'httprequest': type('obj', (object,), {
+ 'remote_addr': '123.123.123.123',
+ 'user_agent': FakeUserAgent(),
+ }),
+ }
+
+ def test_message_post(self):
+ # This message will generate a notification for recipient
+ message = self.env['mail.message'].create({
+ 'subject': 'Message test',
+ 'author_id': self.sender.id,
+ 'email_from': self.sender.email,
+ 'type': 'comment',
+ 'model': 'res.partner',
+ 'res_id': self.recipient.id,
+ 'partner_ids': [(4, self.recipient.id)],
+ 'body': 'This is a test message
',
+ })
+ # Search tracking created
+ tracking_email = self.env['mail.tracking.email'].search([
+ ('mail_message_id', '=', message.id),
+ ('partner_id', '=', self.recipient.id),
+ ])
+ # The tracking email must be sent
+ self.assertTrue(tracking_email)
+ self.assertEqual(tracking_email.state, 'sent')
+ # message_dict read by web interface
+ message_dict = self.env['mail.message'].message_read(message.id)
+ # First item is message content
+ self.assertTrue(len(message_dict) > 0)
+ message_dict = message_dict[0]
+ self.assertTrue(len(message_dict['partner_ids']) > 0)
+ # First partner is recipient
+ partner_id = message_dict['partner_ids'][0][0]
+ self.assertEqual(partner_id, self.recipient.id)
+ status = message_dict['partner_trackings'][str(partner_id)]
+ # Tracking status must be sent and
+ # mail tracking must be the one search before
+ self.assertEqual(status[0], 'sent')
+ self.assertEqual(status[1], tracking_email.id)
+ # And now open the email
+ metadata = {
+ 'ip': '127.0.0.1',
+ 'user_agent': 'Odoo Test/1.0',
+ 'os_family': 'linux',
+ 'ua_family': 'odoo',
+ }
+ tracking_email.event_create('open', metadata)
+ self.assertEqual(tracking_email.state, 'opened')
+
+ def mail_send(self, recipient):
+ mail = self.env['mail.mail'].create({
+ 'subject': 'Test subject',
+ 'email_from': 'from@domain.com',
+ 'email_to': recipient,
+ 'body_html': 'This is a test message
',
+ })
+ mail.send()
+ # Search tracking created
+ tracking_email = self.env['mail.tracking.email'].search([
+ ('mail_id', '=', mail.id),
+ ])
+ return mail, tracking_email
+
+ def test_mail_send(self):
+ controller = MailTrackingController()
+ db = self.env.cr.dbname
+ image = base64.decodestring(BLANK)
+ mail, tracking = self.mail_send(self.recipient.email)
+ self.assertEqual(mail.email_to, tracking.recipient)
+ self.assertEqual(mail.email_from, tracking.sender)
+ with mock.patch(mock_request) as mock_func:
+ mock_func.return_value = type('obj', (object,), self.request)
+ res = controller.mail_tracking_open(db, tracking.id)
+ self.assertEqual(image, res.response[0])
+
+ def test_concurrent_open(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ ts = time.time()
+ metadata = {
+ 'ip': '127.0.0.1',
+ 'user_agent': 'Odoo Test/1.0',
+ 'os_family': 'linux',
+ 'ua_family': 'odoo',
+ 'timestamp': ts,
+ }
+ # First open event
+ tracking.event_create('open', metadata)
+ opens = tracking.tracking_event_ids.filtered(
+ lambda r: r.event_type == 'open'
+ )
+ self.assertEqual(len(opens), 1)
+ # Concurrent open event
+ metadata['timestamp'] = ts + 2
+ tracking.event_create('open', metadata)
+ opens = tracking.tracking_event_ids.filtered(
+ lambda r: r.event_type == 'open'
+ )
+ self.assertEqual(len(opens), 1)
+ # Second open event
+ metadata['timestamp'] = ts + 350
+ tracking.event_create('open', metadata)
+ opens = tracking.tracking_event_ids.filtered(
+ lambda r: r.event_type == 'open'
+ )
+ self.assertEqual(len(opens), 2)
+
+ def test_concurrent_click(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ ts = time.time()
+ metadata = {
+ 'ip': '127.0.0.1',
+ 'user_agent': 'Odoo Test/1.0',
+ 'os_family': 'linux',
+ 'ua_family': 'odoo',
+ 'timestamp': ts,
+ 'url': 'https://www.example.com/route/1',
+ }
+ # First click event (URL 1)
+ tracking.event_create('click', metadata)
+ opens = tracking.tracking_event_ids.filtered(
+ lambda r: r.event_type == 'click'
+ )
+ self.assertEqual(len(opens), 1)
+ # Concurrent click event (URL 1)
+ metadata['timestamp'] = ts + 2
+ tracking.event_create('click', metadata)
+ opens = tracking.tracking_event_ids.filtered(
+ lambda r: r.event_type == 'click'
+ )
+ self.assertEqual(len(opens), 1)
+ # Second click event (URL 1)
+ metadata['timestamp'] = ts + 350
+ tracking.event_create('click', metadata)
+ opens = tracking.tracking_event_ids.filtered(
+ lambda r: r.event_type == 'click'
+ )
+ self.assertEqual(len(opens), 2)
+ # Concurrent click event (URL 2)
+ metadata['timestamp'] = ts + 2
+ metadata['url'] = 'https://www.example.com/route/2'
+ tracking.event_create('click', metadata)
+ opens = tracking.tracking_event_ids.filtered(
+ lambda r: r.event_type == 'click'
+ )
+ self.assertEqual(len(opens), 3)
+
+ def test_smtp_error(self):
+ with mock.patch(mock_send_email) as mock_func:
+ mock_func.side_effect = Warning('Test error')
+ mail, tracking = self.mail_send(self.recipient.email)
+ self.assertEqual('error', tracking.state)
+ self.assertEqual('Warning', tracking.error_type)
+ self.assertEqual('Test error', tracking.error_description)
+
+ def test_partner_email_change(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('open', {})
+ orig_score = self.recipient.email_score
+ orig_email = self.recipient.email
+ self.recipient.email = orig_email + '2'
+ self.assertEqual(50.0, self.recipient.email_score)
+ self.recipient.email = orig_email
+ self.assertEqual(orig_score, self.recipient.email_score)
+
+ def test_process_hard_bounce(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('hard_bounce', {})
+ self.assertEqual('bounced', tracking.state)
+
+ def test_process_soft_bounce(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('soft_bounce', {})
+ self.assertEqual('soft-bounced', tracking.state)
+
+ def test_process_delivered(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('delivered', {})
+ self.assertEqual('delivered', tracking.state)
+
+ def test_process_deferral(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('deferral', {})
+ self.assertEqual('deferred', tracking.state)
+
+ def test_process_spam(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('spam', {})
+ self.assertEqual('spam', tracking.state)
+
+ def test_process_unsub(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('unsub', {})
+ self.assertEqual('unsub', tracking.state)
+
+ def test_process_reject(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('reject', {})
+ self.assertEqual('rejected', tracking.state)
+
+ def test_process_open(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('open', {})
+ self.assertEqual('opened', tracking.state)
+
+ def test_process_click(self):
+ mail, tracking = self.mail_send(self.recipient.email)
+ tracking.event_create('click', {})
+ self.assertEqual('opened', tracking.state)
+
+ def test_db(self):
+ db = self.env.cr.dbname
+ controller = MailTrackingController()
+ with mock.patch(mock_request) as mock_func:
+ mock_func.return_value = type('obj', (object,), self.request)
+ not_found = controller.mail_tracking_all('not_found_db')
+ self.assertEqual('NOT FOUND', not_found.response[0])
+ none = controller.mail_tracking_all(db)
+ self.assertEqual('NONE', none.response[0])
+ none = controller.mail_tracking_event(db, 'open')
+ self.assertEqual('NONE', none.response[0])
diff --git a/mail_tracking/views/assets.xml b/mail_tracking/views/assets.xml
new file mode 100644
index 0000000..6e737fb
--- /dev/null
+++ b/mail_tracking/views/assets.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mail_tracking/views/mail_tracking_email_view.xml b/mail_tracking/views/mail_tracking_email_view.xml
new file mode 100644
index 0000000..f2b12af
--- /dev/null
+++ b/mail_tracking/views/mail_tracking_email_view.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+ mail.tracking.email.form
+ mail.tracking.email
+
+
+
+
+
+
+ mail.tracking.email.tree
+ mail.tracking.email
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mail.tracking.email.search
+ mail.tracking.email
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MailTracking emails
+ mail.tracking.email
+ form
+ tree,form
+
+
+
+
+
+
+
+
diff --git a/mail_tracking/views/mail_tracking_event_view.xml b/mail_tracking/views/mail_tracking_event_view.xml
new file mode 100644
index 0000000..9dfa8c6
--- /dev/null
+++ b/mail_tracking/views/mail_tracking_event_view.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+ mail.tracking.event.form
+ mail.tracking.event
+
+
+
+
+
+
+ mail.tracking.event.tree
+ mail.tracking.event
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mail.tracking.event.search
+ mail.tracking.event
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MailTracking events
+ mail.tracking.event
+ form
+ tree,form
+
+
+
+
+
+
+
+
+
diff --git a/mail_tracking/views/res_partner_view.xml b/mail_tracking/views/res_partner_view.xml
new file mode 100644
index 0000000..4f22760
--- /dev/null
+++ b/mail_tracking/views/res_partner_view.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+ Partner Form with tracking emails
+ res.partner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mail_tracking_mailgun/README.rst b/mail_tracking_mailgun/README.rst
new file mode 100644
index 0000000..880d07e
--- /dev/null
+++ b/mail_tracking_mailgun/README.rst
@@ -0,0 +1,86 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+=========================
+Mail tracking for Mailgun
+=========================
+
+This module integrates mail_tracking events with Mailgun webhooks.
+
+Mailgun (https://www.mailgun.com/) is a service that provides an e-mail
+sending infrastructure through an SMTP server or via API. You can also
+query that API for seeing statistics of your sent e-mails, or provide
+hooks that processes the status changes in real time, which is the
+function used here.
+
+Configuration
+=============
+
+You must configure Mailgun webhooks in order to receive mail events:
+
+1. Got a Mailgun account and validate your sending domain.
+2. Go to Webhook tab and configure the below URL for each event:
+
+.. code:: html
+
+ https:///mail/tracking/all/
+
+Replace '' with your Odoo install domain name
+and '' with your database name.
+
+In order to validate Mailgun webhooks you have to save Mailgun api_key in
+a system parameter named 'mailgun.apikey'. You can find Mailgun api_key in your
+validated sending domain.
+
+Usage
+=====
+
+In your mail tracking status screens (explained on module *mail_tracking*), you will
+see a more accurate information, like the 'Received' or 'Bounced' status, which are
+not usually detected by normal SMTP servers.
+
+.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
+ :alt: Try me on Runbot
+ :target: https://runbot.odoo-community.org/runbot/205/8.0
+
+Known issues / Roadmap
+======================
+
+* There's no support for more than one Mailgun mail server.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues
+`_. In case of trouble, please
+check there if your issue has already been reported. If you spotted it first,
+help us smashing it by providing a detailed and welcomed feedback.
+
+Credits
+=======
+
+Images
+------
+
+* Mailgun logo: `SVG Icon `_.
+
+Contributors
+------------
+
+* Antonio Espinosa
+
+Maintainer
+----------
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+This module is maintained by the OCA.
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+To contribute to this module, please visit https://odoo-community.org.
diff --git a/mail_tracking_mailgun/__init__.py b/mail_tracking_mailgun/__init__.py
new file mode 100644
index 0000000..5935294
--- /dev/null
+++ b/mail_tracking_mailgun/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Copyright 2016 Antonio Espinosa
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import models
diff --git a/mail_tracking_mailgun/__init__.pyc b/mail_tracking_mailgun/__init__.pyc
new file mode 100644
index 0000000..3c1f82b
Binary files /dev/null and b/mail_tracking_mailgun/__init__.pyc differ
diff --git a/mail_tracking_mailgun/__openerp__.py b/mail_tracking_mailgun/__openerp__.py
new file mode 100644
index 0000000..e0b0d48
--- /dev/null
+++ b/mail_tracking_mailgun/__openerp__.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+# Copyright 2016 Antonio Espinosa
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+{
+ "name": "Mail tracking for Mailgun",
+ "summary": "Mail tracking and Mailgun webhooks integration",
+ "version": "8.0.1.0.0",
+ "category": "Social Network",
+ "website": "https://odoo-community.org/",
+ "author": "Tecnativa, "
+ "Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "application": False,
+ "installable": True,
+ "depends": [
+ "mail_tracking",
+ ],
+}
diff --git a/mail_tracking_mailgun/i18n/es.po b/mail_tracking_mailgun/i18n/es.po
new file mode 100644
index 0000000..9b6e844
--- /dev/null
+++ b/mail_tracking_mailgun/i18n/es.po
@@ -0,0 +1,24 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mailgun
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-02 02:43+0000\n"
+"PO-Revision-Date: 2016-09-02 02:43+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking_mailgun
+#: model:ir.model,name:mail_tracking_mailgun.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr "MailTracking email"
diff --git a/mail_tracking_mailgun/i18n/fr.po b/mail_tracking_mailgun/i18n/fr.po
new file mode 100644
index 0000000..86d49b7
--- /dev/null
+++ b/mail_tracking_mailgun/i18n/fr.po
@@ -0,0 +1,24 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mailgun
+#
+# Translators:
+# dglucose , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-02 02:43+0000\n"
+"PO-Revision-Date: 2016-09-02 02:43+0000\n"
+"Last-Translator: dglucose , 2016\n"
+"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: mail_tracking_mailgun
+#: model:ir.model,name:mail_tracking_mailgun.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr "Suivi du courriel: courriel"
diff --git a/mail_tracking_mailgun/i18n/sl.po b/mail_tracking_mailgun/i18n/sl.po
new file mode 100644
index 0000000..58d64d8
--- /dev/null
+++ b/mail_tracking_mailgun/i18n/sl.po
@@ -0,0 +1,24 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mailgun
+#
+# Translators:
+# Matjaž Mozetič , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-02 02:43+0000\n"
+"PO-Revision-Date: 2016-09-02 02:43+0000\n"
+"Last-Translator: Matjaž Mozetič , 2016\n"
+"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#. module: mail_tracking_mailgun
+#: model:ir.model,name:mail_tracking_mailgun.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr "Sledenje e-pošte"
diff --git a/mail_tracking_mailgun/models/__init__.py b/mail_tracking_mailgun/models/__init__.py
new file mode 100644
index 0000000..64dc6c2
--- /dev/null
+++ b/mail_tracking_mailgun/models/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# Copyright 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import ir_mail_server
+from . import mail_tracking_email
diff --git a/mail_tracking_mailgun/models/__init__.pyc b/mail_tracking_mailgun/models/__init__.pyc
new file mode 100644
index 0000000..9203866
Binary files /dev/null and b/mail_tracking_mailgun/models/__init__.pyc differ
diff --git a/mail_tracking_mailgun/models/ir_mail_server.py b/mail_tracking_mailgun/models/ir_mail_server.py
new file mode 100644
index 0000000..2ebb4ce
--- /dev/null
+++ b/mail_tracking_mailgun/models/ir_mail_server.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Copyright 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import json
+from openerp import models
+
+
+class IrMailServer(models.Model):
+ _inherit = "ir.mail_server"
+
+ def _tracking_headers_add(self, tracking_email_id, headers):
+ headers = super(IrMailServer, self)._tracking_headers_add(
+ tracking_email_id, headers)
+ headers = headers or {}
+ metadata = {
+ # NOTE: We can not use 'self.env.cr.dbname' because self is
+ # ir.mail_server object in old API (osv.osv)
+ 'odoo_db': self.pool.db_name,
+ 'tracking_email_id': tracking_email_id,
+ }
+ headers['X-Mailgun-Variables'] = json.dumps(metadata)
+ return headers
diff --git a/mail_tracking_mailgun/models/ir_mail_server.pyc b/mail_tracking_mailgun/models/ir_mail_server.pyc
new file mode 100644
index 0000000..46a156d
Binary files /dev/null and b/mail_tracking_mailgun/models/ir_mail_server.pyc differ
diff --git a/mail_tracking_mailgun/models/mail_tracking_email.py b/mail_tracking_mailgun/models/mail_tracking_email.py
new file mode 100644
index 0000000..f7008ed
--- /dev/null
+++ b/mail_tracking_mailgun/models/mail_tracking_email.py
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+# Copyright 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+import hashlib
+import hmac
+from datetime import datetime
+from openerp import models, api, fields
+
+import logging
+_logger = logging.getLogger(__name__)
+
+
+class MailTrackingEmail(models.Model):
+ _inherit = "mail.tracking.email"
+
+ def _country_search(self, country_code):
+ country = False
+ if country_code:
+ country = self.env['res.country'].search([
+ ('code', '=', country_code.upper()),
+ ])
+ if country:
+ return country.id
+ return False
+
+ @property
+ def _mailgun_mandatory_fields(self):
+ return ('event', 'timestamp', 'token', 'signature',
+ 'tracking_email_id', 'odoo_db')
+
+ @property
+ def _mailgun_event_type_mapping(self):
+ return {
+ # Mailgun event type: tracking event type
+ 'delivered': 'delivered',
+ 'opened': 'open',
+ 'clicked': 'click',
+ 'unsubscribed': 'unsub',
+ 'complained': 'spam',
+ 'bounced': 'hard_bounce',
+ 'dropped': 'reject',
+ }
+
+ def _mailgun_event_type_verify(self, event):
+ event = event or {}
+ mailgun_event_type = event.get('event')
+ if mailgun_event_type not in self._mailgun_event_type_mapping:
+ _logger.error("Mailgun: event type '%s' not supported",
+ mailgun_event_type)
+ return False
+ # OK, event type is valid
+ return True
+
+ def _mailgun_signature(self, api_key, timestamp, token):
+ return hmac.new(
+ key=str(api_key),
+ msg='{}{}'.format(str(timestamp), str(token)),
+ digestmod=hashlib.sha256).hexdigest()
+
+ def _mailgun_signature_verify(self, event):
+ event = event or {}
+ api_key = self.env['ir.config_parameter'].get_param('mailgun.apikey')
+ if not api_key:
+ _logger.warning("No Mailgun api key configured. "
+ "Please add 'mailgun.apikey' to System parameters "
+ "to enable Mailgun authentication webhoook "
+ "requests. More info at: "
+ "https://documentation.mailgun.com/"
+ "user_manual.html#webhooks")
+ else:
+ timestamp = event.get('timestamp')
+ token = event.get('token')
+ signature = event.get('signature')
+ event_digest = self._mailgun_signature(api_key, timestamp, token)
+ if signature != event_digest:
+ _logger.error("Mailgun: Invalid signature '%s' != '%s'",
+ signature, event_digest)
+ return False
+ # OK, signature is valid
+ return True
+
+ def _db_verify(self, event):
+ event = event or {}
+ odoo_db = event.get('odoo_db')
+ current_db = self.env.cr.dbname
+ if odoo_db != current_db:
+ _logger.error("Mailgun: Database '%s' is not the current database",
+ odoo_db)
+ return False
+ # OK, DB is current
+ return True
+
+ def _mailgun_metadata(self, mailgun_event_type, event, metadata):
+ # Get Mailgun timestamp when found
+ ts = event.get('timestamp', False)
+ try:
+ ts = float(ts)
+ except:
+ ts = False
+ if ts:
+ dt = datetime.utcfromtimestamp(ts)
+ metadata.update({
+ 'timestamp': ts,
+ 'time': fields.Datetime.to_string(dt),
+ 'date': fields.Date.to_string(dt),
+ })
+ # Common field mapping
+ mapping = {
+ 'recipient': 'recipient',
+ 'ip': 'ip',
+ 'user_agent': 'user-agent',
+ 'os_family': 'client-os',
+ 'ua_family': 'client-name',
+ 'ua_type': 'client-type',
+ 'url': 'url',
+ }
+ for k, v in mapping.iteritems():
+ if event.get(v, False):
+ metadata[k] = event[v]
+ # Special field mapping
+ metadata.update({
+ 'mobile': event.get('device-type') in {'mobile', 'tablet'},
+ 'user_country_id': self._country_search(
+ event.get('country', False)),
+ })
+ # Mapping for special events
+ if mailgun_event_type == 'bounced':
+ metadata.update({
+ 'error_type': event.get('code', False),
+ 'error_description': event.get('error', False),
+ 'error_details': event.get('notification', False),
+ })
+ elif mailgun_event_type == 'dropped':
+ metadata.update({
+ 'error_type': event.get('reason', False),
+ 'error_description': event.get('code', False),
+ 'error_details': event.get('description', False),
+ })
+ elif mailgun_event_type == 'complained':
+ metadata.update({
+ 'error_type': 'spam',
+ 'error_description':
+ "Recipient '%s' mark this email as spam" %
+ event.get('recipient', False),
+ })
+ return metadata
+
+ def _mailgun_tracking_get(self, event):
+ tracking = False
+ tracking_email_id = event.get('tracking_email_id', False)
+ if tracking_email_id and tracking_email_id.isdigit():
+ tracking = self.search([('id', '=', tracking_email_id)], limit=1)
+ return tracking
+
+ def _event_is_from_mailgun(self, event):
+ event = event or {}
+ return all([k in event for k in self._mailgun_mandatory_fields])
+
+ @api.model
+ def event_process(self, request, post, metadata, event_type=None):
+ res = super(MailTrackingEmail, self).event_process(
+ request, post, metadata, event_type=event_type)
+ if res == 'NONE' and self._event_is_from_mailgun(post):
+ if not self._mailgun_signature_verify(post):
+ res = 'ERROR: Signature'
+ elif not self._mailgun_event_type_verify(post):
+ res = 'ERROR: Event type not supported'
+ elif not self._db_verify(post):
+ res = 'ERROR: Invalid DB'
+ else:
+ res = 'OK'
+ if res == 'OK':
+ mailgun_event_type = post.get('event')
+ mapped_event_type = self._mailgun_event_type_mapping.get(
+ mailgun_event_type) or event_type
+ if not mapped_event_type: # pragma: no cover
+ res = 'ERROR: Bad event'
+ tracking = self._mailgun_tracking_get(post)
+ if not tracking:
+ res = 'ERROR: Tracking not found'
+ if res == 'OK':
+ # Complete metadata with mailgun event info
+ metadata = self._mailgun_metadata(
+ mailgun_event_type, post, metadata)
+ # Create event
+ tracking.event_create(mapped_event_type, metadata)
+ if res != 'NONE':
+ if event_type:
+ _logger.info(
+ "Mailgun: event '%s' process '%s'", event_type, res)
+ else:
+ _logger.info("Mailgun: event process '%s'", res)
+ return res
diff --git a/mail_tracking_mailgun/models/mail_tracking_email.pyc b/mail_tracking_mailgun/models/mail_tracking_email.pyc
new file mode 100644
index 0000000..0b67d9b
Binary files /dev/null and b/mail_tracking_mailgun/models/mail_tracking_email.pyc differ
diff --git a/mail_tracking_mailgun/static/description/icon.png b/mail_tracking_mailgun/static/description/icon.png
new file mode 100644
index 0000000..22dc3f8
Binary files /dev/null and b/mail_tracking_mailgun/static/description/icon.png differ
diff --git a/mail_tracking_mailgun/static/description/icon.svg b/mail_tracking_mailgun/static/description/icon.svg
new file mode 100644
index 0000000..3066546
--- /dev/null
+++ b/mail_tracking_mailgun/static/description/icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mail_tracking_mailgun/tests/__init__.py b/mail_tracking_mailgun/tests/__init__.py
new file mode 100644
index 0000000..d7169b5
--- /dev/null
+++ b/mail_tracking_mailgun/tests/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# Copyright 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import test_mailgun
diff --git a/mail_tracking_mailgun/tests/test_mailgun.py b/mail_tracking_mailgun/tests/test_mailgun.py
new file mode 100644
index 0000000..f4ecf16
--- /dev/null
+++ b/mail_tracking_mailgun/tests/test_mailgun.py
@@ -0,0 +1,281 @@
+# -*- coding: utf-8 -*-
+# Copyright 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from openerp.tests.common import TransactionCase
+
+
+class TestMailgun(TransactionCase):
+ def mail_send(self):
+ mail = self.env['mail.mail'].create({
+ 'subject': 'Test subject',
+ 'email_from': 'from@example.com',
+ 'email_to': self.recipient,
+ 'body_html': 'This is a test message
',
+ })
+ mail.send()
+ # Search tracking created
+ tracking_email = self.env['mail.tracking.email'].search([
+ ('mail_id', '=', mail.id),
+ ])
+ return mail, tracking_email
+
+ def setUp(self):
+ super(TestMailgun, self).setUp()
+ self.recipient = u'to@example.com'
+ self.mail, self.tracking_email = self.mail_send()
+ self.api_key = u'key-12345678901234567890123456789012'
+ self.token = u'f1349299097a51b9a7d886fcb5c2735b426ba200ada6e9e149'
+ self.timestamp = u'1471021089'
+ self.signature = ('4fb6d4dbbe10ce5d620265dcd7a3c0b8'
+ 'ca0dede1433103891bc1ae4086e9d5b2')
+ self.env['ir.config_parameter'].set_param(
+ 'mailgun.apikey', self.api_key)
+ self.event = {
+ 'Message-Id': u'',
+ 'X-Mailgun-Sid': u'WyIwNjgxZSIsICJ0b0BleGFtcGxlLmNvbSIsICI3MG'
+ 'I0MWYiXQ==',
+ 'token': self.token,
+ 'timestamp': self.timestamp,
+ 'signature': self.signature,
+ 'domain': u'example.com',
+ 'message-headers': u'[]',
+ 'recipient': self.recipient,
+ 'odoo_db': self.env.cr.dbname,
+ 'tracking_email_id': u'%s' % self.tracking_email.id
+ }
+ self.metadata = {
+ 'ip': '127.0.0.1',
+ 'user_agent': False,
+ 'os_family': False,
+ 'ua_family': False,
+ }
+
+ def event_search(self, event_type):
+ event = self.env['mail.tracking.event'].search([
+ ('tracking_email_id', '=', self.tracking_email.id),
+ ('event_type', '=', event_type),
+ ])
+ self.assertTrue(event)
+ return event
+
+ def test_no_api_key(self):
+ self.env['ir.config_parameter'].set_param('mailgun.apikey', '')
+ self.test_event_delivered()
+
+ def test_bad_signature(self):
+ self.event.update({
+ 'event': u'delivered',
+ 'signature': u'bad_signature',
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('ERROR: Signature', response)
+
+ def test_bad_event_type(self):
+ self.event.update({
+ 'event': u'bad_event',
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('ERROR: Event type not supported', response)
+
+ def test_bad_db(self):
+ self.event.update({
+ 'event': u'delivered',
+ 'odoo_db': u'bad_db',
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('ERROR: Invalid DB', response)
+
+ def test_bad_ts(self):
+ timestamp = u'7a' # Now time will be used instead
+ signature = ('06cc05680f6e8110e59b41152b2d1c0f'
+ '1045d755ef2880ff922344325c89a6d4')
+ self.event.update({
+ 'event': u'delivered',
+ 'timestamp': timestamp,
+ 'signature': signature,
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('OK', response)
+
+ def test_tracking_not_found(self):
+ self.event.update({
+ 'event': u'delivered',
+ 'tracking_email_id': u'bad_id',
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('ERROR: Tracking not found', response)
+
+ # https://documentation.mailgun.com/user_manual.html#tracking-deliveries
+ def test_event_delivered(self):
+ self.event.update({
+ 'event': u'delivered',
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('OK', response)
+ event = self.event_search('delivered')
+ self.assertEqual(event.timestamp, float(self.timestamp))
+ self.assertEqual(event.recipient, self.recipient)
+
+ # https://documentation.mailgun.com/user_manual.html#tracking-opens
+ def test_event_opened(self):
+ ip = u'127.0.0.1'
+ user_agent = u'Odoo Test/8.0 Gecko Firefox/11.0'
+ os_family = u'Linux'
+ ua_family = u'Firefox'
+ ua_type = u'browser'
+ self.event.update({
+ 'event': u'opened',
+ 'city': u'Mountain View',
+ 'country': u'US',
+ 'region': u'CA',
+ 'client-name': ua_family,
+ 'client-os': os_family,
+ 'client-type': ua_type,
+ 'device-type': u'desktop',
+ 'ip': ip,
+ 'user-agent': user_agent,
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('OK', response)
+ event = self.event_search('open')
+ self.assertEqual(event.timestamp, float(self.timestamp))
+ self.assertEqual(event.recipient, self.recipient)
+ self.assertEqual(event.ip, ip)
+ self.assertEqual(event.user_agent, user_agent)
+ self.assertEqual(event.os_family, os_family)
+ self.assertEqual(event.ua_family, ua_family)
+ self.assertEqual(event.ua_type, ua_type)
+ self.assertEqual(event.mobile, False)
+ self.assertEqual(event.user_country_id.code, 'US')
+
+ # https://documentation.mailgun.com/user_manual.html#tracking-clicks
+ def test_event_clicked(self):
+ ip = u'127.0.0.1'
+ user_agent = u'Odoo Test/8.0 Gecko Firefox/11.0'
+ os_family = u'Linux'
+ ua_family = u'Firefox'
+ ua_type = u'browser'
+ url = u'https://odoo-community.org'
+ self.event.update({
+ 'event': u'clicked',
+ 'city': u'Mountain View',
+ 'country': u'US',
+ 'region': u'CA',
+ 'client-name': ua_family,
+ 'client-os': os_family,
+ 'client-type': ua_type,
+ 'device-type': u'tablet',
+ 'ip': ip,
+ 'user-agent': user_agent,
+ 'url': url,
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata, event_type='click')
+ self.assertEqual('OK', response)
+ event = self.event_search('click')
+ self.assertEqual(event.timestamp, float(self.timestamp))
+ self.assertEqual(event.recipient, self.recipient)
+ self.assertEqual(event.ip, ip)
+ self.assertEqual(event.user_agent, user_agent)
+ self.assertEqual(event.os_family, os_family)
+ self.assertEqual(event.ua_family, ua_family)
+ self.assertEqual(event.ua_type, ua_type)
+ self.assertEqual(event.mobile, True)
+ self.assertEqual(event.url, url)
+
+ # https://documentation.mailgun.com/user_manual.html#tracking-unsubscribes
+ def test_event_unsubscribed(self):
+ ip = u'127.0.0.1'
+ user_agent = u'Odoo Test/8.0 Gecko Firefox/11.0'
+ os_family = u'Linux'
+ ua_family = u'Firefox'
+ ua_type = u'browser'
+ self.event.update({
+ 'event': u'unsubscribed',
+ 'city': u'Mountain View',
+ 'country': u'US',
+ 'region': u'CA',
+ 'client-name': ua_family,
+ 'client-os': os_family,
+ 'client-type': ua_type,
+ 'device-type': u'mobile',
+ 'ip': ip,
+ 'user-agent': user_agent,
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('OK', response)
+ event = self.event_search('unsub')
+ self.assertEqual(event.timestamp, float(self.timestamp))
+ self.assertEqual(event.recipient, self.recipient)
+ self.assertEqual(event.ip, ip)
+ self.assertEqual(event.user_agent, user_agent)
+ self.assertEqual(event.os_family, os_family)
+ self.assertEqual(event.ua_family, ua_family)
+ self.assertEqual(event.ua_type, ua_type)
+ self.assertEqual(event.mobile, True)
+
+ # https://documentation.mailgun.com/
+ # user_manual.html#tracking-spam-complaints
+ def test_event_complained(self):
+ self.event.update({
+ 'event': u'complained',
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('OK', response)
+ event = self.event_search('spam')
+ self.assertEqual(event.timestamp, float(self.timestamp))
+ self.assertEqual(event.recipient, self.recipient)
+ self.assertEqual(event.error_type, 'spam')
+
+ # https://documentation.mailgun.com/user_manual.html#tracking-bounces
+ def test_event_bounced(self):
+ code = u'550'
+ error = (u"5.1.1 The email account does not exist.\n"
+ "5.1.1 double-checking the recipient's email address")
+ notification = u"Please, check recipient's email address"
+ self.event.update({
+ 'event': u'bounced',
+ 'code': code,
+ 'error': error,
+ 'notification': notification,
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('OK', response)
+ event = self.event_search('hard_bounce')
+ self.assertEqual(event.timestamp, float(self.timestamp))
+ self.assertEqual(event.recipient, self.recipient)
+ self.assertEqual(event.error_type, code)
+ self.assertEqual(event.error_description, error)
+ self.assertEqual(event.error_details, notification)
+
+ # https://documentation.mailgun.com/user_manual.html#tracking-failures
+ def test_event_dropped(self):
+ reason = u'hardfail'
+ code = u'605'
+ description = u'Not delivering to previously bounced address'
+ self.event.update({
+ 'event': u'dropped',
+ 'reason': reason,
+ 'code': code,
+ 'description': description,
+ })
+ response = self.env['mail.tracking.email'].event_process(
+ None, self.event, self.metadata)
+ self.assertEqual('OK', response)
+ event = self.event_search('reject')
+ self.assertEqual(event.timestamp, float(self.timestamp))
+ self.assertEqual(event.recipient, self.recipient)
+ self.assertEqual(event.error_type, reason)
+ self.assertEqual(event.error_description, code)
+ self.assertEqual(event.error_details, description)
diff --git a/mail_tracking_mass_mailing/README.rst b/mail_tracking_mass_mailing/README.rst
new file mode 100644
index 0000000..9b8bc85
--- /dev/null
+++ b/mail_tracking_mass_mailing/README.rst
@@ -0,0 +1,77 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+==============================
+Mail tracking for mass mailing
+==============================
+
+Links mail statistics objects with mail tracking objects.
+
+
+Installation
+============
+
+This addon will be automatically installed when 'mail_tracking' and
+'mass_mailing' are both installed
+
+
+Usage
+=====
+
+From mail statistic object, you can see:
+- Email tracking state
+- Email related tracking object
+- Email related tracking events
+
+From mass mailing contact, you can see:
+- Email score, in order to clean up your lists from bad score emails
+
+As a bonus feature, you have a new checkbox 'Avoid resend' in mass mailing,
+in order to not send twice the same email to the same recipient. This is very
+useful when you want to resend the mass mailing after changing selection
+recipients. Notice that recipient selection could be a domain over a model, so
+result ids could change over the time. With this flag you can send
+the same email several times but only once to each recipient.
+
+.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
+ :alt: Try me on Runbot
+ :target: https://runbot.odoo-community.org/runbot/205/8.0
+
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues
+`_. In case of trouble, please
+check there if your issue has already been reported. If you spotted it first,
+help us smashing it by providing a detailed and welcomed feedback.
+
+Credits
+=======
+
+Images
+------
+
+* Odoo Community Association: `Icon `_.
+
+Contributors
+------------
+
+* Pedro M. Baeza
+* Antonio Espinosa
+
+Maintainer
+----------
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+This module is maintained by the OCA.
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+To contribute to this module, please visit https://odoo-community.org.
diff --git a/mail_tracking_mass_mailing/__init__.py b/mail_tracking_mass_mailing/__init__.py
new file mode 100644
index 0000000..ba08c9f
--- /dev/null
+++ b/mail_tracking_mass_mailing/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from . import models
+from .hooks import pre_init_hook
diff --git a/mail_tracking_mass_mailing/__init__.pyc b/mail_tracking_mass_mailing/__init__.pyc
new file mode 100644
index 0000000..a1a866a
Binary files /dev/null and b/mail_tracking_mass_mailing/__init__.pyc differ
diff --git a/mail_tracking_mass_mailing/__openerp__.py b/mail_tracking_mass_mailing/__openerp__.py
new file mode 100644
index 0000000..0f01f6e
--- /dev/null
+++ b/mail_tracking_mass_mailing/__openerp__.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+{
+ "name": "Mail tracking for mass mailing",
+ "summary": "Improve mass mailing email tracking",
+ "version": "8.0.1.0.1",
+ "category": "Social Network",
+ "website": "http://www.tecnativa.com",
+ "author": "Tecnativa, "
+ "Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "application": False,
+ "installable": True,
+ 'auto_install': True,
+ "depends": [
+ "mass_mailing",
+ "mail_tracking",
+ ],
+ "data": [
+ "views/mail_tracking_email_view.xml",
+ "views/mail_mail_statistics_view.xml",
+ "views/mail_mass_mailing_view.xml",
+ "views/mail_mass_mailing_contact_view.xml",
+ ],
+ "pre_init_hook": "pre_init_hook",
+}
diff --git a/mail_tracking_mass_mailing/hooks.py b/mail_tracking_mass_mailing/hooks.py
new file mode 100644
index 0000000..b3601a2
--- /dev/null
+++ b/mail_tracking_mass_mailing/hooks.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import logging
+try:
+ from openerp.addons.mail_tracking.hooks import column_add_with_value
+except ImportError:
+ column_add_with_value = False
+
+_logger = logging.getLogger(__name__)
+
+
+def pre_init_hook(cr):
+ if column_add_with_value:
+ _logger.info("Creating mail.mass_mailing.contact.email_score column "
+ "with value 50.0")
+ column_add_with_value(
+ cr, 'mail_mass_mailing_contact', 'email_score', 'double precision',
+ 50.0)
diff --git a/mail_tracking_mass_mailing/hooks.pyc b/mail_tracking_mass_mailing/hooks.pyc
new file mode 100644
index 0000000..468a26f
Binary files /dev/null and b/mail_tracking_mass_mailing/hooks.pyc differ
diff --git a/mail_tracking_mass_mailing/i18n/ca.po b/mail_tracking_mass_mailing/i18n/ca.po
new file mode 100644
index 0000000..272e10b
--- /dev/null
+++ b/mail_tracking_mass_mailing/i18n/ca.po
@@ -0,0 +1,142 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mass_mailing
+#
+# Translators:
+# Carles Antoli , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-17 02:42+0000\n"
+"PO-Revision-Date: 2016-08-17 02:42+0000\n"
+"Last-Translator: Carles Antoli , 2016\n"
+"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail.statistics,tracking_state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing,avoid_resend:0
+msgid "Avoid resend"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mass_mailing,avoid_resend:0
+msgid "Avoid to send this mass mailing email twice to the same recipient"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail,path:0
+msgid "Discussion Path"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail_statistics
+msgid "Email Statistics"
+msgstr "Estadístiques de correu electrònic"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_id_int:0
+msgid "Mail ID"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_stats_id:0
+msgid "Mail statistics"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,mail_tracking_id:0
+msgid "Mail tracking"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_event
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing
+msgid "Mass Mailing"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing_contact
+msgid "Mass Mailing Contact"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mass_mailing_id:0
+msgid "Mass mailing"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Correus sortints"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,tracking_state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: code:addons/mail_tracking_mass_mailing/models/mail_mass_mailing.py:28
+#, python-format
+msgid ""
+"There is no more recipients to send and 'Avoid resend' option is enabled"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+#: field:mail.mail.statistics,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail,path:0
+msgid ""
+"Used to display messages in a paragraph-based chatter using a unique path;"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "User agent"
+msgstr ""
diff --git a/mail_tracking_mass_mailing/i18n/de.po b/mail_tracking_mass_mailing/i18n/de.po
new file mode 100644
index 0000000..bec4ec7
--- /dev/null
+++ b/mail_tracking_mass_mailing/i18n/de.po
@@ -0,0 +1,142 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mass_mailing
+#
+# Translators:
+# Rudolf Schnapka , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-17 02:42+0000\n"
+"PO-Revision-Date: 2016-08-17 02:42+0000\n"
+"Last-Translator: Rudolf Schnapka , 2016\n"
+"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail.statistics,tracking_state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing,avoid_resend:0
+msgid "Avoid resend"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mass_mailing,avoid_resend:0
+msgid "Avoid to send this mass mailing email twice to the same recipient"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail,path:0
+msgid "Discussion Path"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail_statistics
+msgid "Email Statistics"
+msgstr "Email-Statistiken"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_id_int:0
+msgid "Mail ID"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_stats_id:0
+msgid "Mail statistics"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,mail_tracking_id:0
+msgid "Mail tracking"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_event
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing
+msgid "Mass Mailing"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing_contact
+msgid "Mass Mailing Contact"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mass_mailing_id:0
+msgid "Mass mailing"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Ausgehende Nachrichten"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,tracking_state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: code:addons/mail_tracking_mass_mailing/models/mail_mass_mailing.py:28
+#, python-format
+msgid ""
+"There is no more recipients to send and 'Avoid resend' option is enabled"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+#: field:mail.mail.statistics,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail,path:0
+msgid ""
+"Used to display messages in a paragraph-based chatter using a unique path;"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "User agent"
+msgstr ""
diff --git a/mail_tracking_mass_mailing/i18n/es.po b/mail_tracking_mass_mailing/i18n/es.po
new file mode 100644
index 0000000..12641b2
--- /dev/null
+++ b/mail_tracking_mass_mailing/i18n/es.po
@@ -0,0 +1,124 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mass_mailing
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing,avoid_resend:0
+msgid "Avoid resend"
+msgstr "Evitar reenvios"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mass_mailing,avoid_resend:0
+msgid "Avoid to send this mass mailing email twice to the same recipient"
+msgstr ""
+"Evitar que se envíe este correo masivo dos veces al mismo destinatario"
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "Country"
+msgstr "País"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail,path:0
+msgid "Discussion Path"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail_statistics
+msgid "Email Statistics"
+msgstr "Estadísticas del email"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,email_score:0
+msgid "Email score"
+msgstr "Reputación del email"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_id_int:0
+msgid "Mail ID"
+msgstr "Mail ID"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_stats_id:0
+msgid "Mail statistics"
+msgstr "Estadísticas del email"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,mail_tracking_id:0
+msgid "Mail tracking"
+msgstr "Seguimiento del email"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr "MailTracking email"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_event
+msgid "MailTracking event"
+msgstr "MailTracking event"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing
+msgid "Mass Mailing"
+msgstr "Envío masivo"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing_contact
+msgid "Mass Mailing Contact"
+msgstr "Contacto de envío masivo"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mass_mailing_id:0
+msgid "Mass mailing"
+msgstr "Envío masivo"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Correos salientes"
+
+#. module: mail_tracking_mass_mailing
+#: code:addons/mail_tracking_mass_mailing/models/mail_mass_mailing.py:28
+#, python-format
+msgid ""
+"There is no more recipients to send and 'Avoid resend' option is enabled"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr "Emails de seguimiento"
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+#: field:mail.mail.statistics,tracking_event_ids:0
+msgid "Tracking events"
+msgstr "Eventos de seguimiento"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail,path:0
+msgid ""
+"Used to display messages in a paragraph-based chatter using a unique path;"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "User agent"
+msgstr "Aplicación del usuario"
diff --git a/mail_tracking_mass_mailing/i18n/es_CO.po b/mail_tracking_mass_mailing/i18n/es_CO.po
new file mode 100644
index 0000000..362d520
--- /dev/null
+++ b/mail_tracking_mass_mailing/i18n/es_CO.po
@@ -0,0 +1,142 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mass_mailing
+#
+# Translators:
+# John Toro , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-17 02:42+0000\n"
+"PO-Revision-Date: 2016-08-17 02:42+0000\n"
+"Last-Translator: John Toro , 2016\n"
+"Language-Team: Spanish (Colombia) (https://www.transifex.com/oca/teams/23907/es_CO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: es_CO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail.statistics,tracking_state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing,avoid_resend:0
+msgid "Avoid resend"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mass_mailing,avoid_resend:0
+msgid "Avoid to send this mass mailing email twice to the same recipient"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail,path:0
+msgid "Discussion Path"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail_statistics
+msgid "Email Statistics"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_id_int:0
+msgid "Mail ID"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_stats_id:0
+msgid "Mail statistics"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,mail_tracking_id:0
+msgid "Mail tracking"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_event
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing
+msgid "Mass Mailing"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing_contact
+msgid "Mass Mailing Contact"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mass_mailing_id:0
+msgid "Mass mailing"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Correos Salientes"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,tracking_state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: code:addons/mail_tracking_mass_mailing/models/mail_mass_mailing.py:28
+#, python-format
+msgid ""
+"There is no more recipients to send and 'Avoid resend' option is enabled"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+#: field:mail.mail.statistics,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail,path:0
+msgid ""
+"Used to display messages in a paragraph-based chatter using a unique path;"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "User agent"
+msgstr ""
diff --git a/mail_tracking_mass_mailing/i18n/fr.po b/mail_tracking_mass_mailing/i18n/fr.po
new file mode 100644
index 0000000..5b855ae
--- /dev/null
+++ b/mail_tracking_mass_mailing/i18n/fr.po
@@ -0,0 +1,125 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mass_mailing
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing,avoid_resend:0
+msgid "Avoid resend"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mass_mailing,avoid_resend:0
+msgid "Avoid to send this mass mailing email twice to the same recipient"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "Country"
+msgstr "Pays"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail,path:0
+msgid "Discussion Path"
+msgstr "Parcours de discussion"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail_statistics
+msgid "Email Statistics"
+msgstr "Statistiques de courriel"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,email_score:0
+msgid "Email score"
+msgstr "Score du courriel"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_id_int:0
+msgid "Mail ID"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_stats_id:0
+msgid "Mail statistics"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,mail_tracking_id:0
+msgid "Mail tracking"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr "Suivi du courriel: courriel"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_event
+msgid "MailTracking event"
+msgstr "Suivi du courriel: évènement"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing
+msgid "Mass Mailing"
+msgstr "Publipostage"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing_contact
+msgid "Mass Mailing Contact"
+msgstr "Contact de la liste de diffusion"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mass_mailing_id:0
+msgid "Mass mailing"
+msgstr "Publipostage"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Courriels sortants"
+
+#. module: mail_tracking_mass_mailing
+#: code:addons/mail_tracking_mass_mailing/models/mail_mass_mailing.py:28
+#, python-format
+msgid ""
+"There is no more recipients to send and 'Avoid resend' option is enabled"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr "Suivi du courriel: courriels"
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+#: field:mail.mail.statistics,tracking_event_ids:0
+msgid "Tracking events"
+msgstr "Suivi du courriel: évènements"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail,path:0
+msgid ""
+"Used to display messages in a paragraph-based chatter using a unique path;"
+msgstr ""
+"Utilisé pour afficher des messages dans une zone de discussion employant un "
+"chemin unique;"
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "User agent"
+msgstr "Navigateur"
diff --git a/mail_tracking_mass_mailing/i18n/pt_BR.po b/mail_tracking_mass_mailing/i18n/pt_BR.po
new file mode 100644
index 0000000..7f1f101
--- /dev/null
+++ b/mail_tracking_mass_mailing/i18n/pt_BR.po
@@ -0,0 +1,142 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mass_mailing
+#
+# Translators:
+# Armando Vulcano Junior , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-17 02:42+0000\n"
+"PO-Revision-Date: 2016-08-17 02:42+0000\n"
+"Last-Translator: Armando Vulcano Junior , 2016\n"
+"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/23907/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail.statistics,tracking_state:0
+msgid ""
+" * The 'Error' status indicates that there was an error when trying to sent the email, for example, 'No valid recipient'\n"
+" * The 'Sent' status indicates that message was succesfully sent via outgoing email server (SMTP).\n"
+" * The 'Delivered' status indicates that message was succesfully delivered to recipient Mail Exchange (MX) server.\n"
+" * The 'Open' status indicates that message was opened or clicked by recipient.\n"
+" * The 'Rejected' status indicates that recipient email address is blacklisted by outgoing email server (SMTP). It is recomended to delete this email address.\n"
+" * The 'Spam' status indicates that outgoing email server (SMTP) consider this message as spam.\n"
+" * The 'Unsubscribed' status indicates that recipient has requested to be unsubscribed from this message.\n"
+" * The 'Bounced' status indicates that message was bounced by recipient Mail Exchange (MX) server.\n"
+" * The 'Soft bounced' status indicates that message was soft bounced by recipient Mail Exchange (MX) server.\n"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing,avoid_resend:0
+msgid "Avoid resend"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mass_mailing,avoid_resend:0
+msgid "Avoid to send this mass mailing email twice to the same recipient"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "Country"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail,path:0
+msgid "Discussion Path"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail_statistics
+msgid "Email Statistics"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,email_score:0
+msgid "Email score"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_id_int:0
+msgid "Mail ID"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_stats_id:0
+msgid "Mail statistics"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,mail_tracking_id:0
+msgid "Mail tracking"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_event
+msgid "MailTracking event"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing
+msgid "Mass Mailing"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing_contact
+msgid "Mass Mailing Contact"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mass_mailing_id:0
+msgid "Mass mailing"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Mails de Saída"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,tracking_state:0
+msgid "State"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: code:addons/mail_tracking_mass_mailing/models/mail_mass_mailing.py:28
+#, python-format
+msgid ""
+"There is no more recipients to send and 'Avoid resend' option is enabled"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+#: field:mail.mail.statistics,tracking_event_ids:0
+msgid "Tracking events"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail,path:0
+msgid ""
+"Used to display messages in a paragraph-based chatter using a unique path;"
+msgstr ""
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "User agent"
+msgstr ""
diff --git a/mail_tracking_mass_mailing/i18n/sl.po b/mail_tracking_mass_mailing/i18n/sl.po
new file mode 100644
index 0000000..8167ce1
--- /dev/null
+++ b/mail_tracking_mass_mailing/i18n/sl.po
@@ -0,0 +1,127 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mail_tracking_mass_mailing
+#
+# Translators:
+# OCA Transbot , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-09-14 07:21+0000\n"
+"PO-Revision-Date: 2016-09-14 07:21+0000\n"
+"Last-Translator: OCA Transbot , 2016\n"
+"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing,avoid_resend:0
+msgid "Avoid resend"
+msgstr "Izogibaj se ponovnemu pošiljanju"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mass_mailing,avoid_resend:0
+msgid "Avoid to send this mass mailing email twice to the same recipient"
+msgstr "Izogibaj se dvakratnemu masovnemu pošiljanju istemu prejemniku."
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "Country"
+msgstr "Država"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail,path:0
+msgid "Discussion Path"
+msgstr "Pot do razprave"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail_statistics
+msgid "Email Statistics"
+msgstr "Statistika e-pošte"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,email_score:0
+msgid "Email score"
+msgstr "Točkovanje e-pošte"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_id_int:0
+msgid "Mail ID"
+msgstr "ID pošte"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mail_stats_id:0
+msgid "Mail statistics"
+msgstr "Poštna statistika"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mail.statistics,mail_tracking_id:0
+msgid "Mail tracking"
+msgstr "Sledenje pošte"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_email
+msgid "MailTracking email"
+msgstr "Sledenje e-pošte"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_tracking_event
+msgid "MailTracking event"
+msgstr "Dogodek sledenja e-pošte"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing
+msgid "Mass Mailing"
+msgstr "Masovno razpošiljanje"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mass_mailing_contact
+msgid "Mass Mailing Contact"
+msgstr "Stik masovne pošte"
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.tracking.email,mass_mailing_id:0
+msgid "Mass mailing"
+msgstr "Masovna pošta"
+
+#. module: mail_tracking_mass_mailing
+#: model:ir.model,name:mail_tracking_mass_mailing.model_mail_mail
+msgid "Outgoing Mails"
+msgstr "Izhodna pošta"
+
+#. module: mail_tracking_mass_mailing
+#: code:addons/mail_tracking_mass_mailing/models/mail_mass_mailing.py:28
+#, python-format
+msgid ""
+"There is no more recipients to send and 'Avoid resend' option is enabled"
+msgstr ""
+"Ni več potencialnih prejemnikov, pa tudi opcija 'Izogibaj se ponovnemu "
+"pošiljanju' je omogočena."
+
+#. module: mail_tracking_mass_mailing
+#: field:mail.mass_mailing.contact,tracking_email_ids:0
+msgid "Tracking emails"
+msgstr "Sledilna e-pošta"
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+#: field:mail.mail.statistics,tracking_event_ids:0
+msgid "Tracking events"
+msgstr "Sledilni dogodki"
+
+#. module: mail_tracking_mass_mailing
+#: help:mail.mail,path:0
+msgid ""
+"Used to display messages in a paragraph-based chatter using a unique path;"
+msgstr ""
+"Uporabljeno za prikaz sporočil v sklopu razgovora na osnovi odstavkov z "
+"uporabo unikatne poti;"
+
+#. module: mail_tracking_mass_mailing
+#: view:mail.mail.statistics:mail_tracking_mass_mailing.view_mail_mail_statistics_form
+msgid "User agent"
+msgstr "Uporabnikov odjemalec"
diff --git a/mail_tracking_mass_mailing/models/__init__.py b/mail_tracking_mass_mailing/models/__init__.py
new file mode 100644
index 0000000..94fdb95
--- /dev/null
+++ b/mail_tracking_mass_mailing/models/__init__.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from . import mail_mail
+from . import mail_tracking_email
+from . import mail_tracking_event
+from . import mail_mail_statistics
+from . import mail_mass_mailing
+from . import mail_mass_mailing_contact
diff --git a/mail_tracking_mass_mailing/models/__init__.pyc b/mail_tracking_mass_mailing/models/__init__.pyc
new file mode 100644
index 0000000..3f98d3c
Binary files /dev/null and b/mail_tracking_mass_mailing/models/__init__.pyc differ
diff --git a/mail_tracking_mass_mailing/models/mail_mail.py b/mail_tracking_mass_mailing/models/mail_mail.py
new file mode 100644
index 0000000..952d3b4
--- /dev/null
+++ b/mail_tracking_mass_mailing/models/mail_mail.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, api
+
+
+class MailMail(models.Model):
+ _inherit = "mail.mail"
+
+ @api.model
+ def _tracking_email_prepare(self, mail, partner, email):
+ res = super(MailMail, self)._tracking_email_prepare(
+ mail, partner, email)
+ res['mail_id_int'] = mail.id
+ res['mass_mailing_id'] = mail.mailing_id.id
+ res['mail_stats_id'] = mail.statistics_ids[:1].id \
+ if mail.statistics_ids else False
+ return res
+
+ @api.model
+ def _get_tracking_url(self, mail, partner=None):
+ # Invalid this tracking image, we have other to do the same
+ return False
diff --git a/mail_tracking_mass_mailing/models/mail_mail.pyc b/mail_tracking_mass_mailing/models/mail_mail.pyc
new file mode 100644
index 0000000..0e0d273
Binary files /dev/null and b/mail_tracking_mass_mailing/models/mail_mail.pyc differ
diff --git a/mail_tracking_mass_mailing/models/mail_mail_statistics.py b/mail_tracking_mass_mailing/models/mail_mail_statistics.py
new file mode 100644
index 0000000..dbcfe9b
--- /dev/null
+++ b/mail_tracking_mass_mailing/models/mail_mail_statistics.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, fields
+
+
+class MailMailStatistics(models.Model):
+ _inherit = "mail.mail.statistics"
+
+ mail_tracking_id = fields.Many2one(
+ string="Mail tracking", comodel_name='mail.tracking.email',
+ readonly=True)
+ tracking_event_ids = fields.One2many(
+ string="Tracking events", comodel_name='mail.tracking.event',
+ related='mail_tracking_id.tracking_event_ids', readonly=True)
diff --git a/mail_tracking_mass_mailing/models/mail_mail_statistics.pyc b/mail_tracking_mass_mailing/models/mail_mail_statistics.pyc
new file mode 100644
index 0000000..f73c44a
Binary files /dev/null and b/mail_tracking_mass_mailing/models/mail_mail_statistics.pyc differ
diff --git a/mail_tracking_mass_mailing/models/mail_mass_mailing.py b/mail_tracking_mass_mailing/models/mail_mass_mailing.py
new file mode 100644
index 0000000..db32bc8
--- /dev/null
+++ b/mail_tracking_mass_mailing/models/mail_mass_mailing.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, api, fields, _
+from openerp.exceptions import Warning as UserError
+
+
+class MailMassMailing(models.Model):
+ _inherit = 'mail.mass_mailing'
+
+ avoid_resend = fields.Boolean(
+ string="Avoid resend",
+ help="Avoid to send this mass mailing email twice "
+ "to the same recipient")
+
+ @api.model
+ def get_recipients(self, mailing):
+ res_ids = super(MailMassMailing, self).get_recipients(mailing)
+ if mailing.avoid_resend:
+ already_sent = self.env['mail.mail.statistics'].search([
+ ('mass_mailing_id', '=', mailing.id),
+ ('model', '=', mailing.mailing_model),
+ ])
+ res_ids = list(set(res_ids).difference(
+ already_sent.mapped('res_id')))
+ if not res_ids:
+ raise UserError(_(
+ "There is no more recipients to send and 'Avoid resend' "
+ "option is enabled"))
+ return res_ids
diff --git a/mail_tracking_mass_mailing/models/mail_mass_mailing.pyc b/mail_tracking_mass_mailing/models/mail_mass_mailing.pyc
new file mode 100644
index 0000000..7990618
Binary files /dev/null and b/mail_tracking_mass_mailing/models/mail_mass_mailing.pyc differ
diff --git a/mail_tracking_mass_mailing/models/mail_mass_mailing_contact.py b/mail_tracking_mass_mailing/models/mail_mass_mailing_contact.py
new file mode 100644
index 0000000..bfc1791
--- /dev/null
+++ b/mail_tracking_mass_mailing/models/mail_mass_mailing_contact.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, api, fields
+
+
+class MailMassMailingContact(models.Model):
+ _inherit = 'mail.mass_mailing.contact'
+
+ tracking_email_ids = fields.Many2many(
+ string="Tracking emails", comodel_name="mail.tracking.email",
+ readonly=True)
+ email_score = fields.Float(
+ string="Email score", readonly=True, default=50.0)
+
+ @api.multi
+ def email_score_calculate(self):
+ for contact in self:
+ contact.email_score = contact.tracking_email_ids.email_score()
+
+ @api.multi
+ def write(self, vals):
+ email = vals.get('email')
+ if email is not None:
+ vals['tracking_email_ids'] = \
+ self.env['mail.tracking.email']._tracking_ids_to_write(email)
+ return super(MailMassMailingContact, self).write(vals)
diff --git a/mail_tracking_mass_mailing/models/mail_mass_mailing_contact.pyc b/mail_tracking_mass_mailing/models/mail_mass_mailing_contact.pyc
new file mode 100644
index 0000000..3448af1
Binary files /dev/null and b/mail_tracking_mass_mailing/models/mail_mass_mailing_contact.pyc differ
diff --git a/mail_tracking_mass_mailing/models/mail_tracking_email.py b/mail_tracking_mass_mailing/models/mail_tracking_email.py
new file mode 100644
index 0000000..571fe76
--- /dev/null
+++ b/mail_tracking_mass_mailing/models/mail_tracking_email.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, fields, api
+
+
+class MailTrackingEmail(models.Model):
+ _inherit = "mail.tracking.email"
+
+ mass_mailing_id = fields.Many2one(
+ string="Mass mailing", comodel_name='mail.mass_mailing', readonly=True)
+ mail_stats_id = fields.Many2one(
+ string="Mail statistics", comodel_name='mail.mail.statistics',
+ readonly=True)
+ mail_id_int = fields.Integer(string="Mail ID", readonly=True)
+
+ @api.model
+ def _statistics_link_prepare(self, tracking):
+ return {
+ 'mail_tracking_id': tracking.id,
+ }
+
+ @api.model
+ def create(self, vals):
+ tracking = super(MailTrackingEmail, self).create(vals)
+ # Link mail statistics with this tracking
+ if tracking.mail_stats_id:
+ tracking.mail_stats_id.write(
+ self._statistics_link_prepare(tracking))
+ # Get partner from mail statistics
+ # if mass_mailing_partner addon installed
+ if ('partner_id' in tracking.mail_stats_id._fields and
+ tracking.mail_stats_id.partner_id and
+ not tracking.partner_id):
+ tracking.partner_id = tracking.mail_stats_id.partner_id.id
+ # Add this tracking to mass mailing contacts with this recipient
+ self.tracking_ids_recalculate(
+ 'mail.mass_mailing.contact', 'email', 'tracking_email_ids',
+ tracking.recipient_address, new_tracking=tracking)
+ return tracking
+
+ @api.multi
+ def event_create(self, event_type, metadata):
+ res = super(MailTrackingEmail, self).event_create(event_type, metadata)
+ for tracking_email in self:
+ contacts = self.tracking_ids_recalculate(
+ 'mail.mass_mailing.contact', 'email', 'tracking_email_ids',
+ tracking_email.recipient_address)
+ if contacts:
+ contacts.email_score_calculate()
+ return res
diff --git a/mail_tracking_mass_mailing/models/mail_tracking_email.pyc b/mail_tracking_mass_mailing/models/mail_tracking_email.pyc
new file mode 100644
index 0000000..9ab958c
Binary files /dev/null and b/mail_tracking_mass_mailing/models/mail_tracking_email.pyc differ
diff --git a/mail_tracking_mass_mailing/models/mail_tracking_event.py b/mail_tracking_mass_mailing/models/mail_tracking_event.py
new file mode 100644
index 0000000..97e0911
--- /dev/null
+++ b/mail_tracking_mass_mailing/models/mail_tracking_event.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import models, api
+
+
+class MailTrackingEvent(models.Model):
+ _inherit = "mail.tracking.event"
+
+ @api.model
+ def process_open(self, tracking_email, metadata):
+ res = super(MailTrackingEvent, self).process_open(
+ tracking_email, metadata)
+ mail_mail_stats = self.sudo().env['mail.mail.statistics']
+ mail_mail_stats.set_opened(mail_mail_ids=[tracking_email.mail_id_int])
+ return res
+
+ def _tracking_set_bounce(self, tracking_email, metadata):
+ mail_mail_stats = self.sudo().env['mail.mail.statistics']
+ mail_mail_stats.set_bounced(mail_mail_ids=[tracking_email.mail_id_int])
+
+ @api.model
+ def process_hard_bounce(self, tracking_email, metadata):
+ res = super(MailTrackingEvent, self).process_hard_bounce(
+ tracking_email, metadata)
+ self._tracking_set_bounce(tracking_email, metadata)
+ return res
+
+ @api.model
+ def process_soft_bounce(self, tracking_email, metadata):
+ res = super(MailTrackingEvent, self).process_soft_bounce(
+ tracking_email, metadata)
+ self._tracking_set_bounce(tracking_email, metadata)
+ return res
+
+ @api.model
+ def process_reject(self, tracking_email, metadata):
+ res = super(MailTrackingEvent, self).process_reject(
+ tracking_email, metadata)
+ self._tracking_set_bounce(tracking_email, metadata)
+ return res
+
+ @api.model
+ def process_spam(self, tracking_email, metadata):
+ res = super(MailTrackingEvent, self).process_spam(
+ tracking_email, metadata)
+ self._tracking_set_bounce(tracking_email, metadata)
+ return res
diff --git a/mail_tracking_mass_mailing/models/mail_tracking_event.pyc b/mail_tracking_mass_mailing/models/mail_tracking_event.pyc
new file mode 100644
index 0000000..db3cf02
Binary files /dev/null and b/mail_tracking_mass_mailing/models/mail_tracking_event.pyc differ
diff --git a/mail_tracking_mass_mailing/static/description/icon.png b/mail_tracking_mass_mailing/static/description/icon.png
new file mode 100644
index 0000000..3a0328b
Binary files /dev/null and b/mail_tracking_mass_mailing/static/description/icon.png differ
diff --git a/mail_tracking_mass_mailing/tests/__init__.py b/mail_tracking_mass_mailing/tests/__init__.py
new file mode 100644
index 0000000..b804cd4
--- /dev/null
+++ b/mail_tracking_mass_mailing/tests/__init__.py
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from . import test_mass_mailing
diff --git a/mail_tracking_mass_mailing/tests/test_mass_mailing.py b/mail_tracking_mass_mailing/tests/test_mass_mailing.py
new file mode 100644
index 0000000..b4c1f89
--- /dev/null
+++ b/mail_tracking_mass_mailing/tests/test_mass_mailing.py
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa -
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp.tests.common import TransactionCase
+from openerp.exceptions import Warning as UserError
+
+
+# One test case per method
+class TestMassMailing(TransactionCase):
+ def setUp(self):
+ super(TestMassMailing, self).setUp()
+ self.list = self.env['mail.mass_mailing.list'].create({
+ 'name': 'Test mail tracking',
+ })
+ self.contact_a = self.env['mail.mass_mailing.contact'].create({
+ 'list_id': self.list.id,
+ 'name': 'Test contact A',
+ 'email': 'contact_a@example.com',
+ })
+ self.mailing = self.env['mail.mass_mailing'].create({
+ 'name': 'Test subject',
+ 'email_from': 'from@example.com',
+ 'mailing_model': 'mail.mass_mailing.contact',
+ 'mailing_domain': "[('list_id', 'in', [%d]), "
+ "('opt_out', '=', False)]" % self.list.id,
+ 'contact_list_ids': [(6, False, [self.list.id])],
+ 'body_html': 'Test email body
',
+ 'reply_to_mode': 'email',
+ })
+
+ def resend_mass_mailing(self, first, second):
+ self.mailing.send_mail()
+ self.assertEqual(len(self.mailing.statistics_ids), first)
+ self.env['mail.mass_mailing.contact'].create({
+ 'list_id': self.list.id,
+ 'name': 'Test contact B',
+ 'email': 'contact_b@example.com',
+ })
+ self.mailing.send_mail()
+ self.assertEqual(len(self.mailing.statistics_ids), second)
+
+ def test_avoid_resend_enable(self):
+ self.mailing.avoid_resend = True
+ self.resend_mass_mailing(1, 2)
+ with self.assertRaises(UserError):
+ self.mailing.send_mail()
+
+ def test_avoid_resend_disable(self):
+ self.mailing.avoid_resend = False
+ self.resend_mass_mailing(1, 3)
+
+ def test_tracking_email_link(self):
+ self.mailing.send_mail()
+ for stat in self.mailing.statistics_ids:
+ if stat.mail_mail_id:
+ stat.mail_mail_id.send()
+ tracking_email = self.env['mail.tracking.email'].search([
+ ('mail_id_int', '=', stat.mail_mail_id_int),
+ ])
+ self.assertTrue(tracking_email)
+ self.assertEqual(
+ tracking_email.mass_mailing_id.id, self.mailing.id)
+ self.assertEqual(tracking_email.mail_stats_id.id, stat.id)
+ self.assertEqual(stat.mail_tracking_id.id, tracking_email.id)
+ # And now open the email
+ metadata = {
+ 'ip': '127.0.0.1',
+ 'user_agent': 'Odoo Test/1.0',
+ 'os_family': 'linux',
+ 'ua_family': 'odoo',
+ }
+ tracking_email.event_create('open', metadata)
+ self.assertTrue(stat.opened)
+
+ def _tracking_email_bounce(self, event_type, state):
+ self.mailing.send_mail()
+ for stat in self.mailing.statistics_ids:
+ if stat.mail_mail_id:
+ stat.mail_mail_id.send()
+ tracking_email = self.env['mail.tracking.email'].search([
+ ('mail_id_int', '=', stat.mail_mail_id_int),
+ ])
+ # And now mark the email as bounce
+ metadata = {
+ 'bounce_type': '499',
+ 'bounce_description': 'Unable to connect to MX servers',
+ }
+ tracking_email.event_create(event_type, metadata)
+ self.assertTrue(stat.bounced)
+
+ def test_tracking_email_hard_bounce(self):
+ self._tracking_email_bounce('hard_bounce', 'bounced')
+
+ def test_tracking_email_soft_bounce(self):
+ self._tracking_email_bounce('soft_bounce', 'soft-bounced')
+
+ def test_tracking_email_reject(self):
+ self._tracking_email_bounce('reject', 'rejected')
+
+ def test_tracking_email_spam(self):
+ self._tracking_email_bounce('spam', 'spam')
+
+ def test_contact_tracking_emails(self):
+ self.mailing.send_mail()
+ for stat in self.mailing.statistics_ids:
+ if stat.mail_mail_id:
+ stat.mail_mail_id.send()
+ self.assertEqual(len(self.contact_a.tracking_email_ids), 1)
+ self.contact_a.email = 'other_contact_a@example.com'
+ self.assertEqual(len(self.contact_a.tracking_email_ids), 0)
+ self.contact_a.email = 'contact_a@example.com'
+ self.assertEqual(len(self.contact_a.tracking_email_ids), 1)
diff --git a/mail_tracking_mass_mailing/views/mail_mail_statistics_view.xml b/mail_tracking_mass_mailing/views/mail_mail_statistics_view.xml
new file mode 100644
index 0000000..d67ddd2
--- /dev/null
+++ b/mail_tracking_mass_mailing/views/mail_mail_statistics_view.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+ Add tracking email info
+ mail.mail.statistics
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mail_tracking_mass_mailing/views/mail_mass_mailing_contact_view.xml b/mail_tracking_mass_mailing/views/mail_mass_mailing_contact_view.xml
new file mode 100644
index 0000000..34dbc3e
--- /dev/null
+++ b/mail_tracking_mass_mailing/views/mail_mass_mailing_contact_view.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ Add email score and stars
+ mail.mass_mailing.contact
+
+
+
+
+
+
+
+
+
+
diff --git a/mail_tracking_mass_mailing/views/mail_mass_mailing_view.xml b/mail_tracking_mass_mailing/views/mail_mass_mailing_view.xml
new file mode 100644
index 0000000..c10a53f
--- /dev/null
+++ b/mail_tracking_mass_mailing/views/mail_mass_mailing_view.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ Add avoid resend field
+ mail.mass_mailing
+
+
+
+
+
+
+
+
+
+
diff --git a/mail_tracking_mass_mailing/views/mail_tracking_email_view.xml b/mail_tracking_mass_mailing/views/mail_tracking_email_view.xml
new file mode 100644
index 0000000..5549650
--- /dev/null
+++ b/mail_tracking_mass_mailing/views/mail_tracking_email_view.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+ Add mass mailing and mail stadistics
+ mail.tracking.email
+
+
+
+
+
+
+
+
+
+
+
diff --git a/smile_access_control/__init__.py b/smile_access_control/__init__.py
new file mode 100644
index 0000000..9676358
--- /dev/null
+++ b/smile_access_control/__init__.py
@@ -0,0 +1,22 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import models
diff --git a/smile_access_control/__init__.pyc b/smile_access_control/__init__.pyc
new file mode 100644
index 0000000..405e7e1
Binary files /dev/null and b/smile_access_control/__init__.pyc differ
diff --git a/smile_access_control/__openerp__.py b/smile_access_control/__openerp__.py
new file mode 100644
index 0000000..5438540
--- /dev/null
+++ b/smile_access_control/__openerp__.py
@@ -0,0 +1,55 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+{
+ "name": "Access Control",
+ "version": "1.0",
+ "author": "Smile",
+ "website": 'http://www.smile.fr',
+ "license": 'AGPL-3',
+ "category": "Tools",
+ "description": """
+Manage users thanks to user profiles
+------------------------------------
+
+This is a new way to manage your users' rights :
+you can manage users by functional profiles.
+
+Basically, a « profile » is a fictive user (res.users) tagged as a profile.
+It means that like before (with the basic rules of OpenERP) you can add groups to your profile.
+You can associate a profile to your user. Or in an other way, you can add users by profile.
+You can also set the fields which are private per user or global for all users.
+You have choice to update or not in write mode for associated users, with field 'Update users' in profiles.
+
+NB : to test your profile, you need to set him as « active », which will be disabled afterwards at the next update.
+
+Suggestions & Feedback to: corentin.pouhet-brunerie@smile.fr & matthieu.choplin@smile.fr
+""",
+ "depends": ['share'],
+ "data": [
+ "views/res_users_view.xml",
+ "data/res_users_data.xml",
+ "views/res_groups_view.xml",
+ ],
+ "demo": [],
+ "installable": True,
+ "active": False,
+}
diff --git a/smile_access_control/data/res_users_data.xml b/smile_access_control/data/res_users_data.xml
new file mode 100644
index 0000000..b69f218
--- /dev/null
+++ b/smile_access_control/data/res_users_data.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/smile_access_control/i18n/fr.po b/smile_access_control/i18n/fr.po
new file mode 100644
index 0000000..28558cb
--- /dev/null
+++ b/smile_access_control/i18n/fr.po
@@ -0,0 +1,109 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * smile_access_control
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 6.0.3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2011-11-24 11:43+0000\n"
+"PO-Revision-Date: 2011-11-24 11:43+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: smile_access_control
+#: view:res.groups:0
+msgid "Complete Access Controls"
+msgstr "Compléter la liste des contrôles d'accès"
+
+#. module: smile_access_control
+#: field:res.users,user_profile_id:0
+msgid "User Profile"
+msgstr "Profil utilisateur"
+
+#. module: smile_access_control
+#: sql_constraint:res.users:0
+msgid "You can not have two users with the same login !"
+msgstr "VOus ne pouvez pas avoir deux utilsiateurs avec le même login !"
+
+#. module: smile_access_control
+#: field:res.users,user_ids:0
+msgid "Users"
+msgstr "Utilisateurs"
+
+#. module: smile_access_control
+#: model:ir.model,name:smile_access_control.model_res_groups
+msgid "Access Groups"
+msgstr "Groupes"
+
+#. module: smile_access_control
+#: model:ir.actions.act_window,name:smile_access_control.action_res_user_profiles
+#: model:ir.ui.menu,name:smile_access_control.menu_action_res_user_profiles
+msgid "User Profiles"
+msgstr "Profils utilisateurs"
+
+#. module: smile_access_control
+#: sql_constraint:res.groups:0
+msgid "The name of the group must be unique !"
+msgstr "Le nom du groupe doit être unique !"
+
+#. module: smile_access_control
+#: model:ir.model,name:smile_access_control.model_ir_model
+msgid "Objects"
+msgstr "Objets"
+
+#. module: smile_access_control
+#: constraint:res.users:0
+msgid "The chosen company is not in the allowed companies for this user"
+msgstr "La société choisie n'est pas autorisée pour cet utilisateur."
+
+#. module: smile_access_control
+#: field:res.users,field_ids:0
+msgid "Fields to update"
+msgstr "Champs à mettre à jour"
+
+#. module: smile_access_control
+#: field:res.users,user_profile:0
+msgid "Is User Profile"
+msgstr "Correspond à un profil utilisateur"
+
+#. module: smile_access_control
+#: view:res.users:0
+msgid "Fields to update for linked users"
+msgstr "Champs à mettre à jour au niveau des utilisateurs associés"
+
+#. module: smile_access_control
+#: view:res.users:0
+msgid "Configuration"
+msgstr "Configuration"
+
+#. module: smile_access_control
+#: view:res.users:0
+msgid "Linked users"
+msgstr "Utilisateurs associés"
+
+#. module: smile_access_control
+#: code:addons/smile_access_control/res_users.py:80
+#, python-format
+msgid "Warning!"
+msgstr "Attention !"
+
+#. module: smile_access_control
+#: code:addons/smile_access_control/res_users.py:80
+#, python-format
+msgid "You cannot change the profile of a user which is itself a profile!"
+msgstr "Vous ne pouvez pas modifier le profil d'un utilisateur qui est lui-même un profil!"
+
+#. module: smile_access_control
+#: field:res.users,is_update_users:0
+msgid "Update users"
+msgstr "Mettre à jour les utilisateurs"
+
+#. module: smile_access_control
+#: help:res.users,is_update_users:0
+msgid "If false, users associated to this profile will be not updated after creation"
+msgstr "Si faux, les utilisateurs associés au profil ne seront pas mis à jour après création"
diff --git a/smile_access_control/models/__init__.py b/smile_access_control/models/__init__.py
new file mode 100644
index 0000000..0a99ec7
--- /dev/null
+++ b/smile_access_control/models/__init__.py
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import res_users
+import res_groups
diff --git a/smile_access_control/models/__init__.pyc b/smile_access_control/models/__init__.pyc
new file mode 100644
index 0000000..651f615
Binary files /dev/null and b/smile_access_control/models/__init__.pyc differ
diff --git a/smile_access_control/models/res_groups.py b/smile_access_control/models/res_groups.py
new file mode 100644
index 0000000..4b134f8
--- /dev/null
+++ b/smile_access_control/models/res_groups.py
@@ -0,0 +1,115 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp import api, fields, models
+
+
+class IrModel(models.Model):
+ _inherit = 'ir.model'
+
+ @api.multi
+ def _get_first_level_relations(self):
+ field_obj = self.env['ir.model.fields']
+ field_recs = field_obj.search([
+ ('ttype', 'in', ('many2one', 'one2many', 'many2many')),
+ ('model_id', 'in', self.ids),
+ ])
+ return self.search([('model', 'in', field_recs.mapped('relation'))])
+
+ @api.multi
+ def _get_relations(self, level=1):
+ """
+ Return models linked to models given in params
+ If you don't want limit the relations level, indicate level = -1
+ """
+ relations = self
+ while self and level:
+ self = self._get_first_level_relations() - relations
+ relations |= self
+ level -= 1
+ return self
+
+
+class ResGroups(models.Model):
+ _inherit = 'res.groups'
+
+ active = fields.Boolean(default=True)
+
+ @api.multi
+ def _update_users(self, vals):
+ if vals.get('users'):
+ user_obj = self.env['res.users']
+ user_profiles = user_obj.browse()
+ for item in vals['users']:
+ user_ids = []
+ if item[0] == 6:
+ user_ids = item[2]
+ elif item[0] == 4:
+ user_ids = [item[1]]
+ users = user_obj.browse(user_ids)
+ user_profiles |= users.filtered(lambda user: user.user_profile)
+ user_profiles |= users.mapped('user_profile_id')
+ if user_profiles:
+ user_profiles._update_users_linked_to_profile()
+
+ @api.multi
+ def write(self, vals):
+ group_ids_to_unlink = []
+ group_ids_to_link = []
+ if vals.get('implied_ids'):
+ for item in vals['implied_ids']:
+ if item[0] == 6:
+ for group in self:
+ group_ids_to_unlink.extend(list(set(group.implied_ids.ids) - set(item[2])))
+ group_ids_to_link.extend(list(set(item[2]) - set(group.implied_ids.ids)))
+ elif item[0] == 5:
+ group_ids_to_unlink.extend(item[1])
+ elif item[0] == 4:
+ group_ids_to_link.append(item[1])
+ elif item[0] == 3:
+ group_ids_to_unlink.append(item[1])
+ res = super(ResGroups, self).write(vals)
+ self._update_users(vals)
+ if vals.get('implied_ids'):
+ # Update group for all users depending of this group, in order to add new implied groups to their groups
+ for group in self:
+ groups_id = [(4, subgroup_id) for subgroup_id in group_ids_to_link] + \
+ [(3, subgroup_id) for subgroup_id in group_ids_to_unlink]
+ group.with_context(active_test=False).users.write({'groups_id': groups_id})
+ return res
+
+ @api.multi
+ def button_complete_access_controls(self):
+ """Create access rules for the first level relation models of access rule models not only in readonly"""
+ access_obj = self.env['ir.model.access']
+ for group in self:
+ models = group.model_access.filtered(lambda rule: rule.perm_write or rule.perm_create or rule.perm_unlink).mapped('model_id')
+ for model in models._get_relations(self._context.get('relations_level', 1)):
+ access_obj.create({
+ 'name': '%s %s' % (model.model, group.name),
+ 'model_id': model.id,
+ 'group_id': group.id,
+ 'perm_read': True,
+ 'perm_write': False,
+ 'perm_create': False,
+ 'perm_unlink': False,
+ })
+ return True
diff --git a/smile_access_control/models/res_groups.pyc b/smile_access_control/models/res_groups.pyc
new file mode 100644
index 0000000..24685a7
Binary files /dev/null and b/smile_access_control/models/res_groups.pyc differ
diff --git a/smile_access_control/models/res_users.py b/smile_access_control/models/res_users.py
new file mode 100644
index 0000000..934dcd9
--- /dev/null
+++ b/smile_access_control/models/res_users.py
@@ -0,0 +1,130 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp import api, fields, models, SUPERUSER_ID, _
+from openerp.exceptions import Warning
+
+
+class ResUsers(models.Model):
+ _inherit = 'res.users'
+
+ @api.one
+ def _is_share(self, name, args):
+ return (self.id, self.user_profile or not self.has_group('base.group_user'))
+
+ @api.model
+ def _setup_fields(self):
+ super(ResUsers, self)._setup_fields()
+ self._fields['share'].column._fnct = ResUsers._is_share
+
+ @api.model
+ def _get_default_field_ids(self):
+ return self.env['ir.model.fields'].search([
+ ('model', 'in', ('res.users', 'res.partner')),
+ ('name', 'in', ('action_id', 'menu_id', 'groups_id')),
+ ]).ids
+
+ user_profile = fields.Boolean('Is User Profile')
+ user_profile_id = fields.Many2one('res.users', 'User Profile', domain=[('id', '!=', SUPERUSER_ID), ('user_profile', '=', True)],
+ context={'active_test': False})
+ user_ids = fields.One2many('res.users', 'user_profile_id', 'Users', domain=[('user_profile', '=', False)])
+ field_ids = fields.Many2many('ir.model.fields', 'res_users_fields_rel', 'user_id', 'field_id', 'Fields to update',
+ domain=[('model', 'in', ('res.users', 'res.partner')),
+ ('ttype', 'not in', ('one2many',)),
+ ('name', 'not in', ('user_profile', 'user_profile_id', 'user_ids', 'field_ids', 'view'))],
+ default=_get_default_field_ids)
+ is_update_users = fields.Boolean(string="Update users", default=lambda *a: True,
+ help="If false, users associated to this profile will be not updated after creation")
+
+ _sql_constraints = [
+ ('active_admin_check', 'CHECK (id = 1 AND active = TRUE OR id <> 1)', 'The user with id = 1 must be always active!'),
+ ('profile_without_profile_id', 'CHECK( (user_profile = TRUE AND user_profile_id IS NULL) OR user_profile = FALSE )',
+ 'Profile users cannot be linked to a profile!'),
+ ]
+
+ @api.one
+ @api.constrains('user_profile_id')
+ def _check_user_profile_id(self):
+ admin = self.env.ref('base.user_root')
+ if self.user_profile_id == admin:
+ raise Warning(_("You can't use %s as user profile !") % admin.name)
+
+ @api.onchange('user_profile')
+ def onchange_user_profile(self):
+ if self.user_profile:
+ self.active = self.id == SUPERUSER_ID
+ self.user_profile_id = False
+
+ @api.multi
+ def _update_from_profile(self, fields=None):
+ if not self:
+ return
+ if len(self.mapped('user_profile_id')) != 1:
+ raise Warning(_("_update_from_profile accepts only users linked to a same profile"))
+ user_profile = self[0].user_profile_id
+ if not fields:
+ fields = user_profile.field_ids.mapped('name')
+ else:
+ fields = set(fields) & set(user_profile.field_ids.mapped('name'))
+ if user_profile:
+ vals = {}
+ for field in fields:
+ value = getattr(user_profile, field)
+ field_type = self._fields[field].type
+ if field_type == 'many2one':
+ vals[field] = value.id
+ elif field_type == 'many2many':
+ vals[field] = [(6, 0, value.ids)]
+ elif field_type == 'one2many':
+ raise Warning(_("_update_from_profile doesn't manage fields.One2many"))
+ else:
+ vals[field] = value
+ if vals:
+ self.write(vals)
+
+ @api.multi
+ def _update_users_linked_to_profile(self, fields=None):
+ for user_profile in self.filtered(lambda user: user.user_profile and user.is_update_users):
+ user_profile.with_context(active_test=False).mapped('user_ids')._update_from_profile(fields)
+
+ @api.model
+ def create(self, vals):
+ record = super(ResUsers, self).create(vals)
+ if record.user_profile_id:
+ record._update_from_profile()
+ return record
+
+ @api.multi
+ def write(self, vals):
+ if vals.get('user_profile_id'):
+ users_to_update = self.filtered(lambda user: user.user_profile_id.id != vals['user_profile_id'])
+ vals = self._remove_reified_groups(vals)
+ res = super(ResUsers, self).write(vals)
+ if vals.get('user_profile_id'):
+ users_to_update._update_from_profile()
+ else:
+ self._update_users_linked_to_profile(vals.keys())
+ return res
+
+ def copy_data(self, cr, uid, user_id, default=None, context=None):
+ default = default.copy() if default else {}
+ default['user_ids'] = []
+ return super(ResUsers, self).copy_data(cr, uid, user_id, default, context)
diff --git a/smile_access_control/models/res_users.pyc b/smile_access_control/models/res_users.pyc
new file mode 100644
index 0000000..318e8f5
Binary files /dev/null and b/smile_access_control/models/res_users.pyc differ
diff --git a/smile_access_control/static/description/icon.png b/smile_access_control/static/description/icon.png
new file mode 100644
index 0000000..2772638
Binary files /dev/null and b/smile_access_control/static/description/icon.png differ
diff --git a/smile_access_control/tests/__init__.py b/smile_access_control/tests/__init__.py
new file mode 100644
index 0000000..fb854af
--- /dev/null
+++ b/smile_access_control/tests/__init__.py
@@ -0,0 +1,24 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import test_access_control
+import test_users
+import test_groups
diff --git a/smile_access_control/tests/test_access_control.py b/smile_access_control/tests/test_access_control.py
new file mode 100644
index 0000000..a8bebed
--- /dev/null
+++ b/smile_access_control/tests/test_access_control.py
@@ -0,0 +1,102 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp.tests.common import TransactionCase
+from openerp.exceptions import ValidationError
+
+
+class TestAccessControl(TransactionCase):
+
+ def setUp(self):
+ super(TestAccessControl, self).setUp()
+ users_obj = self.env['res.users']
+ groups_obj = self.env['res.groups']
+ # Create groups
+ self.group1, self.group2 = map(lambda index: groups_obj.create({'name': 'Group %d' % index}), range(1, 3))
+ # Create user profiles
+ self.user_profile1 = users_obj.create({
+ 'name': 'Profile 1',
+ 'login': 'profile1',
+ 'user_profile': True,
+ 'groups_id': [(4, self.group1.id)],
+ })
+ self.user_profile2 = users_obj.create({
+ 'name': 'Profile 2',
+ 'login': 'profile2',
+ 'user_profile': True,
+ 'groups_id': [(6, 0, (self.group1 | self.group2).ids)],
+ })
+ # Create users
+ self.user = users_obj.create({
+ 'name': 'Demo User',
+ 'login': 'demouser',
+ 'user_profile_id': self.user_profile1.id,
+ })
+
+ def test_changing_a_group_dependencies_should_update_groups_of_user_belonging_to_this_group(self):
+ """
+ Add Group 1 to Demo User dependencies.
+ Add a dependence to Group 2 to the group Group 1.
+ Check that user has this new dependence.
+ """
+ self.group1.implied_ids = [(4, self.group2.id)]
+ self.assertIn(self.group2, self.user.groups_id, 'The user has not the new dependence!')
+
+ def test_changing_user_profile_of_a_user_should_update_groups_of_user(self):
+ """
+ Add Group 2 to the dependencies of Group 1.
+ Check that user has this new dependence.
+ """
+ self.user.user_profile_id = self.user_profile2
+ for group in self.user_profile2.groups_id:
+ self.assertIn(group, self.user.groups_id, 'The user has not the new dependence!')
+
+ def test_change_profile_with_no_update_users_do_not_change_users(self):
+ """
+ Change Profile 2 to not update users
+ Remove Group 1 in Profile 2.
+ Check that user has again Group 1.
+ """
+ self.user.user_profile_id.is_update_users = False
+ self.assertIn(self.group1, self.user.groups_id, 'The user has not the Group 1 in dependencies !')
+
+ def test_using_admin_as_profile_should_fail(self):
+ """
+ I try to create a user with Administrator as user profile
+ I check that it failed
+ """
+ with self.assertRaisesRegexp(ValidationError, "You can't use (.*) as user profile !"):
+ self.env['res.users'].create({
+ 'name': 'toto',
+ 'login': 'toto',
+ 'user_profile_id': self.env.ref('base.user_root').id
+ })
+
+ def test_update_users_of_a_group(self):
+ """
+ I create a user U and a profile P
+ I update group Group 1 to add it user U
+ I check that
+ """
+ profile = self.env['res.users'].create({'name': 'P', 'login': 'p_login', 'user_profile': True})
+ user = self.env['res.users'].create({'name': 'U', 'login': 'u_login', 'user_profile_id': profile.id})
+ self.group1.users |= profile
+ self.assertIn(self.group1, user.groups_id, 'User U should have Group 1 in dependencies!')
diff --git a/smile_access_control/tests/test_groups.py b/smile_access_control/tests/test_groups.py
new file mode 100644
index 0000000..2e75ac9
--- /dev/null
+++ b/smile_access_control/tests/test_groups.py
@@ -0,0 +1,99 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp.tests.common import TransactionCase
+
+
+class TestGroups(TransactionCase):
+
+ def setUp(self):
+ super(TestGroups, self).setUp()
+ self.users_obj = self.env['res.users']
+ self.groups_obj = self.env['res.groups']
+
+ # Create groups
+ self.group1, self.group2 = map(lambda index: self.groups_obj.create({'name': 'Group %d' % index}), range(1, 3))
+
+ # Create a group to be completed
+ self.group_completion = self.groups_obj.create({'name': 'Group to be completed'})
+
+ # Create an ir.model.access
+ self.ir_model_access_test = self.env['ir.model.access'].create({'name': 'GroupTestCompletion',
+ 'model_id': self.ref('base.model_ir_model'),
+ 'group_id': self.group_completion.id,
+ 'perm_read': True,
+ 'perm_create': True,
+ 'perm_write': True,
+ 'perm_unlink': True})
+
+ # Create user profiles
+ self.user_profile1 = self.users_obj.create({
+ 'name': 'Profile 1',
+ 'login': 'profile1',
+ 'user_profile': True,
+ 'groups_id': [(4, self.group1.id)],
+ })
+ self.user_profile2 = self.users_obj.create({
+ 'name': 'Profile 2',
+ 'login': 'profile2',
+ 'user_profile': True,
+ 'groups_id': [(6, 0, (self.group1 | self.group2).ids)],
+ })
+ # Create users
+ self.user = self.users_obj.create({
+ 'name': 'Demo User',
+ 'login': 'demouser',
+ 'user_profile_id': self.user_profile2.id,
+ })
+
+ def test_write(self):
+ """
+ Test write method
+ """
+ res_update = self.groups_obj.browse(self.group1.id).write({'name': 'Group 1 EDITED'})
+ self.assertTrue(res_update)
+
+ def test_update_users(self):
+ """
+ Test test_update_users method
+ """
+
+ def test_button_complete_access_controls(self):
+ """
+ Test button_complete_access_controls method
+ It tests _get_relation and _get_first_level_relation in the same time
+ We use the group created in the setUp. It has only one object : object
+ Clicking this button is supposed to add four objects
+ We also check we got correct rights (True,False,False,False)
+ """
+ expected_list_after_completion = ['Models', 'ir.model.access', 'Fields', 'ir.ui.view', 'Users']
+ list_after_completion = []
+ check_right = True
+ self.group_completion.button_complete_access_controls()
+ grp_completed = self.groups_obj.browse(self.group_completion.id)
+ for i in grp_completed.model_access:
+ list_after_completion.append(i.model_id.name)
+ if i.model_id.name != "Models":
+ if not i.perm_read or i.perm_write or i.perm_create or i.perm_unlink:
+ check_right = False
+ for model in expected_list_after_completion:
+ self.assertIn(model, list_after_completion, '%s should have been added!' % model)
+ self.assertTrue(check_right)
diff --git a/smile_access_control/tests/test_users.py b/smile_access_control/tests/test_users.py
new file mode 100644
index 0000000..d473f1b
--- /dev/null
+++ b/smile_access_control/tests/test_users.py
@@ -0,0 +1,103 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp.tests.common import TransactionCase
+from openerp.exceptions import ValidationError
+
+
+class TestUsers(TransactionCase):
+
+ def setUp(self):
+ super(TestUsers, self).setUp()
+ users_obj = self.env['res.users']
+ groups_obj = self.env['res.groups']
+
+ # Create groups
+ self.group1, self.group2 = map(lambda index: groups_obj.create({'name': 'Group %d' % index}), range(1, 3))
+
+ # Create user profiles
+ self.user_profile1 = users_obj.create({
+ 'name': 'Profile 1',
+ 'login': 'profile1',
+ 'user_profile': True,
+ 'groups_id': [(4, self.group1.id)],
+ })
+ self.user_profile2 = users_obj.create({
+ 'name': 'Profile 2',
+ 'login': 'profile2',
+ 'user_profile': True,
+ 'groups_id': [(6, 0, (self.group1 | self.group2).ids)],
+ })
+ # Create users
+ self.user = users_obj.create({
+ 'name': 'Demo User',
+ 'login': 'demouser',
+ 'user_profile_id': self.user_profile1.id,
+ })
+
+ def test_create(self):
+ """
+ Test create method
+ We create a dictionary of values
+ We create a user from these values, he has a user profile
+ We check that that the new user has been created with his name
+ """
+ userValue = {'name': 'User Test 1',
+ 'login': 'usertest1',
+ 'user_profile_id': self.user_profile2.id,
+ }
+ users_obj = self.env['res.users']
+ user_test = users_obj.create(userValue)
+ newUser = self.env['res.users'].browse(user_test.id)
+ self.assertEqual(userValue['name'], newUser['name'])
+
+ def test_write(self):
+ """
+ Test write method
+ We use the user created in the first method
+ We change his user_profile_id
+ We check if the update has been done
+ """
+ userEdited = self.env['res.users'].browse(self.user.id).write({'user_profile_id': self.user_profile2.id})
+ self.assertEqual(userEdited, True)
+
+ def test_check_user_profile_id(self):
+ """
+ Test _check_user_profile_id method
+ We try to create a user with admin as user profile
+ It raises a Validation Error
+ """
+ userValue = {'name': 'User Test 1',
+ 'login': 'usertest1',
+ 'user_profile_id': self.env.ref('base.user_root').id,
+ }
+ with self.assertRaises(ValidationError):
+ self.env['res.users'].create(userValue)
+
+ def test_onchange_user_profile(self):
+ """
+ Test onchange user profile method
+ We try to set the profile of an existing user to admin
+ It raises a Validation Error
+ """
+ admin = self.env.ref('base.user_root').id
+ with self.assertRaises(ValidationError):
+ self.env['res.users'].browse(self.user.id).write({'user_profile_id': admin})
diff --git a/smile_access_control/views/res_groups_view.xml b/smile_access_control/views/res_groups_view.xml
new file mode 100644
index 0000000..c47d479
--- /dev/null
+++ b/smile_access_control/views/res_groups_view.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+ res.groups.form
+ res.groups
+
+
+
+
+
+
+
+
+
+
+
+
+ {'active_test': False}
+
+
+
+
diff --git a/smile_access_control/views/res_users_view.xml b/smile_access_control/views/res_users_view.xml
new file mode 100644
index 0000000..7888051
--- /dev/null
+++ b/smile_access_control/views/res_users_view.xml
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+ res.users.form
+ res.users
+
+ primary
+ 10
+
+
+
+
+
+
+
+
+
+ [('user_profile', '=', False)]
+
+
+
+
+
+
+
+ esg.res.users.tree
+ res.users
+
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+ res.users.form
+ res.users
+
+ primary
+ 10
+
+
+
+
+
+
+
+ Profile ...
+
+
+
+
+
+
+
+
+
+
+
+
+
+ User Profiles
+ ir.actions.act_window
+ res.users
+ form
+
+
+ [('user_profile', '=', True)]
+
+ {'active_test': False, 'default_user_profile': True}
+
+
+
+
+ tree
+
+
+
+
+
+ form
+
+
+
+
+
+
+
+
+
+
+ res.users.form
+ res.users
+
+ primary
+
+
+
+
+
+
+
+ Super Admin
+
+
+ action = {
+ "type": "ir.actions.act_window",
+ "view_mode": "form",
+ "view_id": env.ref('smile_access_control.view_admin_form').id,
+ "res_model": "res.users",
+ "res_id": env.ref('base.user_root').id,
+ }
+
+
+
+
+
+
+
diff --git a/smile_event_event_calendar/__init__.py b/smile_event_event_calendar/__init__.py
new file mode 100644
index 0000000..b1f79b4
--- /dev/null
+++ b/smile_event_event_calendar/__init__.py
@@ -0,0 +1,22 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2016 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import models
diff --git a/smile_event_event_calendar/__init__.pyc b/smile_event_event_calendar/__init__.pyc
new file mode 100644
index 0000000..3351229
Binary files /dev/null and b/smile_event_event_calendar/__init__.pyc differ
diff --git a/smile_event_event_calendar/__openerp__.py b/smile_event_event_calendar/__openerp__.py
new file mode 100644
index 0000000..a800dc7
--- /dev/null
+++ b/smile_event_event_calendar/__openerp__.py
@@ -0,0 +1,45 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2016 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+{
+ "name": "Event Event Calendar",
+ "version": "1.0",
+ "author": "Smile",
+ "website": 'http://www.smile.fr',
+ "license": 'AGPL-3',
+ "category": "Tools",
+ "description": """
+Create relationship between event and calendar event
+----------------------------------------------------
+Add link between event.event and calendar.event.
+At event.event creation a new calender.event is created from event.event values.
+
+Suggestions & Feedback to: matthieu.joossen@smile.fr
+""",
+ "depends": ['event', 'calendar'],
+ "data": [
+ 'views/calendar_view.xml',
+ ],
+ "demo": [],
+ "auto_install": False,
+ "installable": True,
+ "application": False,
+}
diff --git a/smile_event_event_calendar/models/__init__.py b/smile_event_event_calendar/models/__init__.py
new file mode 100644
index 0000000..481024b
--- /dev/null
+++ b/smile_event_event_calendar/models/__init__.py
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2016 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import event
+import calendar_event
diff --git a/smile_event_event_calendar/models/__init__.pyc b/smile_event_event_calendar/models/__init__.pyc
new file mode 100644
index 0000000..91b563a
Binary files /dev/null and b/smile_event_event_calendar/models/__init__.pyc differ
diff --git a/smile_event_event_calendar/models/calendar_event.py b/smile_event_event_calendar/models/calendar_event.py
new file mode 100644
index 0000000..acc49ee
--- /dev/null
+++ b/smile_event_event_calendar/models/calendar_event.py
@@ -0,0 +1,46 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2016 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp import models, fields, api, _
+from openerp.exceptions import Warning
+
+
+class CalendarEvent(models.Model):
+ _inherit = 'calendar.event'
+
+ event_event_id = fields.Many2one('event.event', string='Event', ondelete='cascade', readonly=True)
+
+ @api.multi
+ def write(self, vals):
+ event_ids = self.mapped('event_event_id')
+ if event_ids and 'event_event_id' in vals and not vals.get('event_event_id'):
+ raise Warning(_('You cannot change event value if is already assign'))
+ event_vals = {}
+ if 'start_datetime' in vals:
+ event_vals['date_begin'] = vals.get('start_datetime')
+ if 'stop_datetime' in vals:
+ event_vals['date_end'] = vals.get('stop_datetime')
+ if event_ids and not all(event_vals):
+ raise Warning(_('You cannot remove start or stop date if one of the current record have and event'))
+ res = super(CalendarEvent, self).write(vals)
+ if event_ids and event_vals and not self._context.get('from_event'):
+ event_ids.with_context(from_calendar=True).write(event_vals)
+ return res
diff --git a/smile_event_event_calendar/models/calendar_event.pyc b/smile_event_event_calendar/models/calendar_event.pyc
new file mode 100644
index 0000000..92246d2
Binary files /dev/null and b/smile_event_event_calendar/models/calendar_event.pyc differ
diff --git a/smile_event_event_calendar/models/event.py b/smile_event_event_calendar/models/event.py
new file mode 100644
index 0000000..0920705
--- /dev/null
+++ b/smile_event_event_calendar/models/event.py
@@ -0,0 +1,70 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2016 Smile (). All Rights Reserved
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from openerp import models, api
+
+
+class EventEvent(models.Model):
+ _inherit = 'event.event'
+
+ @api.model
+ def create(self, vals):
+ event = super(EventEvent, self).create(vals)
+ calendar_event_vals = {'name': event.name,
+ 'start_datetime': event.date_begin,
+ 'stop_datetime': event.date_end,
+ 'start': event.date_begin,
+ 'stop': event.date_end,
+ 'allday': False,
+ 'location': event.address_id and event.address_id.name,
+ 'class': 'public',
+ 'show_as': 'free',
+ 'partner_ids': [(6, 0, [])],
+ 'event_event_id': event.id, }
+ self.env['calendar.event'].create(calendar_event_vals)
+ return event
+
+ @api.multi
+ def write(self, vals):
+ calendar_event_vals = {}
+ onchange_date = []
+ if vals.get('name'):
+ calendar_event_vals['name'] = vals.get('name')
+ if vals.get('date_begin'):
+ calendar_event_vals['start_datetime'] = vals.get('date_begin')
+ onchange_date.append('start')
+ if vals.get('date_end'):
+ calendar_event_vals['stop_datetime'] = vals.get('date_end')
+ onchange_date.append('stop')
+ if vals.get('address_id'):
+ calendar_event_vals['location'] = self.env['res.partner'].sudo().browse(vals.get('address_id')).name
+ res = super(EventEvent, self).write(vals)
+ if calendar_event_vals and not self._context.get('from_calendar'):
+ calendar_event_ids = self.env['calendar.event'].search([('event_event_id', 'in', self.ids)])
+ calendar_event_ids.write(calendar_event_vals)
+ for calendar_event_id in calendar_event_ids:
+ allday = calendar_event_id.allday
+ for fromtype in onchange_date:
+ start = calendar_event_vals.get('start_datetime', False)
+ end = calendar_event_vals.get('stop_datetime', False)
+ calendar_event_id.with_context(from_event=True).onchange_dates(fromtype, start, end, allday,
+ allday)
+ return res
diff --git a/smile_event_event_calendar/models/event.pyc b/smile_event_event_calendar/models/event.pyc
new file mode 100644
index 0000000..561cc8d
Binary files /dev/null and b/smile_event_event_calendar/models/event.pyc differ
diff --git a/smile_event_event_calendar/static/description/icon.png b/smile_event_event_calendar/static/description/icon.png
new file mode 100644
index 0000000..2772638
Binary files /dev/null and b/smile_event_event_calendar/static/description/icon.png differ
diff --git a/smile_event_event_calendar/views/calendar_view.xml b/smile_event_event_calendar/views/calendar_view.xml
new file mode 100644
index 0000000..a417df1
--- /dev/null
+++ b/smile_event_event_calendar/views/calendar_view.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ calendar.event.view.form.inherit.smile.event.event.calendar
+ calendar.event
+
+ 32
+
+
+
+
+
+
+
+
+