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
+
+
+