[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:
@@ -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',
|
||||
],
|
||||
|
||||
@@ -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
-1
@@ -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>
|
||||
+8
-8
@@ -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>
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
-4
@@ -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
|
||||
|
||||
|
@@ -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"/>
|
||||
|
||||
+9
-9
@@ -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"/>
|
||||
@@ -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',
|
||||
],
|
||||
|
||||
@@ -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),
|
||||
|
||||
+5
-5
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user