Browse Source

Traducciones al Español

root 8 years ago
commit
442808a6cd

+ 77 - 0
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
+<https://github.com/OCA/social/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 <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
+
+Contributors
+------------
+
+* Pedro M. Baeza <pedro.baeza@tecnativa.com>
+* Antonio Espinosa <antonio.espinosa@tecnativa.com>
+
+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.

+ 6 - 0
__init__.py

@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from . import models
+from .hooks import pre_init_hook

BIN
__init__.pyc


+ 28 - 0
__openerp__.py

@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# 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",
+}

+ 20 - 0
hooks.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# 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)

BIN
hooks.pyc


+ 142 - 0
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 <carlesantoli@hotmail.com>, 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 <carlesantoli@hotmail.com>, 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 ""

+ 142 - 0
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 <rs@techno-flex.de>, 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 <rs@techno-flex.de>, 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 ""

+ 124 - 0
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 <transbot@odoo-community.org>, 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 <transbot@odoo-community.org>, 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"

+ 142 - 0
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 <johntoro@gmail.com>, 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 <johntoro@gmail.com>, 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 ""

+ 125 - 0
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 <transbot@odoo-community.org>, 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 <transbot@odoo-community.org>, 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"

+ 142 - 0
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 <vulcano@uol.com.br>, 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 <vulcano@uol.com.br>, 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 ""

+ 127 - 0
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 <transbot@odoo-community.org>, 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 <transbot@odoo-community.org>, 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"

+ 10 - 0
models/__init__.py

@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# 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

BIN
models/__init__.pyc


+ 24 - 0
models/mail_mail.py

@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# 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

BIN
models/mail_mail.pyc


+ 16 - 0
models/mail_mail_statistics.py

@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# 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="Seguimiento de Emails", comodel_name='mail.tracking.email',
+        readonly=True)
+    tracking_event_ids = fields.One2many(
+        string="Eventos Emails", comodel_name='mail.tracking.event',
+        related='mail_tracking_id.tracking_event_ids', readonly=True)

BIN
models/mail_mail_statistics.pyc


+ 31 - 0
models/mail_mass_mailing.py

@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# 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="Evitar reenvío",
+        help="Evita el envío de este email dos veces "
+             "al mismo receptor o cliente")
+
+    @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(_(
+                    "No hay mas recipientes para enviar o 'Evitar Reenvio' "
+                    "Opcion Habilitada"))
+        return res_ids

BIN
models/mail_mass_mailing.pyc


+ 34 - 0
models/mail_mass_mailing_contact.py

@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# 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'
+
+    email_bounced = fields.Boolean(string="Email Rebotado")
+    email_score = fields.Float(
+        string="Puntuación de Email", readonly=True, store=False,
+        compute='_compute_email_score')
+
+    @api.multi
+    @api.depends('email')
+    def _compute_email_score(self):
+        for contact in self.filtered('email'):
+            contact.email_score = self.env['mail.tracking.email'].\
+                email_score_from_email(contact.email)
+
+    @api.multi
+    def email_bounced_set(self, tracking_email, reason):
+        return self.write({'email_bounced': True})
+
+    @api.multi
+    def write(self, vals):
+        email = vals.get('email')
+        if email is not None:
+            vals['email_bounced'] = (
+                bool(email) and
+                self.env['mail.tracking.email'].email_is_bounced(email))
+        return super(MailMassMailingContact, self).write(vals)

BIN
models/mail_mass_mailing_contact.pyc


+ 53 - 0
models/mail_tracking_email.py

