summaryrefslogtreecommitdiff
path: root/addons/mass_mailing/models
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2019-07-17 10:58:39 +0000
committerThibault Delavallée <tde@odoo.com>2019-07-17 15:50:33 +0000
commit772e1c0cc4e75cec971d2b4e1c820eb54872dc93 (patch)
tree30126a9fa9acabb9f75ab1d0665428180b9cc444 /addons/mass_mailing/models
parent2896aad34e797b6ca65a8efe3c5d71f31500a9a2 (diff)
[REF] mass_mailing: rename mail.mass_mailing.{.contact{_rel}, list{.merge}} models
PURPOSE Mass mailing is currently a bit messy. As SMS will be added as a way to notify people in mass through SMS let us take this opportunity to somehow clean this application: organization, light code cleaning, model renaming. SPECIFICATIONS Rename mail.mass_mailing.list and mail.mass_mailing.list to mailing.list and mailing.list.merge. Rename mail.mass_mailing.contact to mailing.contact. Rename mail.mailing_list.list_contact_rel to mailing.contact.subscription. Rationale : * those new names are easier to understand: mailing.list and mailing.contact are less mail-related, especially taking into account that SMS will allow to be less mail-oriented; * those names are easier to read / find / understand; * align wizard and sub-models naming with the main naming; * have a mailing as first part of namespacing; MIGRATION mail.mass_mailing.list model -> mailing.list mail.mass_mailing.list.merge model -> mailing.list.merge mail.mass_mailing.contact model -> mailing.contact mail.mass_mailing.list_contact_rel model -> mailing.contact.subscription mail_mass_mailing_contact_list_rel table -> mailing_contact_list_rel (specific case of a decorated m2m) fields updated (no column change) * mailing.list: subscription_contact_ids -> subscription_ids LINKS Task ID 2037906 Preparing task ID 1997464 (SMS addition in mass mailing) PR #34938
Diffstat (limited to 'addons/mass_mailing/models')
-rw-r--r--addons/mass_mailing/models/__init__.py4
-rw-r--r--addons/mass_mailing/models/mailing_contact.py (renamed from addons/mass_mailing/models/mass_mailing_contact.py)19
-rw-r--r--addons/mass_mailing/models/mailing_list.py (renamed from addons/mass_mailing/models/mass_mailing_list.py)28
-rw-r--r--addons/mass_mailing/models/mass_mailing.py24
4 files changed, 37 insertions, 38 deletions
diff --git a/addons/mass_mailing/models/__init__.py b/addons/mass_mailing/models/__init__.py
index d00a7590cf8..3caef695204 100644
--- a/addons/mass_mailing/models/__init__.py
+++ b/addons/mass_mailing/models/__init__.py
@@ -2,8 +2,8 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import link_tracker
-from . import mass_mailing_contact
-from . import mass_mailing_list
+from . import mailing_contact
+from . import mailing_list
from . import mass_mailing
from . import mailing_trace
from . import mail_mail
diff --git a/addons/mass_mailing/models/mass_mailing_contact.py b/addons/mass_mailing/models/mailing_contact.py
index 817c30830ac..966a5f29aaa 100644
--- a/addons/mass_mailing/models/mass_mailing_contact.py
+++ b/addons/mass_mailing/models/mailing_contact.py
@@ -9,13 +9,13 @@ class MassMailingContactListRel(models.Model):
""" Intermediate model between mass mailing list and mass mailing contact
Indicates if a contact is opted out for a particular list
"""
- _name = 'mail.mass_mailing.list_contact_rel'
+ _name = 'mailing.contact.subscription'
_description = 'Mass Mailing Subscription Information'
- _table = 'mail_mass_mailing_contact_list_rel'
+ _table = 'mailing_contact_list_rel'
_rec_name = 'contact_id'
- contact_id = fields.Many2one('mail.mass_mailing.contact', string='Contact', ondelete='cascade', required=True)
- list_id = fields.Many2one('mail.mass_mailing.list', string='Mailing List', ondelete='cascade', required=True)
+ contact_id = fields.Many2one('mailing.contact', string='Contact', ondelete='cascade', required=True)
+ list_id = fields.Many2one('mailing.list', string='Mailing List', ondelete='cascade', required=True)
opt_out = fields.Boolean(string='Opt Out',
help='The contact has chosen not to receive mails anymore from this list', default=False)
unsubscription_date = fields.Datetime(string='Unsubscription Date')
@@ -45,7 +45,7 @@ class MassMailingContactListRel(models.Model):
action = {
'name': _(contact_id.name),
'type': 'ir.actions.act_window',
- 'res_model': 'mail.mass_mailing.contact',
+ 'res_model': 'mailing.contact',
'view_mode': 'form',
'target': 'current',
'res_id': contact_id.id
@@ -58,7 +58,7 @@ class MassMailingContact(models.Model):
because it holds only some basic information: name, email. The purpose is to
be able to deal with large contact list to email without bloating the partner
base."""
- _name = 'mail.mass_mailing.contact'
+ _name = 'mailing.contact'
_inherit = ['mail.thread.blacklist']
_description = 'Mass Mailing Contact'
_order = 'email'
@@ -70,10 +70,9 @@ class MassMailingContact(models.Model):
email = fields.Char(required=True)
is_email_valid = fields.Boolean(compute='_compute_is_email_valid', store=True)
list_ids = fields.Many2many(
- 'mail.mass_mailing.list', 'mail_mass_mailing_contact_list_rel',
+ 'mailing.list', 'mailing_contact_list_rel',
'contact_id', 'list_id', string='Mailing Lists')
- subscription_list_ids = fields.One2many('mail.mass_mailing.list_contact_rel',
- 'contact_id', string='Subscription Information')
+ subscription_list_ids = fields.One2many('mailing.contact.subscription', 'contact_id', string='Subscription Information')
country_id = fields.Many2one('res.country', string='Country')
tag_ids = fields.Many2many('res.partner.category', string='Tags')
opt_out = fields.Boolean('Opt Out', compute='_compute_opt_out', search='_search_opt_out',
@@ -97,7 +96,7 @@ class MassMailingContact(models.Model):
if 'default_list_ids' in self._context and isinstance(self._context['default_list_ids'], (list, tuple)) and len(self._context['default_list_ids']) == 1:
[active_list_id] = self._context['default_list_ids']
- contacts = self.env['mail.mass_mailing.list_contact_rel'].search([('list_id', '=', active_list_id)])
+ contacts = self.env['mailing.contact.subscription'].search([('list_id', '=', active_list_id)])
return [('id', 'in', [record.contact_id.id for record in contacts if record.opt_out == value])]
else:
raise UserError('Search opt out cannot be executed without a unique and valid active mailing list context.')
diff --git a/addons/mass_mailing/models/mass_mailing_list.py b/addons/mass_mailing/models/mailing_list.py
index 48cde5784c3..ad78b7ad85f 100644
--- a/addons/mass_mailing/models/mass_mailing_list.py
+++ b/addons/mass_mailing/models/mailing_list.py
@@ -6,7 +6,7 @@ from odoo import api, fields, models
class MassMailingList(models.Model):
"""Model of a contact list. """
- _name = 'mail.mass_mailing.list'
+ _name = 'mailing.list'
_order = 'name'
_description = 'Mailing List'
@@ -14,9 +14,9 @@ class MassMailingList(models.Model):
active = fields.Boolean(default=True)
contact_nbr = fields.Integer(compute="_compute_contact_nbr", string='Number of Contacts')
contact_ids = fields.Many2many(
- 'mail.mass_mailing.contact', 'mail_mass_mailing_contact_list_rel', 'list_id', 'contact_id',
+ 'mailing.contact', 'mailing_contact_list_rel', 'list_id', 'contact_id',
string='Mailing Lists')
- subscription_contact_ids = fields.One2many('mail.mass_mailing.list_contact_rel', 'list_id',
+ subscription_ids = fields.One2many('mailing.contact.subscription', 'list_id',
string='Subscription Information')
is_public = fields.Boolean(default=True, help="The mailing list can be accessible by recipient in the unsubscription"
" page to allows him to update his subscription preferences.")
@@ -27,8 +27,8 @@ class MassMailingList(models.Model):
select
list_id, count(*)
from
- mail_mass_mailing_contact_list_rel r
- left join mail_mass_mailing_contact c on (r.contact_id=c.id)
+ mailing_contact_list_rel r
+ left join mailing_contact c on (r.contact_id=c.id)
left join mail_blacklist bl on c.email_normalized = bl.email and bl.active
where
list_id in %s
@@ -73,30 +73,30 @@ class MassMailingList(models.Model):
# Put destination is sources lists if not already the case
src_lists |= self
self.env.cr.execute("""
- INSERT INTO mail_mass_mailing_contact_list_rel (contact_id, list_id)
+ INSERT INTO mailing_contact_list_rel (contact_id, list_id)
SELECT st.contact_id AS contact_id, %s AS list_id
FROM
(
SELECT
contact.id AS contact_id,
contact.email AS email,
- mailing_list.id AS list_id,
+ list.id AS list_id,
row_number() OVER (PARTITION BY email ORDER BY email) AS rn
FROM
- mail_mass_mailing_contact contact,
- mail_mass_mailing_contact_list_rel contact_list_rel,
- mail_mass_mailing_list mailing_list
+ mailing_contact contact,
+ mailing_contact_list_rel contact_list_rel,
+ mailing_list list
WHERE contact.id=contact_list_rel.contact_id
AND COALESCE(contact_list_rel.opt_out,FALSE) = FALSE
AND contact.email_normalized NOT IN (select email from mail_blacklist where active = TRUE)
- AND mailing_list.id=contact_list_rel.list_id
- AND mailing_list.id IN %s
+ AND list.id=contact_list_rel.list_id
+ AND list.id IN %s
AND NOT EXISTS
(
SELECT 1
FROM
- mail_mass_mailing_contact contact2,
- mail_mass_mailing_contact_list_rel contact_list_rel2
+ mailing_contact contact2,
+ mailing_contact_list_rel contact_list_rel2
WHERE contact2.email = contact.email
AND contact_list_rel2.contact_id = contact2.id
AND contact_list_rel2.list_id = %s
diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py
index d0249777baf..29493baa4e8 100644
--- a/addons/mass_mailing/models/mass_mailing.py
+++ b/addons/mass_mailing/models/mass_mailing.py
@@ -24,8 +24,8 @@ MASS_MAILING_BUSINESS_MODELS = [
'res.partner',
'event.track',
'sale.order',
- 'mail.mass_mailing.list',
- 'mail.mass_mailing.contact'
+ 'mailing.list',
+ 'mailing.contact'
]
# Syntax of the data URL Scheme: https://tools.ietf.org/html/rfc2397#section-3
@@ -205,7 +205,7 @@ class MassMailing(models.Model):
def default_get(self, fields):
res = super(MassMailing, self).default_get(fields)
if 'reply_to_mode' in fields and not 'reply_to_mode' in res and res.get('mailing_model_real'):
- if res['mailing_model_real'] in ['res.partner', 'mail.mass_mailing.contact']:
+ if res['mailing_model_real'] in ['res.partner', 'mailing.contact']:
res['reply_to_mode'] = 'email'
else:
res['reply_to_mode'] = 'thread'
@@ -240,15 +240,15 @@ class MassMailing(models.Model):
reply_to = fields.Char(string='Reply To', help='Preferred Reply-To Address',
default=lambda self: self.env['mail.message']._get_default_from())
# recipients
- mailing_model_real = fields.Char(compute='_compute_model', string='Recipients Real Model', default='mail.mass_mailing.contact', required=True)
+ mailing_model_real = fields.Char(compute='_compute_model', string='Recipients Real Model', default='mailing.contact', required=True)
mailing_model_id = fields.Many2one('ir.model', string='Recipients Model', domain=[('model', 'in', MASS_MAILING_BUSINESS_MODELS)],
- default=lambda self: self.env.ref('mass_mailing.model_mail_mass_mailing_list').id)
+ default=lambda self: self.env.ref('mass_mailing.model_mailing_list').id)
mailing_model_name = fields.Char(related='mailing_model_id.model', string='Recipients Model Name', readonly=True, related_sudo=True)
mailing_domain = fields.Char(string='Domain', oldname='domain', default=[])
mail_server_id = fields.Many2one('ir.mail_server', string='Mail Server',
default=_get_default_mail_server_id,
help="Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.")
- contact_list_ids = fields.Many2many('mail.mass_mailing.list', 'mail_mass_mailing_list_rel',
+ contact_list_ids = fields.Many2many('mailing.list', 'mail_mass_mailing_list_rel',
string='Mailing Lists')
contact_ab_pc = fields.Integer(string='A/B Testing percentage',
help='Percentage of the contacts that will be mailed. Recipients will be taken randomly.', default=100)
@@ -292,7 +292,7 @@ class MassMailing(models.Model):
@api.depends('mailing_model_id')
def _compute_model(self):
for record in self:
- record.mailing_model_real = (record.mailing_model_name != 'mail.mass_mailing.list') and record.mailing_model_name or 'mail.mass_mailing.contact'
+ record.mailing_model_real = (record.mailing_model_name != 'mailing.list') and record.mailing_model_name or 'mailing.contact'
def _compute_statistics(self):
""" Compute statistics of the mass mailing """
@@ -349,7 +349,7 @@ class MassMailing(models.Model):
def _onchange_model_and_list(self):
mailing_domain = []
if self.mailing_model_name:
- if self.mailing_model_name == 'mail.mass_mailing.list':
+ if self.mailing_model_name == 'mailing.list':
if self.contact_list_ids:
mailing_domain.append(('list_ids', 'in', self.contact_list_ids.ids))
else:
@@ -488,9 +488,9 @@ class MassMailing(models.Model):
def update_opt_out(self, email, list_ids, value):
if len(list_ids) > 0:
- model = self.env['mail.mass_mailing.contact'].with_context(active_test=False)
+ model = self.env['mailing.contact'].with_context(active_test=False)
records = model.search([('email_normalized', '=', tools.email_normalize(email))])
- opt_out_records = self.env['mail.mass_mailing.list_contact_rel'].search([
+ opt_out_records = self.env['mailing.contact.subscription'].search([
('contact_id', 'in', records.ids),
('list_id', 'in', list_ids),
('opt_out', '!=', value)
@@ -514,11 +514,11 @@ class MassMailing(models.Model):
self.ensure_one()
opt_out = {}
target = self.env[self.mailing_model_real]
- if self.mailing_model_real == "mail.mass_mailing.contact":
+ if self.mailing_model_real == "mailing.contact":
# if user is opt_out on One list but not on another
# or if two user with same email address, one opted in and the other one opted out, send the mail anyway
# TODO DBE Fixme : Optimise the following to get real opt_out and opt_in
- target_list_contacts = self.env['mail.mass_mailing.list_contact_rel'].search(
+ target_list_contacts = self.env['mailing.contact.subscription'].search(
[('list_id', 'in', self.contact_list_ids.ids)])
opt_out_contacts = target_list_contacts.filtered(lambda rel: rel.opt_out).mapped('contact_id.email_normalized')
opt_in_contacts = target_list_contacts.filtered(lambda rel: not rel.opt_out).mapped('contact_id.email_normalized')