[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 records
pull/550/head
Katherine Zaoral 2020-06-09 10:10:35 -03:00
parent d3426a13d5
commit 2c2ead4486
12 changed files with 40 additions and 43 deletions

View File

@ -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",
} }

View File

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

View File

@ -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

View File

@ -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

View File

@ -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"}:

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(

View File

@ -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>

View File

@ -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>

View File

@ -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>