[REF] mass_mailing: rename subscription model

PURPOSE

Overall cleaning of subscription and exclusion management code from portal.
This code comes mainly from v12 and can now benefit from cleaning and update.

SPECIFICATIONS

In this commit we rename ``mailing.contact.subscription`` model into the
shorter ``mailing.subscription``. This is sufficient to explain the model
purpose. As we plan to add an opt-out model this also allows to have sub
models with suffixes without being too long.

We also rename ``subscription_list_ids`` field on contact model to
``subscription_ids`` as this is shorter and clearer.

Finally the ``mailing_contact_list_rel`` table name that comes from old
implementations (simple m2m table) is renamed to ``mailing_subscription``
to match the model name.

Task-2669037 (Mass Mailing: Refactor js/portal for subscription)

Part-of: odoo/odoo#86084
This commit is contained in:
Thibault Delavallée
2023-10-06 06:13:53 +00:00
parent d27797dd9b
commit b897571b9f
19 changed files with 82 additions and 82 deletions
+3 -3
View File
@@ -28,7 +28,7 @@
'data/ir_module_data.xml',
'data/mailing_data_templates.xml',
'data/mailing_list_contact.xml',
'data/mailing_contact_subscription.xml',
'data/mailing_subscription.xml',
'data/res_users_data.xml',
'wizard/mail_compose_message_views.xml',
'wizard/mailing_contact_import_views.xml',
@@ -41,9 +41,9 @@
'views/mailing_trace_views.xml',
'views/link_tracker_views.xml',
'views/mailing_contact_views.xml',
'views/mailing_contact_subscription_views.xml',
'views/mailing_list_views.xml',
'views/mailing_mailing_views.xml',
'views/mailing_subscription_views.xml',
'views/res_config_settings_views.xml',
'views/utm_campaign_views.xml',
'views/mailing_menus.xml',
@@ -82,7 +82,7 @@
'demo': [
'demo/utm.xml',
'demo/mailing_list_contact.xml',
'demo/mailing_contact_subscription.xml',
'demo/mailing_subscription.xml',
'demo/mailing_mailing.xml',
'demo/mailing_trace.xml',
],
+4 -4
View File
@@ -152,10 +152,10 @@ class MassMailController(http.Controller):
# as there may be several contacts / email -> consider any opt-in overrides
# opt-out
contacts = self._fetch_contacts(email)
lists_optin = contacts.subscription_list_ids.filtered(
lists_optin = contacts.subscription_ids.filtered(
lambda sub: not sub.opt_out
).list_id
lists_optout = contacts.subscription_list_ids.filtered(
lists_optout = contacts.subscription_ids.filtered(
lambda sub: sub.opt_out and sub.list_id not in lists_optin
).list_id
lists_public = request.env['mailing.list'].sudo().search(
@@ -188,7 +188,7 @@ class MassMailController(http.Controller):
'is_blocklisted': mail_blocklist.active if mail_blocklist else False,
# mailing lists
'contacts': contacts,
'lists_contacts': contacts.subscription_list_ids.list_id,
'lists_contacts': contacts.subscription_ids.list_id,
'lists_optin': lists_optin,
'lists_optout': lists_optout,
'lists_public': lists_public,
@@ -212,7 +212,7 @@ class MassMailController(http.Controller):
contacts = self._fetch_contacts(email_found)
lists_optin = request.env['mailing.list'].sudo().browse(lists_optin_ids or []).exists()
# opt-out all not chosen lists
lists_to_optout = contacts.subscription_list_ids.filtered(
lists_to_optout = contacts.subscription_ids.filtered(
lambda sub: not sub.opt_out and sub.list_id not in lists_optin
).list_id
# opt-in in either already member, either public (to avoid trying to opt-in
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="mailing_list_data_sub_contact_0" model="mailing.contact.subscription">
<record id="mailing_list_data_sub_contact_0" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_0"/>
<field name="list_id" ref="mass_mailing.mailing_list_data"/>
</record>
@@ -2,38 +2,38 @@
<odoo>
<data noupdate="1">
<!-- Subscription to 'mailing_list_data' -->
<record id="mailing_list_data_sub_contact_1" model="mailing.contact.subscription">
<record id="mailing_list_data_sub_contact_1" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_1"/>
<field name="list_id" ref="mass_mailing.mailing_list_data"/>
</record>
<record id="mailing_list_data_sub_contact_2" model="mailing.contact.subscription">
<record id="mailing_list_data_sub_contact_2" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_2"/>
<field name="list_id" ref="mass_mailing.mailing_list_data"/>
</record>
<record id="mailing_list_data_sub_contact_3" model="mailing.contact.subscription">
<record id="mailing_list_data_sub_contact_3" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_3"/>
<field name="list_id" ref="mass_mailing.mailing_list_data"/>
</record>
<record id="mailing_list_data_sub_contact_4" model="mailing.contact.subscription">
<record id="mailing_list_data_sub_contact_4" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_4"/>
<field name="list_id" ref="mass_mailing.mailing_list_data"/>
<field name="opt_out">True</field>
</record>
<record id="mailing_list_data_sub_contact_5" model="mailing.contact.subscription">
<record id="mailing_list_data_sub_contact_5" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_5"/>
<field name="list_id" ref="mass_mailing.mailing_list_data"/>
</record>
<record id="mailing_list_data_sub_contact_6" model="mailing.contact.subscription">
<record id="mailing_list_data_sub_contact_6" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_6"/>
<field name="list_id" ref="mass_mailing.mailing_list_data"/>
<field name="opt_out">True</field>
</record>
<!-- Subscription to 'mailing_list_1' -->
<record id="mailing_list_1_sub_contact_3" model="mailing.contact.subscription">
<record id="mailing_list_1_sub_contact_3" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_3"/>
<field name="list_id" ref="mass_mailing.mailing_list_1"/>
</record>
<record id="mailing_list_1_sub_contact_6" model="mailing.contact.subscription">
<record id="mailing_list_1_sub_contact_6" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing.mass_mail_contact_6"/>
<field name="list_id" ref="mass_mailing.mailing_list_1"/>
</record>
+1 -1
View File
@@ -4,7 +4,7 @@
from . import ir_mail_server
from . import ir_model
from . import link_tracker
from . import mailing_contact_subscription
from . import mailing_subscription # keep before due to decorated m2m
from . import mailing_contact
from . import mailing_list
from . import mailing_trace
+1 -1
View File
@@ -749,7 +749,7 @@ class MassMailing(models.Model):
if self.contact_list_ids:
action['context'] = {
'default_mailing_list_ids': self.contact_list_ids[0].ids,
'default_subscription_list_ids': [(0, 0, {'list_id': self.contact_list_ids[0].id})],
'default_subscription_ids': [(0, 0, {'list_id': self.contact_list_ids[0].id})],
}
action['domain'] = [('list_ids', 'in', self.contact_list_ids.ids)]
return action
+14 -14
View File
@@ -19,13 +19,13 @@ class MassMailingContact(models.Model):
def default_get(self, fields_list):
""" When coming from a mailing list we may have a default_list_ids context
key. We should use it to create subscription_list_ids default value that
key. We should use it to create subscription_ids default value that
are displayed to the user as list_ids is not displayed on form view. """
res = super(MassMailingContact, self).default_get(fields_list)
if 'subscription_list_ids' in fields_list and not res.get('subscription_list_ids'):
if 'subscription_ids' in fields_list and not res.get('subscription_ids'):
list_ids = self.env.context.get('default_list_ids')
if 'default_list_ids' not in res and list_ids and isinstance(list_ids, (list, tuple)):
res['subscription_list_ids'] = [
res['subscription_ids'] = [
(0, 0, {'list_id': list_id}) for list_id in list_ids]
return res
@@ -34,10 +34,10 @@ class MassMailingContact(models.Model):
title_id = fields.Many2one('res.partner.title', string='Title')
email = fields.Char('Email')
list_ids = fields.Many2many(
'mailing.list', 'mailing_contact_list_rel',
'mailing.list', 'mailing_subscription',
'contact_id', 'list_id', string='Mailing Lists')
subscription_list_ids = fields.One2many(
'mailing.contact.subscription', 'contact_id', string='Subscription Information')
subscription_ids = fields.One2many(
'mailing.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(
@@ -57,17 +57,17 @@ 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['mailing.contact.subscription'].search([('list_id', '=', active_list_id)])
contacts = self.env['mailing.subscription'].search([('list_id', '=', active_list_id)])
return [('id', 'in', [record.contact_id.id for record in contacts if record.opt_out == value])]
return expression.FALSE_DOMAIN if value else expression.TRUE_DOMAIN
@api.depends('subscription_list_ids')
@api.depends('subscription_ids')
@api.depends_context('default_list_ids')
def _compute_opt_out(self):
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']
for record in self:
active_subscription_list = record.subscription_list_ids.filtered(lambda l: l.list_id.id == active_list_id)
active_subscription_list = record.subscription_ids.filtered(lambda l: l.list_id.id == active_list_id)
record.opt_out = active_subscription_list.opt_out
else:
for record in self:
@@ -76,7 +76,7 @@ class MassMailingContact(models.Model):
@api.model_create_multi
def create(self, vals_list):
""" Synchronize default_list_ids (currently used notably for computed
fields) default key with subscription_list_ids given by user when creating
fields) default key with subscription_ids given by user when creating
contacts.
Those two values have the same purpose, adding a list to to the contact
@@ -90,21 +90,21 @@ class MassMailingContact(models.Model):
default_list_ids = default_list_ids if isinstance(default_list_ids, (list, tuple)) else []
for vals in vals_list:
if vals.get('list_ids') and vals.get('subscription_list_ids'):
raise UserError(_('You should give either list_ids, either subscription_list_ids to create new contacts.'))
if vals.get('list_ids') and vals.get('subscription_ids'):
raise UserError(_('You should give either list_ids, either subscription_ids to create new contacts.'))
if default_list_ids:
for vals in vals_list:
if vals.get('list_ids'):
continue
current_list_ids = []
subscription_ids = vals.get('subscription_list_ids') or []
subscription_ids = vals.get('subscription_ids') or []
for subscription in subscription_ids:
if len(subscription) == 3:
current_list_ids.append(subscription[2]['list_id'])
for list_id in set(default_list_ids) - set(current_list_ids):
subscription_ids.append((0, 0, {'list_id': list_id}))
vals['subscription_list_ids'] = subscription_ids
vals['subscription_ids'] = subscription_ids
return super(MassMailingContact, self.with_context(default_list_ids=False)).create(vals_list)
+15 -15
View File
@@ -27,14 +27,14 @@ class MassMailingList(models.Model):
contact_pct_blacklisted = fields.Float(compute="_compute_mailing_list_statistics", string="Percentage of Blacklisted")
contact_pct_bounce = fields.Float(compute="_compute_mailing_list_statistics", string="Percentage of Bouncing")
contact_ids = fields.Many2many(
'mailing.contact', 'mailing_contact_list_rel', 'list_id', 'contact_id',
'mailing.contact', 'mailing_subscription', 'list_id', 'contact_id',
string='Mailing Lists', copy=False)
mailing_count = fields.Integer(compute="_compute_mailing_count", string="Number of Mailing")
mailing_ids = fields.Many2many(
'mailing.mailing', 'mail_mass_mailing_list_rel',
string='Mass Mailings', copy=False)
subscription_ids = fields.One2many(
'mailing.contact.subscription', 'list_id',
'mailing.subscription', 'list_id',
string='Subscription Information',
copy=True, depends=['contact_ids'])
is_public = fields.Boolean(
@@ -78,13 +78,13 @@ class MassMailingList(models.Model):
bounce_per_mailing = {}
if self.ids:
sql = '''
SELECT mclr.list_id, COUNT(DISTINCT mc.id)
SELECT list_sub.list_id, COUNT(DISTINCT mc.id)
FROM mailing_contact mc
LEFT OUTER JOIN mailing_contact_list_rel mclr
ON mc.id = mclr.contact_id
LEFT OUTER JOIN mailing_subscription list_sub
ON mc.id = list_sub.contact_id
WHERE mc.message_bounce > 0
AND mclr.list_id in %s
GROUP BY mclr.list_id
AND list_sub.list_id in %s
GROUP BY list_sub.list_id
'''
self.env.cr.execute(sql, (tuple(self.ids),))
bounce_per_mailing = dict(self.env.cr.fetchall())
@@ -144,7 +144,7 @@ class MassMailingList(models.Model):
action['context'] = {
**self.env.context,
'default_mailing_list_ids': self.ids,
'default_subscription_list_ids': [
'default_subscription_ids': [
Command.create({'list_id': mailing_list.id})
for mailing_list in self
],
@@ -232,7 +232,7 @@ class MassMailingList(models.Model):
src_lists |= self
self.env.flush_all()
self.env.cr.execute("""
INSERT INTO mailing_contact_list_rel (contact_id, list_id)
INSERT INTO mailing_subscription (contact_id, list_id)
SELECT st.contact_id AS contact_id, %s AS list_id
FROM
(
@@ -243,7 +243,7 @@ class MassMailingList(models.Model):
row_number() OVER (PARTITION BY email ORDER BY email) AS rn
FROM
mailing_contact contact,
mailing_contact_list_rel contact_list_rel,
mailing_subscription contact_list_rel,
mailing_list list
WHERE contact.id=contact_list_rel.contact_id
AND COALESCE(contact_list_rel.opt_out,FALSE) = FALSE
@@ -255,7 +255,7 @@ class MassMailingList(models.Model):
SELECT 1
FROM
mailing_contact contact2,
mailing_contact_list_rel contact_list_rel2
mailing_subscription contact_list_rel2
WHERE contact2.email = contact.email
AND contact_list_rel2.contact_id = contact2.id
AND contact_list_rel2.list_id = %s
@@ -303,14 +303,14 @@ class MassMailingList(models.Model):
# switch opted-in subscriptions
if opt_out:
current_opt_in = contacts.subscription_list_ids.filtered(
current_opt_in = contacts.subscription_ids.filtered(
lambda sub: not sub.opt_out and sub.list_id in self
)
if current_opt_in:
current_opt_in.write({'opt_out': True})
# switch opted-out subscription and create missing subscriptions
else:
subscriptions = contacts.subscription_list_ids.filtered(lambda sub: sub.list_id in self)
subscriptions = contacts.subscription_ids.filtered(lambda sub: sub.list_id in self)
current_opt_out = subscriptions.filtered('opt_out')
if current_opt_out:
current_opt_out.write({'opt_out': False})
@@ -318,7 +318,7 @@ class MassMailingList(models.Model):
# create a subscription (for a single contact) for missing lists
missing_lists = self - subscriptions.list_id
if missing_lists:
self.env['mailing.contact.subscription'].create([
self.env['mailing.subscription'].create([
{'contact_id': contacts[0].id,
'list_id': mailing_list.id}
for mailing_list in missing_lists
@@ -397,7 +397,7 @@ class MassMailingList(models.Model):
SELECT
{','.join(self._get_contact_statistics_fields().values())}
FROM
mailing_contact_list_rel r
mailing_subscription r
{self._get_contact_statistics_joins()}
WHERE list_id IN %s
GROUP BY
@@ -4,13 +4,13 @@
from odoo import api, fields, models
class MassMailingContactListRel(models.Model):
class MailingSubscription(models.Model):
""" Intermediate model between mass mailing list and mass mailing contact
Indicates if a contact is opted out for a particular list
"""
_name = 'mailing.contact.subscription'
_description = 'Mass Mailing Subscription Information'
_table = 'mailing_contact_list_rel'
_name = 'mailing.subscription'
_description = 'Mailing List Subscription'
_table = 'mailing_subscription'
_rec_name = 'contact_id'
_order = 'list_id DESC, contact_id DESC'
@@ -2,7 +2,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_utm_tag_mass_mailing_campaign,utm.tag,utm.model_utm_tag,mass_mailing.group_mass_mailing_campaign,1,1,1,1
access_mailing_contact_mm_user,access.mailing.contact.mm.user,model_mailing_contact,mass_mailing.group_mass_mailing_user,1,1,1,1
access_mailing_contact_import_mailing_user,access.mailing.contact.import.mailing.user,model_mailing_contact_import,mass_mailing.group_mass_mailing_user,1,1,1,1
access_mailing_contact_subscription_mm_user,access.mailing.contact.subscription.mm.user,model_mailing_contact_subscription,mass_mailing.group_mass_mailing_user,1,1,1,1
access_mailing_subscription_mm_user,access.mailing.subscription.mm.user,model_mailing_subscription,mass_mailing.group_mass_mailing_user,1,1,1,1
access_mailing_list_mm_user,access.mailing.list.mm.user,model_mailing_list,mass_mailing.group_mass_mailing_user,1,1,1,1
access_utm_stage,utm.stage,utm.model_utm_stage,mass_mailing.group_mass_mailing_user,1,1,1,1
access_mailing_mailing_mm_user,access.mailing.mailing.mm.user,model_mailing_mailing,mass_mailing.group_mass_mailing_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_utm_tag_mass_mailing_campaign utm.tag utm.model_utm_tag mass_mailing.group_mass_mailing_campaign 1 1 1 1
3 access_mailing_contact_mm_user access.mailing.contact.mm.user model_mailing_contact mass_mailing.group_mass_mailing_user 1 1 1 1
4 access_mailing_contact_import_mailing_user access.mailing.contact.import.mailing.user model_mailing_contact_import mass_mailing.group_mass_mailing_user 1 1 1 1
5 access_mailing_contact_subscription_mm_user access_mailing_subscription_mm_user access.mailing.contact.subscription.mm.user access.mailing.subscription.mm.user model_mailing_contact_subscription model_mailing_subscription mass_mailing.group_mass_mailing_user 1 1 1 1
6 access_mailing_list_mm_user access.mailing.list.mm.user model_mailing_list mass_mailing.group_mass_mailing_user 1 1 1 1
7 access_utm_stage utm.stage utm.model_utm_stage mass_mailing.group_mass_mailing_user 1 1 1 1
8 access_mailing_mailing_mm_user access.mailing.mailing.mm.user model_mailing_mailing mass_mailing.group_mass_mailing_user 1 1 1 1
@@ -77,7 +77,7 @@ class TestMailingControllers(TestMailingControllersCommon):
def test_assert_initial_values(self):
""" Ensure test base data to ease test understanding. Globally test_email
is member of 2 mailing public lists. """
memberships = self.env['mailing.contact.subscription'].search([
memberships = self.env['mailing.subscription'].search([
('contact_id.email_normalized', '=', self.test_email_normalized)]
)
self.assertEqual(memberships.list_id, self.mailing_list_1 + self.mailing_list_3)
@@ -87,7 +87,7 @@ class TestMailingListMerge(MassMailCommon):
new = self.env['mailing.contact'].with_context(default_list_ids=default_list_ids).create([{
'name': 'Contact_%d' % x,
'email': 'contact_%d@test.example.com' % x,
'subscription_list_ids': [(0, 0, {
'subscription_ids': [(0, 0, {
'list_id': self.mailing_list_1.id,
'opt_out': True,
}), (0, 0, {
@@ -109,15 +109,15 @@ class TestMailingListMerge(MassMailCommon):
patch.object(self.env.cr, 'now', lambda: datetime(2022, 1, 1, 12, 0, 0)):
contact_form = Form(self.env['mailing.contact'])
contact_form.name = 'Contact_test'
with contact_form.subscription_list_ids.new() as subscription:
with contact_form.subscription_ids.new() as subscription:
subscription.list_id = self.mailing_list_1
subscription.opt_out = True
with contact_form.subscription_list_ids.new() as subscription:
with contact_form.subscription_ids.new() as subscription:
subscription.list_id = self.mailing_list_2
subscription.opt_out = False
contact = contact_form.save()
self.assertEqual(contact.subscription_list_ids[0].unsubscription_date, datetime(2022, 1, 1, 12, 0, 0))
self.assertFalse(contact.subscription_list_ids[1].unsubscription_date)
self.assertEqual(contact.subscription_ids[0].unsubscription_date, datetime(2022, 1, 1, 12, 0, 0))
self.assertFalse(contact.subscription_ids[1].unsubscription_date)
@users('user_marketing')
def test_mailing_list_contact_copy_in_context_of_mailing_list(self):
@@ -125,7 +125,7 @@ class TestMailingListMerge(MassMailCommon):
contact_1 = MailingContact.create({
'name': 'Sam',
'email': 'gamgee@shire.com',
'subscription_list_ids': [(0, 0, {'list_id': self.mailing_list_3.id})],
'subscription_ids': [(0, 0, {'list_id': self.mailing_list_3.id})],
})
# Copy the contact with default_list_ids in context, which should not raise anything
contact_2 = contact_1.with_context(default_list_ids=self.mailing_list_3.ids).copy()
@@ -309,14 +309,14 @@ class TestSubscriptionManagement(MassMailCommon):
# add new subscriptions (and ensure email_normalized is used)
(ml_1 + ml_2)._update_subscription_from_email(_email_formatted_upd, opt_out=False)
subs = self.env['mailing.contact.subscription'].search(
subs = self.env['mailing.subscription'].search(
[('contact_id', '=', contact.id)]
)
self.assertEqual(subs.list_id, ml_1 + ml_2)
# opt-out from opted-in mailing list + 1 non opted-in mailing list
(ml_2 + ml_3)._update_subscription_from_email(_email_formatted_upd, opt_out=True)
subs = self.env['mailing.contact.subscription'].search(
subs = self.env['mailing.subscription'].search(
[('contact_id', '=', contact.id)]
)
self.assertEqual(subs.list_id, ml_1 + ml_2)
@@ -144,7 +144,7 @@
<field name="message_bounce" readonly="1" invisible="not id"/>
</group>
</group>
<field name="subscription_list_ids">
<field name="subscription_ids">
<tree editable="bottom">
<field name="list_id"/>
<field name="unsubscription_date"/>
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="mailing_contact_subscription_view_form">
<field name="name">mailing.contact.subscription.view.form</field>
<field name="model">mailing.contact.subscription</field>
<record id="mailing_subscription_view_form" model="ir.ui.view">
<field name="name">mailing.subscription.view.form</field>
<field name="model">mailing.subscription</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<form string="Mailing List Subscription">
@@ -25,9 +25,9 @@
</field>
</record>
<record model="ir.ui.view" id="mailing_contact_subscription_view_tree">
<field name="name">mailing.contact.subscription.view.tree</field>
<field name="model">mailing.contact.subscription</field>
<record id="mailing_subscription_view_tree" model="ir.ui.view">
<field name="name">mailing.subscription.view.tree</field>
<field name="model">mailing.subscription</field>
<field name="arch" type="xml">
<tree string="Mailing List Subscriptions">
<field name="contact_id"/>
@@ -39,9 +39,9 @@
</field>
</record>
<record model="ir.ui.view" id="mailing_contact_subscription_view_search">
<field name="name">mailing.contact.subscription.view.search</field>
<field name="model">mailing.contact.subscription</field>
<record id="mailing_subscription_view_search" model="ir.ui.view">
<field name="name">mailing.subscription.view.search</field>
<field name="model">mailing.subscription</field>
<field name="arch" type="xml">
<search string="Mailing List Subscriptions">
<field name="contact_id"/>
+1 -1
View File
@@ -29,7 +29,7 @@
'demo': [
'demo/utm.xml',
'demo/mailing_list_contact.xml',
'demo/mailing_contact_subscription.xml',
'demo/mailing_subscription.xml',
'demo/mailing_mailing.xml',
'demo/mailing_trace.xml',
],
+2 -2
View File
@@ -59,7 +59,7 @@ class MailingSMSController(http.Controller):
if tocheck_number and trace:
mailing_list_ids = trace.mass_mailing_id.contact_list_ids
if mailing_list_ids:
subscriptions = request.env['mailing.contact.subscription'].sudo().search([
subscriptions = request.env['mailing.subscription'].sudo().search([
('list_id', 'in', mailing_list_ids.ids),
('contact_id.phone_sanitized', '=', tocheck_number),
])
@@ -70,7 +70,7 @@ class MailingSMSController(http.Controller):
blacklist_rec._message_log(
body=_('Blacklist through SMS Marketing unsubscribe (mailing ID: %s - model: %s)') %
(trace.mass_mailing_id.id, trace.mass_mailing_id.mailing_model_id.display_name))
lists_optin = request.env['mailing.contact.subscription'].sudo().search([
lists_optin = request.env['mailing.subscription'].sudo().search([
('contact_id.phone_sanitized', '=', tocheck_number),
('list_id', 'not in', mailing_list_ids.ids),
('opt_out', '=', False),
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo><data noupdate="0">
<record id="mailing_list_sms_0_sub_contact_0_0" model="mailing.contact.subscription">
<record id="mailing_list_sms_0_sub_contact_0_0" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing_sms.mailing_contact_0_0"/>
<field name="list_id" ref="mass_mailing_sms.mailing_list_sms_0"/>
</record>
<record id="mailing_list_sms_0_sub_contact_0_1" model="mailing.contact.subscription">
<record id="mailing_list_sms_0_sub_contact_0_1" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing_sms.mailing_contact_0_1"/>
<field name="list_id" ref="mass_mailing_sms.mailing_list_sms_0"/>
</record>
<record id="mailing_list_sms_0_sub_contact_0_2" model="mailing.contact.subscription">
<record id="mailing_list_sms_0_sub_contact_0_2" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing_sms.mailing_contact_0_2"/>
<field name="list_id" ref="mass_mailing_sms.mailing_list_sms_0"/>
</record>
<record id="mailing_list_sms_0_sub_contact_0_3" model="mailing.contact.subscription">
<record id="mailing_list_sms_0_sub_contact_0_3" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing_sms.mailing_contact_0_3"/>
<field name="list_id" ref="mass_mailing_sms.mailing_list_sms_0"/>
</record>
<record id="mailing_list_sms_0_sub_contact_0_4" model="mailing.contact.subscription">
<record id="mailing_list_sms_0_sub_contact_0_4" model="mailing.subscription">
<field name="contact_id" ref="mass_mailing_sms.mailing_contact_0_4"/>
<field name="list_id" ref="mass_mailing_sms.mailing_list_sms_0"/>
</record>
@@ -565,7 +565,7 @@ class TestMassMailing(TestMassMailCommon):
# contact_1 is optout but same email is not optout from the same list
# contact 3 is optout in list 1 but not in list 2
# contact 5 is optout
subs = self.env['mailing.contact.subscription'].search([
subs = self.env['mailing.subscription'].search([
'|', '|',
'&', ('contact_id', '=', mailing_contact_1.id), ('list_id', '=', mailing_list_1.id),
'&', ('contact_id', '=', mailing_contact_3.id), ('list_id', '=', mailing_list_1.id),
@@ -14,7 +14,7 @@ class MassMailController(main.MassMailController):
fname = self._get_fname(subscription_type)
is_subscriber = False
if value and fname:
contacts_count = request.env['mailing.contact.subscription'].sudo().search_count(
contacts_count = request.env['mailing.subscription'].sudo().search_count(
[('list_id', 'in', [int(list_id)]), (f'contact_id.{fname}', '=', value), ('opt_out', '=', False)])
is_subscriber = contacts_count > 0
@@ -40,7 +40,7 @@ class MassMailController(main.MassMailController):
'toast_content': _("Suspicious activity detected by Google reCaptcha."),
}
ContactSubscription = request.env['mailing.contact.subscription'].sudo()
ContactSubscription = request.env['mailing.subscription'].sudo()
Contacts = request.env['mailing.contact'].sudo()
if subscription_type == 'email':
name, value = tools.parse_contact_from_email(value)