diff --git a/mass_mailing_resend/README.rst b/mass_mailing_resend/README.rst new file mode 100644 index 00000000..84deb127 --- /dev/null +++ b/mass_mailing_resend/README.rst @@ -0,0 +1,75 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +==================== +Resend mass mailings +==================== + +A frequent need for users of mass mailings is to resend one mailing that has +already been sent in the past to new recipients that haven't received yet that +mail. But the problem is to know which are the applicable ones. + +Odoo already includes a method in its mass mailing logic that avoids to resend +the same mail 2 times for one mass mailing, and for v9, there was a trick that +allows to modify the state of a mass mailing from kanban view, covering the +need. + +But now on v10 both status bar in form view and dragging between states in +kanban are not allowed. + +This module introduces a button to restart a mass mailing to draft state, +allowing you to reevaluate the sending domain or list for performing again +the mailing. + +Usage +===== + +* Go to *Mass mailing > Mailings > Mass Mailings*. +* Click on one record that is done or create a new one and send it. +* You will see a button called "Resend". +* If you click on it, mass mailing will be set to Draft again. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/205/10.0 + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Known issues / Roadmap +====================== + +* Add an indicator / filter for knowing resent mailings. +* Include information on the number of new recipients to be sent on the + resending (through `get_remaining_recipients` method). + + +Credits +======= + +Contributors +------------ + +* Tecnativa (https://www.tecnativa.com): + * Pedro M. Baeza + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/mass_mailing_resend/__init__.py b/mass_mailing_resend/__init__.py new file mode 100644 index 00000000..a77a6fcb --- /dev/null +++ b/mass_mailing_resend/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/mass_mailing_resend/__manifest__.py b/mass_mailing_resend/__manifest__.py new file mode 100644 index 00000000..9e7260b6 --- /dev/null +++ b/mass_mailing_resend/__manifest__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Resend mass mailings", + "version": "10.0.1.0.0", + "category": "Marketing", + "website": "https://github.com/OCA/social", + "author": "Tecnativa, " + "Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "mass_mailing", + ], + "data": [ + "views/mass_mailing_views.xml", + ], +} diff --git a/mass_mailing_resend/i18n/es.po b/mass_mailing_resend/i18n/es.po new file mode 100644 index 00000000..cdb4db74 --- /dev/null +++ b/mass_mailing_resend/i18n/es.po @@ -0,0 +1,38 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mass_mailing_resend +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-22 10:42+0000\n" +"PO-Revision-Date: 2017-11-22 10:42+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: mass_mailing_resend +#: model:ir.ui.view,arch_db:mass_mailing_resend.view_mail_mass_mailing_form +msgid " New sending will be done only to not sent/new recipients. If you want to resend again the mass mailing to already sent recipients, click on Emails Sent smart-button for removing the existing record(s)." +msgstr " El nuevo envío se realizará solo a los destinatarios no enviados/nuevos. Si quiere reenviar otra vez el correo masivo a destinatarios ya enviados, pulse en el botón Correos enviados para eliminar el/los registro/s existentes." + +#. module: mass_mailing_resend +#: model:ir.model,name:mass_mailing_resend.model_mail_mass_mailing +msgid "Mass Mailing" +msgstr "Correo masivo" + +#. module: mass_mailing_resend +#: model:ir.ui.view,arch_db:mass_mailing_resend.view_mail_mass_mailing_form +msgid "Resend" +msgstr "Reenviar" + +#. module: mass_mailing_resend +#: code:addons/mass_mailing_resend/models/mass_mailing.py:16 +#, python-format +msgid "You can't resend a mass mailing that is being sent or in draft state." +msgstr "No puede reenviar un correo masivo que está siendo enviado en estado borrador." + diff --git a/mass_mailing_resend/models/__init__.py b/mass_mailing_resend/models/__init__.py new file mode 100644 index 00000000..d06de603 --- /dev/null +++ b/mass_mailing_resend/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import mass_mailing diff --git a/mass_mailing_resend/models/mass_mailing.py b/mass_mailing_resend/models/mass_mailing.py new file mode 100644 index 00000000..ade99070 --- /dev/null +++ b/mass_mailing_resend/models/mass_mailing.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +from odoo import _, exceptions, models + + +class MailMassMailingList(models.Model): + _inherit = "mail.mass_mailing" + + def button_draft(self): + """Return to draft state for resending the mass mailing.""" + if any(self.mapped(lambda x: x.state != 'done')): + raise exceptions.UserError( + _("You can't resend a mass mailing that is being sent or in " + "draft state.") + ) + self.write({'state': 'draft'}) diff --git a/mass_mailing_resend/static/description/icon.png b/mass_mailing_resend/static/description/icon.png new file mode 100644 index 00000000..7828a2dc Binary files /dev/null and b/mass_mailing_resend/static/description/icon.png differ diff --git a/mass_mailing_resend/static/description/icon.svg b/mass_mailing_resend/static/description/icon.svg new file mode 100644 index 00000000..1e7db975 --- /dev/null +++ b/mass_mailing_resend/static/description/icon.svg @@ -0,0 +1,84 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/mass_mailing_resend/tests/__init__.py b/mass_mailing_resend/tests/__init__.py new file mode 100644 index 00000000..efeb8426 --- /dev/null +++ b/mass_mailing_resend/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_mass_mailing_resend diff --git a/mass_mailing_resend/tests/test_mass_mailing_resend.py b/mass_mailing_resend/tests/test_mass_mailing_resend.py new file mode 100644 index 00000000..41c25ee9 --- /dev/null +++ b/mass_mailing_resend/tests/test_mass_mailing_resend.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.tests import common +from odoo import exceptions + + +class TestMassMailingResend(common.SavepointCase): + @classmethod + def setUpClass(cls): + super(TestMassMailingResend, cls).setUpClass() + cls.list = cls.env['mail.mass_mailing.list'].create({ + 'name': 'Test list', + }) + cls.contact1 = cls.env['mail.mass_mailing.contact'].create({ + 'name': 'Contact 1', + 'email': 'email1@test.com', + }) + cls.mass_mailing = cls.env['mail.mass_mailing'].create({ + 'name': 'Test mass mailing', + 'email_from': 'test@example.org', + 'mailing_model': 'mail.mass_mailing.contact', + 'contact_list_ids': [(6, 0, cls.list.ids)], + 'reply_to_mode': 'thread', + }) + + def test_resend_error(self): + with self.assertRaises(exceptions.UserError): + self.mass_mailing.button_draft() + + def test_resend(self): + self.mass_mailing.state = 'done' # Force state + self.assertEqual(self.mass_mailing.state, 'done') + self.mass_mailing.button_draft() + self.assertEqual(self.mass_mailing.state, 'draft') diff --git a/mass_mailing_resend/views/mass_mailing_views.xml b/mass_mailing_resend/views/mass_mailing_views.xml new file mode 100644 index 00000000..e25d1997 --- /dev/null +++ b/mass_mailing_resend/views/mass_mailing_views.xml @@ -0,0 +1,28 @@ + + + + + mail.mass_mailing + + + +