mirror of https://github.com/OCA/social.git
[MIG] mail_tracking_mass_mailing: Migration to 13.0
* Change references to mail_mail_statistics model with mail_trace * Change references to mail.mass_mailing model with mailing.mailing * Change reference to statistics_ids field with mailing_trace_ids * Change reference to send_mail method with action_send_mail * Replace mailing.mailing name for required subject field * fix view reference not_blacklisted with filter_not_email_bl * fix not-stored compute, set value for all the recordspull/550/head
parent
d3426a13d5
commit
2c2ead4486
|
@ -7,7 +7,7 @@
|
||||||
{
|
{
|
||||||
"name": "Mail tracking for mass mailing",
|
"name": "Mail tracking for mass mailing",
|
||||||
"summary": "Improve mass mailing email tracking",
|
"summary": "Improve mass mailing email tracking",
|
||||||
"version": "12.0.1.0.0",
|
"version": "13.0.1.0.0",
|
||||||
"category": "Social Network",
|
"category": "Social Network",
|
||||||
"website": "https://github.com/OCA/social",
|
"website": "https://github.com/OCA/social",
|
||||||
"author": "Tecnativa, " "Odoo Community Association (OCA)",
|
"author": "Tecnativa, " "Odoo Community Association (OCA)",
|
||||||
|
@ -18,9 +18,9 @@
|
||||||
"depends": ["mass_mailing", "mail_tracking"],
|
"depends": ["mass_mailing", "mail_tracking"],
|
||||||
"data": [
|
"data": [
|
||||||
"views/mail_tracking_email_view.xml",
|
"views/mail_tracking_email_view.xml",
|
||||||
"views/mail_mail_statistics_view.xml",
|
"views/mail_trace_view.xml",
|
||||||
"views/mail_mass_mailing_view.xml",
|
"views/mail_mass_mailing_view.xml",
|
||||||
"views/mail_mass_mailing_contact_view.xml",
|
"views/mailing_contact_view.xml",
|
||||||
],
|
],
|
||||||
"pre_init_hook": "pre_init_hook",
|
"pre_init_hook": "pre_init_hook",
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ _logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def pre_init_hook(cr):
|
def pre_init_hook(cr):
|
||||||
if column_add_with_value:
|
if column_add_with_value:
|
||||||
_logger.info("Creating mail.mass_mailing.contact.email_score column " "with value 50.0")
|
_logger.info("Creating mailing_contact.email_score column " "with value 50.0")
|
||||||
column_add_with_value(
|
column_add_with_value(
|
||||||
cr, "mail_mass_mailing_contact", "email_score", "double precision", 50.0
|
cr, "mailing_contact", "email_score", "double precision", 50.0
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,5 +5,5 @@
|
||||||
from . import mail_mail
|
from . import mail_mail
|
||||||
from . import mail_tracking_email
|
from . import mail_tracking_email
|
||||||
from . import mail_tracking_event
|
from . import mail_tracking_event
|
||||||
from . import mail_mail_statistics
|
from . import mailing_trace
|
||||||
from . import mail_mass_mailing_contact
|
from . import mailing_contact
|
||||||
|
|
|
@ -14,7 +14,7 @@ class MailMail(models.Model):
|
||||||
res["mail_id_int"] = self.id
|
res["mail_id_int"] = self.id
|
||||||
res["mass_mailing_id"] = self.mailing_id.id
|
res["mass_mailing_id"] = self.mailing_id.id
|
||||||
res["mail_stats_id"] = (
|
res["mail_stats_id"] = (
|
||||||
self.statistics_ids[:1].id if self.statistics_ids else False
|
self.mailing_trace_ids[:1].id if self.mailing_trace_ids else False
|
||||||
)
|
)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
|
@ -9,16 +9,16 @@ class MailTrackingEmail(models.Model):
|
||||||
_inherit = "mail.tracking.email"
|
_inherit = "mail.tracking.email"
|
||||||
|
|
||||||
mass_mailing_id = fields.Many2one(
|
mass_mailing_id = fields.Many2one(
|
||||||
string="Mass mailing", comodel_name="mail.mass_mailing", readonly=True
|
string="Mass mailing", comodel_name="mailing.mailing", readonly=True
|
||||||
)
|
)
|
||||||
mail_stats_id = fields.Many2one(
|
mail_stats_id = fields.Many2one(
|
||||||
string="Mail statistics", comodel_name="mail.mail.statistics", readonly=True
|
string="Mail statistics", comodel_name="mailing.trace", readonly=True
|
||||||
)
|
)
|
||||||
mail_id_int = fields.Integer(string="Mail ID", readonly=True)
|
mail_id_int = fields.Integer(string="Mail ID", readonly=True)
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _statistics_link_prepare(self, tracking):
|
def _statistics_link_prepare(self, tracking):
|
||||||
"""Inherit this method to link other object to mail.mail.statistics"""
|
"""Inherit this method to link other object to mailing.trace"""
|
||||||
return {"mail_tracking_id": tracking.id}
|
return {"mail_tracking_id": tracking.id}
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
|
@ -29,7 +29,6 @@ class MailTrackingEmail(models.Model):
|
||||||
tracking.mail_stats_id.write(self._statistics_link_prepare(tracking))
|
tracking.mail_stats_id.write(self._statistics_link_prepare(tracking))
|
||||||
return tracking
|
return tracking
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def _contacts_email_bounced_set(self, reason, event=None):
|
def _contacts_email_bounced_set(self, reason, event=None):
|
||||||
recipients = []
|
recipients = []
|
||||||
if event and event.recipient_address:
|
if event and event.recipient_address:
|
||||||
|
@ -37,11 +36,10 @@ class MailTrackingEmail(models.Model):
|
||||||
else:
|
else:
|
||||||
recipients = list(filter(None, self.mapped("recipient_address")))
|
recipients = list(filter(None, self.mapped("recipient_address")))
|
||||||
for recipient in recipients:
|
for recipient in recipients:
|
||||||
self.env["mail.mass_mailing.contact"].search(
|
self.env["mailing.contact"].search(
|
||||||
[("email", "=ilike", recipient)]
|
[("email", "=ilike", recipient)]
|
||||||
).email_bounced_set(self, reason, event=event)
|
).email_bounced_set(self, reason, event=event)
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def smtp_error(self, mail_server, smtp_server, exception):
|
def smtp_error(self, mail_server, smtp_server, exception):
|
||||||
res = super(MailTrackingEmail, self).smtp_error(
|
res = super(MailTrackingEmail, self).smtp_error(
|
||||||
mail_server, smtp_server, exception
|
mail_server, smtp_server, exception
|
||||||
|
@ -49,7 +47,6 @@ class MailTrackingEmail(models.Model):
|
||||||
self._contacts_email_bounced_set("error")
|
self._contacts_email_bounced_set("error")
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def event_create(self, event_type, metadata):
|
def event_create(self, event_type, metadata):
|
||||||
res = super(MailTrackingEmail, self).event_create(event_type, metadata)
|
res = super(MailTrackingEmail, self).event_create(event_type, metadata)
|
||||||
if event_type in {"hard_bounce", "spam", "reject"}:
|
if event_type in {"hard_bounce", "spam", "reject"}:
|
||||||
|
|
|
@ -10,7 +10,7 @@ class MailTrackingEvent(models.Model):
|
||||||
|
|
||||||
mass_mailing_id = fields.Many2one(
|
mass_mailing_id = fields.Many2one(
|
||||||
string="Mass mailing",
|
string="Mass mailing",
|
||||||
comodel_name="mail.mass_mailing",
|
comodel_name="mailing.mailing",
|
||||||
readonly=True,
|
readonly=True,
|
||||||
related="tracking_email_id.mass_mailing_id",
|
related="tracking_email_id.mass_mailing_id",
|
||||||
store=True,
|
store=True,
|
||||||
|
@ -19,12 +19,12 @@ class MailTrackingEvent(models.Model):
|
||||||
@api.model
|
@api.model
|
||||||
def process_open(self, tracking_email, metadata):
|
def process_open(self, tracking_email, metadata):
|
||||||
res = super(MailTrackingEvent, self).process_open(tracking_email, metadata)
|
res = super(MailTrackingEvent, self).process_open(tracking_email, metadata)
|
||||||
mail_mail_stats = self.sudo().env["mail.mail.statistics"]
|
mail_mail_stats = self.sudo().env["mailing.trace"]
|
||||||
mail_mail_stats.set_opened(mail_mail_ids=[tracking_email.mail_id_int])
|
mail_mail_stats.set_opened(mail_mail_ids=[tracking_email.mail_id_int])
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _tracking_set_bounce(self, tracking_email, metadata):
|
def _tracking_set_bounce(self, tracking_email, metadata):
|
||||||
mail_mail_stats = self.sudo().env["mail.mail.statistics"]
|
mail_mail_stats = self.sudo().env["mailing.trace"]
|
||||||
mail_mail_stats.set_bounced(mail_mail_ids=[tracking_email.mail_id_int])
|
mail_mail_stats.set_bounced(mail_mail_ids=[tracking_email.mail_id_int])
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
|
|
|
@ -6,17 +6,19 @@ from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
class MailMassMailingContact(models.Model):
|
class MailMassMailingContact(models.Model):
|
||||||
_name = "mail.mass_mailing.contact"
|
_name = "mailing.contact"
|
||||||
_inherit = ["mail.mass_mailing.contact", "mail.bounced.mixin"]
|
_inherit = ["mailing.contact", "mail.bounced.mixin"]
|
||||||
|
|
||||||
email_score = fields.Float(
|
email_score = fields.Float(
|
||||||
string="Email score", readonly=True, store=False, compute="_compute_email_score"
|
string="Email score", readonly=True, store=False, compute="_compute_email_score"
|
||||||
)
|
)
|
||||||
|
|
||||||
@api.multi
|
|
||||||
@api.depends("email")
|
@api.depends("email")
|
||||||
def _compute_email_score(self):
|
def _compute_email_score(self):
|
||||||
for contact in self.filtered("email"):
|
with_email = self.filtered("email")
|
||||||
|
for contact in with_email:
|
||||||
contact.email_score = self.env[
|
contact.email_score = self.env[
|
||||||
"mail.tracking.email"
|
"mail.tracking.email"
|
||||||
].email_score_from_email(contact.email)
|
].email_score_from_email(contact.email)
|
||||||
|
remaining = self - with_email
|
||||||
|
remaining.email_score = 0.0
|
|
@ -5,8 +5,8 @@
|
||||||
from odoo import fields, models
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
class MailMailStatistics(models.Model):
|
class MailTrace(models.Model):
|
||||||
_inherit = "mail.mail.statistics"
|
_inherit = "mailing.trace"
|
||||||
|
|
||||||
mail_tracking_id = fields.Many2one(
|
mail_tracking_id = fields.Many2one(
|
||||||
string="Mail tracking", comodel_name="mail.tracking.email", readonly=True
|
string="Mail tracking", comodel_name="mail.tracking.email", readonly=True
|
|
@ -17,21 +17,21 @@ mock_send_email = "odoo.addons.base.models.ir_mail_server." "IrMailServer.send_e
|
||||||
class TestMassMailing(TransactionCase):
|
class TestMassMailing(TransactionCase):
|
||||||
def setUp(self, *args, **kwargs):
|
def setUp(self, *args, **kwargs):
|
||||||
super(TestMassMailing, self).setUp(*args, **kwargs)
|
super(TestMassMailing, self).setUp(*args, **kwargs)
|
||||||
self.list = self.env["mail.mass_mailing.list"].create({"name": "Test mail tracking"})
|
self.list = self.env["mailing.list"].create({"name": "Test mail tracking"})
|
||||||
self.list.name = "{} #{}".format(self.list.name, self.list.id)
|
self.list.name = "{} #{}".format(self.list.name, self.list.id)
|
||||||
self.contact_a = self.env["mail.mass_mailing.contact"].create(
|
self.contact_a = self.env["mailing.contact"].create(
|
||||||
{
|
{
|
||||||
"list_ids": [(6, 0, self.list.ids)],
|
"list_ids": [(6, 0, self.list.ids)],
|
||||||
"name": "Test contact A",
|
"name": "Test contact A",
|
||||||
"email": "contact_a@example.com",
|
"email": "contact_a@example.com",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.mailing = self.env["mail.mass_mailing"].create(
|
self.mailing = self.env["mailing.mailing"].create(
|
||||||
{
|
{
|
||||||
"name": "Test subject",
|
"subject": "Test subject",
|
||||||
"email_from": "from@example.com",
|
"email_from": "from@example.com",
|
||||||
"mailing_model_id": self.env.ref(
|
"mailing_model_id": self.env.ref(
|
||||||
"mass_mailing.model_mail_mass_mailing_contact"
|
"mass_mailing.model_mailing_contact"
|
||||||
).id,
|
).id,
|
||||||
"mailing_domain": "[('list_ids', 'in', %d)]" % self.list.id,
|
"mailing_domain": "[('list_ids', 'in', %d)]" % self.list.id,
|
||||||
"contact_list_ids": [(6, False, [self.list.id])],
|
"contact_list_ids": [(6, False, [self.list.id])],
|
||||||
|
@ -44,8 +44,8 @@ class TestMassMailing(TransactionCase):
|
||||||
def test_smtp_error(self):
|
def test_smtp_error(self):
|
||||||
with mock.patch(mock_send_email) as mock_func:
|
with mock.patch(mock_send_email) as mock_func:
|
||||||
mock_func.side_effect = Warning("Mock test error")
|
mock_func.side_effect = Warning("Mock test error")
|
||||||
self.mailing.send_mail()
|
self.mailing.action_send_mail()
|
||||||
for stat in self.mailing.statistics_ids:
|
for stat in self.mailing.mailing_trace_ids:
|
||||||
if stat.mail_mail_id:
|
if stat.mail_mail_id:
|
||||||
stat.mail_mail_id.send()
|
stat.mail_mail_id.send()
|
||||||
tracking = self.env["mail.tracking.email"].search(
|
tracking = self.env["mail.tracking.email"].search(
|
||||||
|
@ -58,8 +58,8 @@ class TestMassMailing(TransactionCase):
|
||||||
self.assertTrue(self.contact_a.email_bounced)
|
self.assertTrue(self.contact_a.email_bounced)
|
||||||
|
|
||||||
def test_tracking_email_link(self):
|
def test_tracking_email_link(self):
|
||||||
self.mailing.send_mail()
|
self.mailing.action_send_mail()
|
||||||
for stat in self.mailing.statistics_ids:
|
for stat in self.mailing.mailing_trace_ids:
|
||||||
if stat.mail_mail_id:
|
if stat.mail_mail_id:
|
||||||
stat.mail_mail_id.send()
|
stat.mail_mail_id.send()
|
||||||
tracking_email = self.env["mail.tracking.email"].search(
|
tracking_email = self.env["mail.tracking.email"].search(
|
||||||
|
@ -80,8 +80,8 @@ class TestMassMailing(TransactionCase):
|
||||||
self.assertTrue(stat.opened)
|
self.assertTrue(stat.opened)
|
||||||
|
|
||||||
def _tracking_email_bounce(self, event_type, state):
|
def _tracking_email_bounce(self, event_type, state):
|
||||||
self.mailing.send_mail()
|
self.mailing.action_send_mail()
|
||||||
for stat in self.mailing.statistics_ids:
|
for stat in self.mailing.mailing_trace_ids:
|
||||||
if stat.mail_mail_id:
|
if stat.mail_mail_id:
|
||||||
stat.mail_mail_id.send()
|
stat.mail_mail_id.send()
|
||||||
tracking_email = self.env["mail.tracking.email"].search(
|
tracking_email = self.env["mail.tracking.email"].search(
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
<record model="ir.actions.act_window" id="action_view_mail_tracking_email">
|
<record model="ir.actions.act_window" id="action_view_mail_tracking_email">
|
||||||
<field name="name">Mail tracking emails</field>
|
<field name="name">Mail tracking emails</field>
|
||||||
<field name="res_model">mail.tracking.email</field>
|
<field name="res_model">mail.tracking.email</field>
|
||||||
<field name="view_type">form</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
<field name="domain">[('mass_mailing_id', '!=', False)]</field>
|
<field name="domain">[('mass_mailing_id', '!=', False)]</field>
|
||||||
</record>
|
</record>
|
||||||
|
@ -16,7 +15,6 @@
|
||||||
<record model="ir.actions.act_window" id="action_view_mail_tracking_event">
|
<record model="ir.actions.act_window" id="action_view_mail_tracking_event">
|
||||||
<field name="name">Mail tracking events</field>
|
<field name="name">Mail tracking events</field>
|
||||||
<field name="res_model">mail.tracking.event</field>
|
<field name="res_model">mail.tracking.event</field>
|
||||||
<field name="view_type">form</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
<field name="domain">[('mass_mailing_id', '!=', False)]</field>
|
<field name="domain">[('mass_mailing_id', '!=', False)]</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="view_mail_mail_statistics_form">
|
<record model="ir.ui.view" id="mailing_trace_view_form">
|
||||||
<field name="name">Add tracking email info</field>
|
<field name="name">Add tracking email info</field>
|
||||||
<field name="model">mail.mail.statistics</field>
|
<field name="model">mailing.trace</field>
|
||||||
<field name="inherit_id" ref="mass_mailing.view_mail_mail_statistics_form"/>
|
<field name="inherit_id" ref="mass_mailing.mailing_trace_view_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//form/sheet" position="inside">
|
<xpath expr="//form/sheet" position="inside">
|
||||||
<group>
|
<group>
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
<record model="ir.ui.view" id="view_mail_mass_mailing_contact_tree">
|
<record model="ir.ui.view" id="view_mail_mass_mailing_contact_tree">
|
||||||
<field name="name">Add email score and stars</field>
|
<field name="name">Add email score and stars</field>
|
||||||
<field name="model">mail.mass_mailing.contact</field>
|
<field name="model">mailing.contact</field>
|
||||||
<field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_contact_tree"/>
|
<field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_contact_tree"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="is_blacklisted" position="after">
|
<field name="is_blacklisted" position="after">
|
||||||
|
@ -18,10 +18,10 @@
|
||||||
|
|
||||||
<record model="ir.ui.view" id="view_mail_mass_mailing_contact_search">
|
<record model="ir.ui.view" id="view_mail_mass_mailing_contact_search">
|
||||||
<field name="name">Filter bounced contacts</field>
|
<field name="name">Filter bounced contacts</field>
|
||||||
<field name="model">mail.mass_mailing.contact</field>
|
<field name="model">mailing.contact</field>
|
||||||
<field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_contact_search"/>
|
<field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_contact_search"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<filter name="not_blacklisted" position="after">
|
<filter name="filter_not_email_bl" position="after">
|
||||||
<filter string="Email bounced" name="email_bounced"
|
<filter string="Email bounced" name="email_bounced"
|
||||||
domain="[('email_bounced', '=', True)]"/>
|
domain="[('email_bounced', '=', True)]"/>
|
||||||
</filter>
|
</filter>
|
Loading…
Reference in New Issue