diff options
| author | Thibault Delavallée <tde@odoo.com> | 2019-07-17 10:58:39 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2019-07-17 15:50:33 +0000 |
| commit | 772e1c0cc4e75cec971d2b4e1c820eb54872dc93 (patch) | |
| tree | 30126a9fa9acabb9f75ab1d0665428180b9cc444 /addons/mass_mailing/models | |
| parent | 2896aad34e797b6ca65a8efe3c5d71f31500a9a2 (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__.py | 4 | ||||
| -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.py | 24 |
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') |
