From e58379f7695089c85ae65d5a06f0cabfb2baa28d Mon Sep 17 00:00:00 2001 From: nounoubensebia Date: Mon, 8 Feb 2021 11:41:19 +0000 Subject: [PATCH] [IMP] mass_mailing: create "add to mailing list" wizard This commit introduces a new wizard that allows adding existing contacts of a specific mailing list to another mailing.list. It's typically used on the list view of a mailing.list where you tick a bunch of contacts and add them all at once to another mailing.list (existing OR new one that you create on the fly). That tool will help users manage their mailing.list a bit easier and avoid some tedious copy/pasting if mailing.lists need to share common contacts. Wizard has two options: either simply create a new mailing list, either create it and use it directly in a new mailing. It allows to cover the following user flow * select contacts; * add them in a new list created on-the-fly; * jump on a new mailing targeting this mailing-list; * fill body, launch, enjoy ! Task-2453990 closes odoo/odoo#65965 Signed-off-by: Thibault Delavallee (tde) Co-authored-by: Noureddine Bensebia Co-authored-by: Thibault Delavallee --- addons/mass_mailing/__manifest__.py | 1 + addons/mass_mailing/models/mailing_contact.py | 9 ++++ .../mass_mailing/security/ir.model.access.csv | 1 + .../mass_mailing/tests/test_mailing_list.py | 49 ++++++++++++++++- .../views/mailing_contact_views.xml | 3 ++ addons/mass_mailing/wizard/__init__.py | 1 + .../wizard/mailing_contact_to_list.py | 52 +++++++++++++++++++ .../wizard/mailing_contact_to_list_views.xml | 29 +++++++++++ 8 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 addons/mass_mailing/wizard/mailing_contact_to_list.py create mode 100644 addons/mass_mailing/wizard/mailing_contact_to_list_views.xml diff --git a/addons/mass_mailing/__manifest__.py b/addons/mass_mailing/__manifest__.py index 914ead20cc6..5565c31a1f4 100644 --- a/addons/mass_mailing/__manifest__.py +++ b/addons/mass_mailing/__manifest__.py @@ -27,6 +27,7 @@ 'data/mailing_data_templates.xml', 'data/mass_mailing_data.xml', 'wizard/mail_compose_message_views.xml', + 'wizard/mailing_contact_to_list_views.xml', 'wizard/mailing_list_merge_views.xml', 'wizard/mailing_mailing_test_views.xml', 'views/mailing_mailing_views_menus.xml', diff --git a/addons/mass_mailing/models/mailing_contact.py b/addons/mass_mailing/models/mailing_contact.py index b6af18c0e4f..579599ae4bb 100644 --- a/addons/mass_mailing/models/mailing_contact.py +++ b/addons/mass_mailing/models/mailing_contact.py @@ -174,3 +174,12 @@ class MassMailingContact(models.Model): 'email_cc': False} for r in self } + + def action_add_to_mailing_list(self): + ctx = dict(self.env.context, default_contact_ids=self.ids) + action = self.env["ir.actions.actions"]._for_xml_id("mass_mailing.mailing_contact_to_list_action") + action['view_mode'] = 'form' + action['target'] = 'new' + action['context'] = ctx + + return action diff --git a/addons/mass_mailing/security/ir.model.access.csv b/addons/mass_mailing/security/ir.model.access.csv index 71e93b48810..58cf8054186 100644 --- a/addons/mass_mailing/security/ir.model.access.csv +++ b/addons/mass_mailing/security/ir.model.access.csv @@ -17,3 +17,4 @@ access_mail_blacklist_remove_mass_mailing_user,acesss.mail.blacklist.remove.mass access_link_tracker_mailing,access.link.tracker.mailing,link_tracker.model_link_tracker,mass_mailing.group_mass_mailing_user,1,1,1,1 access_mailing_list_merge,access.mailing.list.merge,model_mailing_list_merge,mass_mailing.group_mass_mailing_user,1,1,1,0 access_mailing_mailing_test,access.mailing.mailing.test,model_mailing_mailing_test,mass_mailing.group_mass_mailing_user,1,1,1,0 +access_mailing_contact_to_list,access.mailing.contact.to.list,model_mailing_contact_to_list,mass_mailing.group_mass_mailing_user,1,1,1,1 diff --git a/addons/mass_mailing/tests/test_mailing_list.py b/addons/mass_mailing/tests/test_mailing_list.py index 4a67818ffe9..04bf7c099ba 100644 --- a/addons/mass_mailing/tests/test_mailing_list.py +++ b/addons/mass_mailing/tests/test_mailing_list.py @@ -2,7 +2,53 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.addons.mass_mailing.tests.common import MassMailCommon -from odoo.tests.common import users +from odoo.tests.common import Form, users + + +class TestMailingContactToList(MassMailCommon): + + @users('user_marketing') + def test_mailing_contact_to_list(self): + contacts = self.env['mailing.contact'].create([{ + 'name': 'Contact %02d', + 'email': 'contact_%02d@test.example.com', + } for x in range(30)]) + + self.assertEqual(len(contacts), 30) + self.assertEqual(contacts.list_ids, self.env['mailing.list']) + + mailing = self.env['mailing.list'].create({ + 'name': 'Contacts Agregator', + }) + + # create wizard with context values + wizard_form = Form(self.env['mailing.contact.to.list'].with_context(default_contact_ids=contacts.ids)) + self.assertEqual(wizard_form.contact_ids._get_ids(), contacts.ids) + + # set mailing list and add contacts + wizard_form.mailing_list_id = mailing + wizard = wizard_form.save() + action = wizard.action_add_contacts() + self.assertEqual(contacts.list_ids, mailing) + self.assertEqual(action["type"], "ir.actions.client") + self.assertTrue(action.get("params", {}).get("next"), "Should return a notification with a next action") + subaction = action["params"]["next"] + self.assertEqual(subaction["type"], "ir.actions.act_window_close") + + # set mailing list, add contacts and redirect to mailing view + mailing2 = self.env['mailing.list'].create({ + 'name': 'Contacts Sublimator', + }) + + wizard_form.mailing_list_id = mailing2 + wizard = wizard_form.save() + action = wizard.action_add_contacts_and_send_mailing() + self.assertEqual(contacts.list_ids, mailing + mailing2) + self.assertEqual(action["type"], "ir.actions.client") + self.assertTrue(action.get("params", {}).get("next"), "Should return a notification with a next action") + subaction = action["params"]["next"] + self.assertEqual(subaction["type"], "ir.actions.act_window") + self.assertEqual(subaction["context"]["default_contact_list_ids"], [mailing2.id]) class TestMailingListMerge(MassMailCommon): @@ -19,7 +65,6 @@ class TestMailingListMerge(MassMailCommon): ] }) - @users('user_marketing') def test_mailing_contact_create(self): default_list_ids = (self.mailing_list_2 | self.mailing_list_3).ids diff --git a/addons/mass_mailing/views/mailing_contact_views.xml b/addons/mass_mailing/views/mailing_contact_views.xml index 2d2ed5e9a4f..cc35f2aa2ca 100644 --- a/addons/mass_mailing/views/mailing_contact_views.xml +++ b/addons/mass_mailing/views/mailing_contact_views.xml @@ -94,6 +94,9 @@ 10 +
+
diff --git a/addons/mass_mailing/wizard/__init__.py b/addons/mass_mailing/wizard/__init__.py index 523a64e2412..9277a24a6d1 100644 --- a/addons/mass_mailing/wizard/__init__.py +++ b/addons/mass_mailing/wizard/__init__.py @@ -2,5 +2,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import mail_compose_message +from . import mailing_contact_to_list from . import mailing_list_merge from . import mailing_mailing_test diff --git a/addons/mass_mailing/wizard/mailing_contact_to_list.py b/addons/mass_mailing/wizard/mailing_contact_to_list.py new file mode 100644 index 00000000000..e6d34c98232 --- /dev/null +++ b/addons/mass_mailing/wizard/mailing_contact_to_list.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, _ + +class MailingContactToList(models.TransientModel): + _name = "mailing.contact.to.list" + _description = "Add Contacts to Mailing List" + + contact_ids = fields.Many2many('mailing.contact', string='Contacts') + mailing_list_id = fields.Many2one('mailing.list', string='Mailing List', required=True) + + def action_add_contacts(self): + """ Simply add contacts to the mailing list and close wizard. """ + return self._add_contacts_to_mailing_list({'type': 'ir.actions.act_window_close'}) + + def action_add_contacts_and_send_mailing(self): + """ Add contacts to the mailing list and redirect to a new mailing on + this list. """ + self.ensure_one() + + action = self.env["ir.actions.actions"]._for_xml_id("mass_mailing.mailing_mailing_action_mail") + action['views'] = [[False, "form"]] + action['target'] = 'current' + action['context'] = { + 'default_contact_list_ids': [self.mailing_list_id.id] + } + return self._add_contacts_to_mailing_list(action) + + def _add_contacts_to_mailing_list(self, action): + self.ensure_one() + + previous_count = len(self.mailing_list_id.contact_ids) + self.mailing_list_id.write({ + 'contact_ids': [ + (4, contact.id) + for contact in self.contact_ids + if contact not in self.mailing_list_id.contact_ids] + }) + + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'type': 'info', + 'message': _("%s Mailing Contacts have been added. ", + len(self.mailing_list_id.contact_ids) - previous_count + ), + 'sticky': False, + 'next': action, + } + } diff --git a/addons/mass_mailing/wizard/mailing_contact_to_list_views.xml b/addons/mass_mailing/wizard/mailing_contact_to_list_views.xml new file mode 100644 index 00000000000..11435486893 --- /dev/null +++ b/addons/mass_mailing/wizard/mailing_contact_to_list_views.xml @@ -0,0 +1,29 @@ + + + + + mailing.contact.to.list.view.form + mailing.contact.to.list + +
+ + + + +
+
+
+
+
+ + + Add Selected Contacts to a Mailing List + mailing.contact.to.list + form + new + + +