@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# 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="Correo masivo", comodel_name='mail.mass_mailing', readonly=True)
+    mail_stats_id = fields.Many2one(
+        string="Mail - Estadisticas", 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):
+        """Inherit this method to link other object to mail.mail.statistics"""
+        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))
+        return tracking
+
+    @api.multi
+    def _contacts_email_bounced_set(self, reason):
+        for tracking_email in self:
+            self.env['mail.mass_mailing.contact'].search([
+                ('email', '=ilike', tracking_email.recipient_address)
+            ]).email_bounced_set(tracking_email, reason)
+
+    @api.multi
+    def smtp_error(self, mail_server, smtp_server, exception):
+        res = super(MailTrackingEmail, self).smtp_error(
+            mail_server, smtp_server, exception)
+        self._contacts_email_bounced_set('error')
+        return res
+
+    @api.multi
+    def event_create(self, event_type, metadata):
+        res = super(MailTrackingEmail, self).event_create(event_type, metadata)
+        if event_type in {'hard_bounce', 'spam', 'reject'}:
+            self._contacts_email_bounced_set(event_type)
+        return res

BIN
models/mail_tracking_email.pyc


+ 53 - 0
models/mail_tracking_event.py

@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from openerp import api, fields, models
+
+
+class MailTrackingEvent(models.Model):
+    _inherit = "mail.tracking.event"
+
+    mass_mailing_id = fields.Many2one(
+        string="Mass mailing", comodel_name='mail.mass_mailing', readonly=True,
+        related='tracking_email_id.mass_mailing_id', store=True)
+
+    @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

BIN
models/mail_tracking_event.pyc


BIN
static/description/icon.png


+ 5 - 0
tests/__init__.py

@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from . import test_mass_mailing

+ 131 - 0
tests/test_mass_mailing.py

@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import mock
+from openerp.tests.common import TransactionCase
+from openerp.exceptions import Warning as UserError
+
+mock_send_email = ('openerp.addons.base.ir.ir_mail_server.'
+                   'ir_mail_server.send_email')
+
+
+class TestMassMailing(TransactionCase):
+    def setUp(self, *args, **kwargs):
+        super(TestMassMailing, self).setUp(*args, **kwargs)
+        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': '<p>Test email body</p>',
+            '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_smtp_error(self):
+        with mock.patch(mock_send_email) as mock_func:
+            mock_func.side_effect = Warning('Test error')
+            self.mailing.send_mail()
+            for stat in self.mailing.statistics_ids:
+                if stat.mail_mail_id:
+                    stat.mail_mail_id.send()
+                tracking = self.env['mail.tracking.email'].search([
+                    ('mail_id_int', '=', stat.mail_mail_id_int),
+                ])
+                self.assertEqual('error', tracking.state)
+                self.assertEqual('Warning', tracking.error_type)
+                self.assertEqual('Test error', tracking.error_description)
+            self.assertTrue(self.contact_a.email_bounced)
+
+    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._tracking_email_bounce('hard_bounce', 'bounced')
+        self.assertTrue(self.contact_a.email_bounced)
+        self.assertTrue(self.contact_a.email_score < 50.0)
+        self.contact_a.email = 'other_contact_a@example.com'
+        self.assertFalse(self.contact_a.email_bounced)
+        self.assertTrue(self.contact_a.email_score == 50.0)
+        self.contact_a.email = 'contact_a@example.com'
+        self.assertTrue(self.contact_a.email_bounced)
+        self.assertTrue(self.contact_a.email_score < 50.0)

+ 35 - 0
views/mail_mail_statistics_view.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+     License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
+<openerp>
+<data>
+
+<record model="ir.ui.view" id="view_mail_mail_statistics_form">
+    <field name="name">Agregar Información de Seguimiento</field>
+    <field name="model">mail.mail.statistics</field>
+    <field name="inherit_id" ref="mass_mailing.view_mail_mail_statistics_form"/>
+    <field name="arch" type="xml">
+        <xpath expr="//form" position="inside">
+            <group>
+                <field name="mail_tracking_id" />
+            </group>
+            <label for="tracking_event_ids"/>
+            <div>
+                <field name="tracking_event_ids">
+                    <tree string="Tracking events" colors="grey:event_type in ('deferral');black:event_type in ('send');red:event_type in ('hard_bounce', 'soft_bounce', 'spam', 'reject');blue:event_type in ('unsub', 'click', 'open')">
+                        <field name="time"/>
+                        <field name="event_type"/>
+                        <field name="ip"/>
+                        <field name="url"/>
+                        <field name="user_country_id" string="Country"/>
+                        <field name="os_family" string="OS"/>
+                        <field name="ua_family" string="User agent"/>
+                    </tree>
+                </field>
+            </div>
+        </xpath>
+    </field>
+</record>
+
+</data>
+</openerp>

