From bf8bd2d4d5de11ade458377a188016e8cdf1a031 Mon Sep 17 00:00:00 2001 From: dht-odoo Date: Tue, 2 Mar 2021 08:57:45 +0000 Subject: [PATCH] [FW][FIX] mass_mailing: improve default values management when merging mailing lists Since PR #55995 is merged, we get traceback while trying to merge the mailing lists. This has recently been fixed in odoo/odoo@fc1005aa1e0e348495bf2ceb00081b5d8d7c5550 . However code can still be improved to correctly take default values from context instead of always relying on active_ids, as well as ensuring we are effectively working on mailing lists. Apart from that, this commit also shortens the action name to 'Merge' from 'Merge Selected Mailing Lists'. Task ID-2471692 COM PR odoo/odoo#67213 X-original-commit: 58722d7e855aac75f76e48c24265130c7f03cec9 --- addons/mass_mailing/i18n/mass_mailing.pot | 8 ++++- .../mass_mailing/tests/test_mailing_list.py | 26 ++++++++++++++-- .../mass_mailing/wizard/mailing_list_merge.py | 31 ++++++++++++------- .../wizard/mailing_list_merge_views.xml | 2 +- 4 files changed, 52 insertions(+), 15 deletions(-) diff --git a/addons/mass_mailing/i18n/mass_mailing.pot b/addons/mass_mailing/i18n/mass_mailing.pot index 490d6994f50..1d070053b1f 100644 --- a/addons/mass_mailing/i18n/mass_mailing.pot +++ b/addons/mass_mailing/i18n/mass_mailing.pot @@ -1715,7 +1715,7 @@ msgstr "" #. module: mass_mailing #: model:ir.actions.act_window,name:mass_mailing.mailing_list_merge_action -msgid "Merge Selected Mailing Lists" +msgid "Merge" msgstr "" #. module: mass_mailing @@ -2864,6 +2864,12 @@ msgstr "" msgid "You are not subscribed to any of our mailing list." msgstr "" +#. module: mass_mailing +#: code:addons/mass_mailing/wizard/mailing_list_merge.py:0 +#, python-format +msgid "You can only apply this action from Mailing Lists." +msgstr "" + #. module: mass_mailing #: model_terms:ir.actions.act_window,help:mass_mailing.action_create_mass_mailings_from_campaign #: model_terms:ir.actions.act_window,help:mass_mailing.action_view_mass_mailings_from_campaign diff --git a/addons/mass_mailing/tests/test_mailing_list.py b/addons/mass_mailing/tests/test_mailing_list.py index 2ded2e68435..92b2924b8ba 100644 --- a/addons/mass_mailing/tests/test_mailing_list.py +++ b/addons/mass_mailing/tests/test_mailing_list.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo import exceptions from odoo.addons.mass_mailing.tests.common import MassMailCommon from odoo.tests.common import Form, users @@ -116,8 +117,10 @@ class TestMailingListMerge(MassMailCommon): # The mailing list C contains the same email address than 'Norbert' in list B # This test ensure that the mailing lists are correctly merged and no # duplicates are appearing in C - - merge_form = Form(self.env['mailing.list.merge'].with_context(active_ids=[self.mailing_list_1.id, self.mailing_list_2.id])) + merge_form = Form(self.env['mailing.list.merge'].with_context( + active_ids=[self.mailing_list_1.id, self.mailing_list_2.id], + active_model='mailing.list' + )) merge_form.new_list_name = False merge_form.dest_list_id = self.mailing_list_3 merge_form.merge_options = 'existing' @@ -133,3 +136,22 @@ class TestMailingListMerge(MassMailCommon): self.assertEqual( len(list(set(result_list.contact_ids.mapped('email')))), 5, 'Duplicates have been merged into the destination mailing list. Check %s' % (result_list.contact_ids.mapped('email'))) + + @users('user_marketing') + def test_mailing_list_merge_cornercase(self): + """ Check wrong use of merge wizard """ + with self.assertRaises(exceptions.UserError): + merge_form = Form(self.env['mailing.list.merge'].with_context( + active_ids=[self.mailing_list_1.id, self.mailing_list_2.id], + )) + + merge_form = Form(self.env['mailing.list.merge'].with_context( + active_ids=[self.mailing_list_1.id], + active_model='mailing.list', + default_src_list_ids=[self.mailing_list_1.id, self.mailing_list_2.id], + default_dest_list_id=self.mailing_list_3.id, + default_merge_options='existing', + )) + merge = merge_form.save() + self.assertEqual(merge.src_list_ids, self.mailing_list_1 + self.mailing_list_2) + self.assertEqual(merge.dest_list_id, self.mailing_list_3) diff --git a/addons/mass_mailing/wizard/mailing_list_merge.py b/addons/mass_mailing/wizard/mailing_list_merge.py index 798ac25ebf3..213107783f6 100644 --- a/addons/mass_mailing/wizard/mailing_list_merge.py +++ b/addons/mass_mailing/wizard/mailing_list_merge.py @@ -1,13 +1,32 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import api, fields, models +from odoo import api, fields, models, _ +from odoo.exceptions import UserError class MassMailingListMerge(models.TransientModel): _name = 'mailing.list.merge' _description = 'Merge Mass Mailing List' + @api.model + def default_get(self, fields): + res = super(MassMailingListMerge, self).default_get(fields) + + if not res.get('src_list_ids') and 'src_list_ids' in fields: + if self.env.context.get('active_model') != 'mailing.list': + raise UserError(_('You can only apply this action from Mailing Lists.')) + src_list_ids = self.env.context.get('active_ids') + res.update({ + 'src_list_ids': [(6, 0, src_list_ids)], + }) + if not res.get('dest_list_id') and 'dest_list_id' in fields: + src_list_ids = res.get('src_list_ids') or self.env.context.get('active_ids') + res.update({ + 'dest_list_id': src_list_ids and src_list_ids[0] or False, + }) + return res + src_list_ids = fields.Many2many('mailing.list', string='Mailing Lists') dest_list_id = fields.Many2one('mailing.list', string='Destination Mailing List') merge_options = fields.Selection([ @@ -17,16 +36,6 @@ class MassMailingListMerge(models.TransientModel): new_list_name = fields.Char('New Mailing List Name') archive_src_lists = fields.Boolean('Archive source mailing lists', default=True) - @api.model - def default_get(self, fields): - res = super(MassMailingListMerge, self).default_get(fields) - src_list_ids = self.env.context.get('active_ids') - res.update({ - 'src_list_ids': [(6, 0, src_list_ids)], - 'dest_list_id': src_list_ids and src_list_ids[0] or False, - }) - return res - def action_mailing_lists_merge(self): if self.merge_options == 'new': self.dest_list_id = self.env['mailing.list'].create({ diff --git a/addons/mass_mailing/wizard/mailing_list_merge_views.xml b/addons/mass_mailing/wizard/mailing_list_merge_views.xml index 1083033ee57..0cb523fafde 100644 --- a/addons/mass_mailing/wizard/mailing_list_merge_views.xml +++ b/addons/mass_mailing/wizard/mailing_list_merge_views.xml @@ -27,7 +27,7 @@ - Merge Selected Mailing Lists + Merge mailing.list.merge form new