+ 32 - 0
views/mail_mass_mailing_contact_view.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+     License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
+<openerp>
+<data>
+
+<record model="ir.ui.view" id="view_mail_mass_mailing_contact_tree">
+    <field name="name">Añadir puntuación y estrellas</field>
+    <field name="model">mail.mass_mailing.contact</field>
+    <field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_contact_tree"/>
+    <field name="arch" type="xml">
+        <field name="opt_out" position="after">
+            <field name="email_bounced"/>
+            <field name="email_score" widget="progressbar"/>
+        </field>
+    </field>
+</record>
+
+<record model="ir.ui.view" id="view_mail_mass_mailing_contact_search">
+    <field name="name">Filtro de Contactos rebotados</field>
+    <field name="model">mail.mass_mailing.contact</field>
+    <field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_contact_search"/>
+    <field name="arch" type="xml">
+        <filter name="not_opt_out" position="after">
+            <filter string="Email bounced" name="email_bounced"
+                    domain="[('email_bounced', '=', True)]"/>
+        </filter>
+    </field>
+</record>
+
+</data>
+</openerp>

+ 46 - 0
views/mail_mass_mailing_view.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+     License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
+<openerp>
+<data>
+
+<record model="ir.ui.view" id="view_mail_mass_mailing_form">
+    <field name="name">Evitar reenvio</field>
+    <field name="model">mail.mass_mailing</field>
+    <field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_form"/>
+    <field name="arch" type="xml">
+        <field name="mass_mailing_campaign_id" position="before">
+            <field name="avoid_resend"/>
+        </field>
+    </field>
+</record>
+
+<record model="ir.actions.act_window" id="action_view_mail_tracking_email">
+    <field name="name">Seguimiento de Emails</field>
+    <field name="res_model">mail.tracking.email</field>
+    <field name="view_type">form</field>
+    <field name="view_mode">tree,form</field>
+    <field name="domain">[('mass_mailing_id', '!=', False)]</field>
+</record>
+
+<record model="ir.actions.act_window" id="action_view_mail_tracking_event">
+    <field name="name">Seguimiento de Eventos</field>
+    <field name="res_model">mail.tracking.event</field>
+    <field name="view_type">form</field>
+    <field name="view_mode">tree,form</field>
+    <field name="domain">[('mass_mailing_id', '!=', False)]</field>
+</record>
+
+<menuitem name="Seguimiento Emails" id="mail_tracking_menu"
+          parent="base.marketing_menu" sequence="50"/>
+
+<menuitem name="Emails" id="mail_tracking_email_menu"
+          parent="mail_tracking_menu" sequence="1"
+          action="action_view_mail_tracking_email"/>
+
+<menuitem name="Eventos" id="mail_tracking_event_menu"
+          parent="mail_tracking_menu" sequence="2"
+          action="action_view_mail_tracking_event"/>
+
+</data>
+</openerp>

+ 20 - 0
views/mail_tracking_email_view.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
+     License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
+<openerp>
+<data>
+
+<record model="ir.ui.view" id="view_mail_tracking_email_form">
+    <field name="name">Agregar Estadisticas y Campañas</field>
+    <field name="model">mail.tracking.email</field>
+    <field name="inherit_id" ref="mail_tracking.view_mail_tracking_email_form"/>
+    <field name="arch" type="xml">
+        <field name="date" position="after">
+            <field name="mass_mailing_id"/>
+            <field name="mail_stats_id"/>
+        </field>
+    </field>
+</record>
+
+</data>
+</openerp>