From 3cc6de9d553c79eb09b20cbaf7682198de7c0a04 Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Fri, 19 Jun 2020 12:47:06 +0200
Subject: [PATCH 1/5] [ADD] mass_mailing_custom_unsubscribe_event: Allow to
unsubscribe discretely from an event
This addon extends the unsubscription process for allowing to unsubscribe
only for an event.
Standard process includes the mail in the general blacklist instead, which
can be very unconvenient.
This includes also the needed changes in the base module `mass_mailing_custom_unsubscribe`.
---
.../README.rst | 91 ++++
.../__init__.py | 3 +
.../__manifest__.py | 19 +
.../mass_mailing_custom_unsubscribe_event.pot | 30 ++
.../models/__init__.py | 3 +
.../models/event_registration.py | 14 +
.../readme/CONTRIBUTORS.rst | 3 +
.../readme/DESCRIPTION.rst | 5 +
.../readme/USAGE.rst | 8 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 439 ++++++++++++++++++
.../views/event_registration_views.xml | 18 +
12 files changed, 633 insertions(+)
create mode 100644 mass_mailing_custom_unsubscribe_event/README.rst
create mode 100644 mass_mailing_custom_unsubscribe_event/__init__.py
create mode 100644 mass_mailing_custom_unsubscribe_event/__manifest__.py
create mode 100644 mass_mailing_custom_unsubscribe_event/i18n/mass_mailing_custom_unsubscribe_event.pot
create mode 100644 mass_mailing_custom_unsubscribe_event/models/__init__.py
create mode 100644 mass_mailing_custom_unsubscribe_event/models/event_registration.py
create mode 100644 mass_mailing_custom_unsubscribe_event/readme/CONTRIBUTORS.rst
create mode 100644 mass_mailing_custom_unsubscribe_event/readme/DESCRIPTION.rst
create mode 100644 mass_mailing_custom_unsubscribe_event/readme/USAGE.rst
create mode 100644 mass_mailing_custom_unsubscribe_event/static/description/icon.png
create mode 100644 mass_mailing_custom_unsubscribe_event/static/description/index.html
create mode 100644 mass_mailing_custom_unsubscribe_event/views/event_registration_views.xml
diff --git a/mass_mailing_custom_unsubscribe_event/README.rst b/mass_mailing_custom_unsubscribe_event/README.rst
new file mode 100644
index 000000000..10ecb4314
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/README.rst
@@ -0,0 +1,91 @@
+=============================================
+Allow to unsubscribe discretely from an event
+=============================================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github
+ :target: https://github.com/OCA/social/tree/12.0/mass_mailing_custom_unsubscribe_event
+ :alt: OCA/social
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mass_mailing_custom_unsubscribe_event
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/205/12.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This addon extends the unsubscription process for allowing to unsubscribe
+only for an event.
+
+Standard process includes the mail in the general blacklist instead, which
+can be very unconvenient.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+#. Go to *Email Marketing > Mailings > Create*.
+#. Select "Event Registration" in *Recipients* field.
+#. Edit your mass mailing at wish, but remember to add a snippet from
+ *Footers*, so people have an *Unsubscribe* link.
+#. Send it.
+#. If somebody gets unsubscribed, it will get unsubscribed only for that
+ event, but including that mail in other event, the registree will still
+ receive mailings.
+
+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 `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Tecnativa
+
+Contributors
+~~~~~~~~~~~~
+
+* `Tecnativa `_:
+
+ * Pedro M. Baeza
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+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.
+
+This module is part of the `OCA/social `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/mass_mailing_custom_unsubscribe_event/__init__.py b/mass_mailing_custom_unsubscribe_event/__init__.py
new file mode 100644
index 000000000..69f7babdf
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import models
diff --git a/mass_mailing_custom_unsubscribe_event/__manifest__.py b/mass_mailing_custom_unsubscribe_event/__manifest__.py
new file mode 100644
index 000000000..d0bb44b16
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/__manifest__.py
@@ -0,0 +1,19 @@
+# Copyright 2020 Tecnativa - Pedro M. Baeza
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+{
+ "name": "Allow to unsubscribe discretely from an event",
+ "category": "Marketing",
+ "version": "12.0.1.0.1",
+ "depends": [
+ "event",
+ "mass_mailing_custom_unsubscribe",
+ ],
+ "author": "Tecnativa, Odoo Community Association (OCA)",
+ "website": "https://github.com/OCA/social",
+ "data": [
+ "views/event_registration_views.xml",
+ ],
+ "license": "AGPL-3",
+ "installable": True,
+ "auto_install": True,
+}
diff --git a/mass_mailing_custom_unsubscribe_event/i18n/mass_mailing_custom_unsubscribe_event.pot b/mass_mailing_custom_unsubscribe_event/i18n/mass_mailing_custom_unsubscribe_event.pot
new file mode 100644
index 000000000..829e503c2
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/i18n/mass_mailing_custom_unsubscribe_event.pot
@@ -0,0 +1,30 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * mass_mailing_custom_unsubscribe_event
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \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_custom_unsubscribe_event
+#: model:ir.model,name:mass_mailing_custom_unsubscribe_event.model_event_registration
+msgid "Event Registration"
+msgstr ""
+
+#. module: mass_mailing_custom_unsubscribe_event
+#: model:ir.model.fields,help:mass_mailing_custom_unsubscribe_event.field_event_registration__opt_out
+msgid "If opt-out is checked, this registree has refused to receive emails for mass mailing and marketing campaign."
+msgstr ""
+
+#. module: mass_mailing_custom_unsubscribe_event
+#: model:ir.model.fields,field_description:mass_mailing_custom_unsubscribe_event.field_event_registration__opt_out
+msgid "Opt-Out"
+msgstr ""
+
diff --git a/mass_mailing_custom_unsubscribe_event/models/__init__.py b/mass_mailing_custom_unsubscribe_event/models/__init__.py
new file mode 100644
index 000000000..950934286
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/models/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from . import event_registration
diff --git a/mass_mailing_custom_unsubscribe_event/models/event_registration.py b/mass_mailing_custom_unsubscribe_event/models/event_registration.py
new file mode 100644
index 000000000..1fd67a4d6
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/models/event_registration.py
@@ -0,0 +1,14 @@
+# Copyright 2020 Tecnativa - Pedro M. Baeza
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class EventRegistration(models.Model):
+ _inherit = 'event.registration'
+
+ opt_out = fields.Boolean(
+ string='Opt-Out',
+ help="If opt-out is checked, this registree has refused to receive "
+ "emails for mass mailing and marketing campaign.")
+ # No need of email field, as it already exists
diff --git a/mass_mailing_custom_unsubscribe_event/readme/CONTRIBUTORS.rst b/mass_mailing_custom_unsubscribe_event/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..2d4d7a884
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/readme/CONTRIBUTORS.rst
@@ -0,0 +1,3 @@
+* `Tecnativa `_:
+
+ * Pedro M. Baeza
diff --git a/mass_mailing_custom_unsubscribe_event/readme/DESCRIPTION.rst b/mass_mailing_custom_unsubscribe_event/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..307efe31c
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/readme/DESCRIPTION.rst
@@ -0,0 +1,5 @@
+This addon extends the unsubscription process for allowing to unsubscribe
+only for an event.
+
+Standard process includes the mail in the general blacklist instead, which
+can be very unconvenient.
diff --git a/mass_mailing_custom_unsubscribe_event/readme/USAGE.rst b/mass_mailing_custom_unsubscribe_event/readme/USAGE.rst
new file mode 100644
index 000000000..552d294ec
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/readme/USAGE.rst
@@ -0,0 +1,8 @@
+#. Go to *Email Marketing > Mailings > Create*.
+#. Select "Event Registration" in *Recipients* field.
+#. Edit your mass mailing at wish, but remember to add a snippet from
+ *Footers*, so people have an *Unsubscribe* link.
+#. Send it.
+#. If somebody gets unsubscribed, it will get unsubscribed only for that
+ event, but including that mail in other event, the registree will still
+ receive mailings.
diff --git a/mass_mailing_custom_unsubscribe_event/static/description/icon.png b/mass_mailing_custom_unsubscribe_event/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/mass_mailing_custom_unsubscribe_event/static/description/index.html b/mass_mailing_custom_unsubscribe_event/static/description/index.html
new file mode 100644
index 000000000..66899cbe1
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/static/description/index.html
@@ -0,0 +1,439 @@
+
+
+
+
+
+
+Allow to unsubscribe discretely from an event
+
+
+
+
+
Allow to unsubscribe discretely from an event
+
+
+

+
This addon extends the unsubscription process for allowing to unsubscribe
+only for an event.
+
Standard process includes the mail in the general blacklist instead, which
+can be very unconvenient.
+
Table of contents
+
+
+
+
+- Go to Email Marketing > Mailings > Create.
+- Select “Event Registration” in Recipients field.
+- Edit your mass mailing at wish, but remember to add a snippet from
+Footers, so people have an Unsubscribe link.
+- Send it.
+- If somebody gets unsubscribed, it will get unsubscribed only for that
+event, but including that mail in other event, the registree will still
+receive mailings.
+
+
+
+
+
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.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
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.
+
This module is part of the OCA/social project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/mass_mailing_custom_unsubscribe_event/views/event_registration_views.xml b/mass_mailing_custom_unsubscribe_event/views/event_registration_views.xml
new file mode 100644
index 000000000..e754a1d33
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/views/event_registration_views.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+ event.registration.form - Add opt_out
+ event.registration
+
+
+
+
+
+
+
+
+
From 20a2c255aa995af4df26f55d549f3039081a3b09 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Marques?=
Date: Tue, 17 Nov 2020 14:24:27 +0000
Subject: [PATCH 2/5] [IMP] mass_mailing_custom_unsubscribe_event: black,
isort, prettier
---
mass_mailing_custom_unsubscribe_event/__manifest__.py | 9 ++-------
.../models/event_registration.py | 7 ++++---
2 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/mass_mailing_custom_unsubscribe_event/__manifest__.py b/mass_mailing_custom_unsubscribe_event/__manifest__.py
index d0bb44b16..a05202809 100644
--- a/mass_mailing_custom_unsubscribe_event/__manifest__.py
+++ b/mass_mailing_custom_unsubscribe_event/__manifest__.py
@@ -4,15 +4,10 @@
"name": "Allow to unsubscribe discretely from an event",
"category": "Marketing",
"version": "12.0.1.0.1",
- "depends": [
- "event",
- "mass_mailing_custom_unsubscribe",
- ],
+ "depends": ["event", "mass_mailing_custom_unsubscribe"],
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/social",
- "data": [
- "views/event_registration_views.xml",
- ],
+ "data": ["views/event_registration_views.xml"],
"license": "AGPL-3",
"installable": True,
"auto_install": True,
diff --git a/mass_mailing_custom_unsubscribe_event/models/event_registration.py b/mass_mailing_custom_unsubscribe_event/models/event_registration.py
index 1fd67a4d6..80afcd8ff 100644
--- a/mass_mailing_custom_unsubscribe_event/models/event_registration.py
+++ b/mass_mailing_custom_unsubscribe_event/models/event_registration.py
@@ -5,10 +5,11 @@ from odoo import fields, models
class EventRegistration(models.Model):
- _inherit = 'event.registration'
+ _inherit = "event.registration"
opt_out = fields.Boolean(
- string='Opt-Out',
+ string="Opt-Out",
help="If opt-out is checked, this registree has refused to receive "
- "emails for mass mailing and marketing campaign.")
+ "emails for mass mailing and marketing campaign.",
+ )
# No need of email field, as it already exists
From 4b06406868654fe6aad93e556f39a51a6725ad9f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Marques?=
Date: Wed, 18 Nov 2020 15:16:12 +0000
Subject: [PATCH 3/5] [MIG] mass_mailing_custom_unsubscribe_event: Migration to
13.0
Add tests
TT26693
---
.../README.rst | 11 +-
.../__manifest__.py | 4 +-
.../demo/assets.xml | 15 ++
.../mass_mailing_custom_unsubscribe_event.pot | 11 +-
.../readme/CONTRIBUTORS.rst | 1 +
.../static/description/index.html | 7 +-
.../static/src/js/tour.js | 45 +++++
.../tests/__init__.py | 4 +
.../tests/test_ui.py | 154 ++++++++++++++++++
.../views/event_registration_views.xml | 5 +-
10 files changed, 240 insertions(+), 17 deletions(-)
create mode 100644 mass_mailing_custom_unsubscribe_event/demo/assets.xml
create mode 100644 mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
create mode 100644 mass_mailing_custom_unsubscribe_event/tests/__init__.py
create mode 100644 mass_mailing_custom_unsubscribe_event/tests/test_ui.py
diff --git a/mass_mailing_custom_unsubscribe_event/README.rst b/mass_mailing_custom_unsubscribe_event/README.rst
index 10ecb4314..64fac68d2 100644
--- a/mass_mailing_custom_unsubscribe_event/README.rst
+++ b/mass_mailing_custom_unsubscribe_event/README.rst
@@ -14,13 +14,13 @@ Allow to unsubscribe discretely from an event
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github
- :target: https://github.com/OCA/social/tree/12.0/mass_mailing_custom_unsubscribe_event
+ :target: https://github.com/OCA/social/tree/13.0/mass_mailing_custom_unsubscribe_event
:alt: OCA/social
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/social-12-0/social-12-0-mass_mailing_custom_unsubscribe_event
+ :target: https://translation.odoo-community.org/projects/social-13-0/social-13-0-mass_mailing_custom_unsubscribe_event
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/205/12.0
+ :target: https://runbot.odoo-community.org/runbot/205/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -54,7 +54,7 @@ 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 `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -72,6 +72,7 @@ Contributors
* `Tecnativa `_:
* Pedro M. Baeza
+ * João Marques
Maintainers
~~~~~~~~~~~
@@ -86,6 +87,6 @@ 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.
-This module is part of the `OCA/social `_ project on GitHub.
+This module is part of the `OCA/social `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/mass_mailing_custom_unsubscribe_event/__manifest__.py b/mass_mailing_custom_unsubscribe_event/__manifest__.py
index a05202809..c36e0dd93 100644
--- a/mass_mailing_custom_unsubscribe_event/__manifest__.py
+++ b/mass_mailing_custom_unsubscribe_event/__manifest__.py
@@ -1,13 +1,15 @@
# Copyright 2020 Tecnativa - Pedro M. Baeza
+# Copyright 2020 Tecnativa - João Marques
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Allow to unsubscribe discretely from an event",
"category": "Marketing",
- "version": "12.0.1.0.1",
+ "version": "13.0.1.0.0",
"depends": ["event", "mass_mailing_custom_unsubscribe"],
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/social",
"data": ["views/event_registration_views.xml"],
+ "demo": ["demo/assets.xml"],
"license": "AGPL-3",
"installable": True,
"auto_install": True,
diff --git a/mass_mailing_custom_unsubscribe_event/demo/assets.xml b/mass_mailing_custom_unsubscribe_event/demo/assets.xml
new file mode 100644
index 000000000..c52ea4c61
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/demo/assets.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mass_mailing_custom_unsubscribe_event/i18n/mass_mailing_custom_unsubscribe_event.pot b/mass_mailing_custom_unsubscribe_event/i18n/mass_mailing_custom_unsubscribe_event.pot
index 829e503c2..e0bbb2f1a 100644
--- a/mass_mailing_custom_unsubscribe_event/i18n/mass_mailing_custom_unsubscribe_event.pot
+++ b/mass_mailing_custom_unsubscribe_event/i18n/mass_mailing_custom_unsubscribe_event.pot
@@ -1,12 +1,12 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * mass_mailing_custom_unsubscribe_event
+# * mass_mailing_custom_unsubscribe_event
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 12.0\n"
+"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"Last-Translator: <>\n"
+"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,11 +20,12 @@ msgstr ""
#. module: mass_mailing_custom_unsubscribe_event
#: model:ir.model.fields,help:mass_mailing_custom_unsubscribe_event.field_event_registration__opt_out
-msgid "If opt-out is checked, this registree has refused to receive emails for mass mailing and marketing campaign."
+msgid ""
+"If opt-out is checked, this registree has refused to receive emails for mass"
+" mailing and marketing campaign."
msgstr ""
#. module: mass_mailing_custom_unsubscribe_event
#: model:ir.model.fields,field_description:mass_mailing_custom_unsubscribe_event.field_event_registration__opt_out
msgid "Opt-Out"
msgstr ""
-
diff --git a/mass_mailing_custom_unsubscribe_event/readme/CONTRIBUTORS.rst b/mass_mailing_custom_unsubscribe_event/readme/CONTRIBUTORS.rst
index 2d4d7a884..769b9f27a 100644
--- a/mass_mailing_custom_unsubscribe_event/readme/CONTRIBUTORS.rst
+++ b/mass_mailing_custom_unsubscribe_event/readme/CONTRIBUTORS.rst
@@ -1,3 +1,4 @@
* `Tecnativa `_:
* Pedro M. Baeza
+ * João Marques
diff --git a/mass_mailing_custom_unsubscribe_event/static/description/index.html b/mass_mailing_custom_unsubscribe_event/static/description/index.html
index 66899cbe1..221a55237 100644
--- a/mass_mailing_custom_unsubscribe_event/static/description/index.html
+++ b/mass_mailing_custom_unsubscribe_event/static/description/index.html
@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This addon extends the unsubscription process for allowing to unsubscribe
only for an event.
Standard process includes the mail in the general blacklist instead, which
@@ -403,7 +403,7 @@ receive mailings.
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.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -419,6 +419,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
@@ -430,7 +431,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
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.
-
This module is part of the OCA/social project on GitHub.
+
This module is part of the OCA/social project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js b/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
new file mode 100644
index 000000000..3149fa9b6
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
@@ -0,0 +1,45 @@
+/* Copyright 2020 Tecnativa - João Marques
+ * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
+odoo.define("mass_mailing_custom_unsubscribe_event.tour", function(require) {
+ "use strict";
+ var base = require("web_editor.base");
+ var tour = require("web_tour.tour");
+
+ // Allow to know if an element is required
+ $.extend($.expr[":"], {
+ propRequired: function(element) {
+ return $(element).prop("required");
+ },
+ });
+
+ tour.register(
+ "mass_mailing_custom_unsubscribe_event_tour",
+ {
+ test: true,
+ wait_for: base.ready(),
+ },
+ [
+ {
+ content: "Choose other reason",
+ trigger: ".radio:contains('Other reason') :radio:not(:checked)",
+ extra_trigger: "#reason_form #custom_div_feedback",
+ },
+ {
+ content: "Switch to not interested reason",
+ trigger: '.radio:contains("I\'m not interested") :radio:not(:checked)',
+ extra_trigger: "[name='details']:propRequired",
+ },
+ {
+ content: "Unsubscribe",
+ trigger: "#reason_form button:submit",
+ extra_trigger: "body:not(:has([name='details']:propRequired))",
+ },
+ {
+ content: "Successfully unsubscribed",
+ trigger:
+ "body:not(:has(#reason_form)) #subscription_info " +
+ ":contains('successfully unsubscribed')",
+ },
+ ]
+ );
+});
diff --git a/mass_mailing_custom_unsubscribe_event/tests/__init__.py b/mass_mailing_custom_unsubscribe_event/tests/__init__.py
new file mode 100644
index 000000000..d88d3b1a1
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/tests/__init__.py
@@ -0,0 +1,4 @@
+# Copyright 2020 Tecnativa - João Marques
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import test_ui
diff --git a/mass_mailing_custom_unsubscribe_event/tests/test_ui.py b/mass_mailing_custom_unsubscribe_event/tests/test_ui.py
new file mode 100644
index 000000000..8b62418bd
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/tests/test_ui.py
@@ -0,0 +1,154 @@
+# Copyright 2020 Tecnativa - João Marques
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+import mock
+from werkzeug import urls
+
+from odoo.tests.common import HttpCase
+
+
+class UICase(HttpCase):
+ def extract_url(self, mail, *args, **kwargs):
+ url = mail._get_unsubscribe_url(self.email)
+ self.assertTrue(urls.url_parse(url).decode_query().get("token"))
+ self.assertTrue(url.startswith(self.domain))
+ self.url = url.replace(self.domain, "", 1)
+ return True
+
+ def setUp(self):
+ super(UICase, self).setUp()
+ self.email = "test.contact@example.com"
+ self.mail_postprocess_patch = mock.patch(
+ "odoo.addons.mass_mailing.models.mail_mail.MailMail."
+ "_postprocess_sent_message",
+ autospec=True,
+ side_effect=self.extract_url,
+ )
+
+ self.domain = self.env["ir.config_parameter"].get_param("web.base.url")
+
+ self.partner = self.env["res.partner"].create(
+ {"name": "Demo Partner <%s>" % self.email, "email": self.email}
+ )
+
+ self.event_1 = self.env["event.event"].create(
+ {
+ "name": "test_event_2",
+ "event_type_id": 1,
+ "date_end": "2012-01-01 19:05:15",
+ "date_begin": "2012-01-01 18:05:15",
+ }
+ )
+ self.event_2 = self.env["event.event"].create(
+ {
+ "name": "test_event_2",
+ "event_type_id": 1,
+ "date_end": "2012-01-01 19:05:15",
+ "date_begin": "2012-01-01 18:05:15",
+ }
+ )
+ self.event_registration_1 = self.env["event.registration"].create(
+ {
+ "name": "test_registration_1",
+ "event_id": self.event_1.id,
+ "email": self.email,
+ "partner_id": self.partner.id,
+ }
+ )
+ self.event_registration_2 = self.env["event.registration"].create(
+ {
+ "name": "test_registration_2",
+ "event_id": self.event_2.id,
+ "email": self.email,
+ "partner_id": self.partner.id,
+ }
+ )
+
+ self.mailing_1 = self.env["mailing.mailing"].create(
+ {
+ "name": "test_mailing_1",
+ "mailing_model_id": self.env.ref("event.model_event_registration").id,
+ "mailing_domain": "[['id','=',%s]]" % self.event_registration_1.id,
+ "reply_to_mode": "email",
+ "subject": "Test 1",
+ }
+ )
+ self.mailing_1._onchange_model_and_list()
+ # HACK https://github.com/odoo/odoo/pull/14429
+ self.mailing_1.body_html = """
+
+ """
+
+ self.mailing_2 = self.env["mailing.mailing"].create(
+ {
+ "name": "test_mailing_2",
+ "mailing_model_id": self.env.ref("event.model_event_registration").id,
+ "mailing_domain": "[['id','=',%s]]" % self.event_registration_2.id,
+ "reply_to_mode": "email",
+ "subject": "Test 2",
+ }
+ )
+ self.mailing_2._onchange_model_and_list()
+ # HACK https://github.com/odoo/odoo/pull/14429
+ self.mailing_2.body_html = """
+
+ """
+
+ def tearDown(self):
+ del (
+ self.email,
+ self.event_1,
+ self.event_2,
+ self.event_registration_1,
+ self.event_registration_2,
+ self.mailing_1,
+ self.mailing_2,
+ self.partner,
+ self.url,
+ )
+ super(UICase, self).tearDown()
+
+ def test_unsubscription_event_1(self):
+ """Test a mass mailing contact that wants to unsubscribe."""
+ # Extract the unsubscription link from the message body
+ with self.mail_postprocess_patch:
+ self.mailing_1.action_send_mail()
+
+ tour = "mass_mailing_custom_unsubscribe_event_tour"
+ self.start_tour(url_path=self.url, tour_name=tour, login="demo")
+
+ # Check results from running tour
+ # User should be opted out from event 1 mailing list
+ self.assertTrue(self.event_registration_1.opt_out)
+ # User should not be opted out from event 2 mailing list
+ self.assertFalse(self.event_registration_2.opt_out)
+
+ reason_xid = "mass_mailing_custom_unsubscribe.reason_not_interested"
+ unsubscriptions = self.env["mail.unsubscription"].search(
+ [
+ ("action", "=", "unsubscription"),
+ ("mass_mailing_id", "=", self.mailing_1.id),
+ ("email", "=", self.email),
+ (
+ "unsubscriber_id",
+ "=",
+ "event.registration,%d" % self.event_registration_1.id,
+ ),
+ ("details", "=", False),
+ ("reason_id", "=", self.env.ref(reason_xid).id),
+ ]
+ )
+ # Unsubscription record must exist
+ self.assertEqual(1, len(unsubscriptions))
+
+ self.mailing_2.action_send_mail()
+
+ # Mail to user must have been sent
+ self.assertEqual(1, self.mailing_2.sent)
diff --git a/mass_mailing_custom_unsubscribe_event/views/event_registration_views.xml b/mass_mailing_custom_unsubscribe_event/views/event_registration_views.xml
index e754a1d33..a637637e0 100644
--- a/mass_mailing_custom_unsubscribe_event/views/event_registration_views.xml
+++ b/mass_mailing_custom_unsubscribe_event/views/event_registration_views.xml
@@ -1,13 +1,12 @@
-
+
-
event.registration.form - Add opt_out
event.registration
-
+
From 7b995b6dee7c0fc98908723c4de769b2629cc98c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luis=20Ernesto=20Garc=C3=ADa=20Medina?=
Date: Wed, 8 Mar 2023 08:32:27 -0600
Subject: [PATCH 4/5] [IMP] mass_mailing_custom_unsubscribe_event: black,
isort, prettier
---
mass_mailing_custom_unsubscribe_event/static/src/js/tour.js | 4 ++--
.../odoo/addons/mass_mailing_custom_unsubscribe_event | 1 +
setup/mass_mailing_custom_unsubscribe_event/setup.py | 6 ++++++
3 files changed, 9 insertions(+), 2 deletions(-)
create mode 120000 setup/mass_mailing_custom_unsubscribe_event/odoo/addons/mass_mailing_custom_unsubscribe_event
create mode 100644 setup/mass_mailing_custom_unsubscribe_event/setup.py
diff --git a/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js b/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
index 3149fa9b6..7d9cc6d6b 100644
--- a/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
+++ b/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
@@ -1,13 +1,13 @@
/* Copyright 2020 Tecnativa - João Marques
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
-odoo.define("mass_mailing_custom_unsubscribe_event.tour", function(require) {
+odoo.define("mass_mailing_custom_unsubscribe_event.tour", function (require) {
"use strict";
var base = require("web_editor.base");
var tour = require("web_tour.tour");
// Allow to know if an element is required
$.extend($.expr[":"], {
- propRequired: function(element) {
+ propRequired: function (element) {
return $(element).prop("required");
},
});
diff --git a/setup/mass_mailing_custom_unsubscribe_event/odoo/addons/mass_mailing_custom_unsubscribe_event b/setup/mass_mailing_custom_unsubscribe_event/odoo/addons/mass_mailing_custom_unsubscribe_event
new file mode 120000
index 000000000..24aa35046
--- /dev/null
+++ b/setup/mass_mailing_custom_unsubscribe_event/odoo/addons/mass_mailing_custom_unsubscribe_event
@@ -0,0 +1 @@
+../../../../mass_mailing_custom_unsubscribe_event
\ No newline at end of file
diff --git a/setup/mass_mailing_custom_unsubscribe_event/setup.py b/setup/mass_mailing_custom_unsubscribe_event/setup.py
new file mode 100644
index 000000000..28c57bb64
--- /dev/null
+++ b/setup/mass_mailing_custom_unsubscribe_event/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+ setup_requires=['setuptools-odoo'],
+ odoo_addon=True,
+)
From b5828437e5bf38469ded992036b18491c9768cbc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luis=20Ernesto=20Garc=C3=ADa=20Medina?=
Date: Wed, 8 Mar 2023 11:44:36 -0600
Subject: [PATCH 5/5] [MIG] mass_mailing_custom_unsubscribe_event: Migration to
15.0
---
.../__manifest__.py | 8 +++-
.../demo/assets.xml | 15 -------
.../static/src/js/tour.esm.js | 36 +++++++++++++++
.../static/src/js/tour.js | 45 -------------------
.../tests/test_ui.py | 27 ++++-------
5 files changed, 50 insertions(+), 81 deletions(-)
delete mode 100644 mass_mailing_custom_unsubscribe_event/demo/assets.xml
create mode 100644 mass_mailing_custom_unsubscribe_event/static/src/js/tour.esm.js
delete mode 100644 mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
diff --git a/mass_mailing_custom_unsubscribe_event/__manifest__.py b/mass_mailing_custom_unsubscribe_event/__manifest__.py
index c36e0dd93..3543c8f34 100644
--- a/mass_mailing_custom_unsubscribe_event/__manifest__.py
+++ b/mass_mailing_custom_unsubscribe_event/__manifest__.py
@@ -4,12 +4,16 @@
{
"name": "Allow to unsubscribe discretely from an event",
"category": "Marketing",
- "version": "13.0.1.0.0",
+ "version": "15.0.1.0.0",
"depends": ["event", "mass_mailing_custom_unsubscribe"],
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/social",
"data": ["views/event_registration_views.xml"],
- "demo": ["demo/assets.xml"],
+ "assets": {
+ "web.assets_tests": [
+ "/mass_mailing_custom_unsubscribe_event/static/src/js/tour.esm.js"
+ ]
+ },
"license": "AGPL-3",
"installable": True,
"auto_install": True,
diff --git a/mass_mailing_custom_unsubscribe_event/demo/assets.xml b/mass_mailing_custom_unsubscribe_event/demo/assets.xml
deleted file mode 100644
index c52ea4c61..000000000
--- a/mass_mailing_custom_unsubscribe_event/demo/assets.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/mass_mailing_custom_unsubscribe_event/static/src/js/tour.esm.js b/mass_mailing_custom_unsubscribe_event/static/src/js/tour.esm.js
new file mode 100644
index 000000000..0ded979e6
--- /dev/null
+++ b/mass_mailing_custom_unsubscribe_event/static/src/js/tour.esm.js
@@ -0,0 +1,36 @@
+/** @odoo-module **/
+
+/* Copyright 2020 Tecnativa - João Marques
+ * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
+
+import tour from "web_tour.tour";
+
+tour.register(
+ "mass_mailing_custom_unsubscribe_event_tour",
+ {
+ test: true,
+ },
+ [
+ {
+ content: "Choose other reason",
+ trigger: ".radio:contains('Other reason') :radio:not(:checked)",
+ extra_trigger: "#reason_form #custom_div_feedback",
+ },
+ {
+ content: "Switch to not interested reason",
+ trigger: '.radio:contains("I\'m not interested") :radio:not(:checked)',
+ extra_trigger: "[name='details']:propRequired",
+ },
+ {
+ content: "Unsubscribe",
+ trigger: "#reason_form button:submit",
+ extra_trigger: "body:not(:has([name='details']:propRequired))",
+ },
+ {
+ content: "Successfully unsubscribed",
+ trigger:
+ "body:not(:has(#reason_form)) #subscription_info " +
+ ":contains('successfully unsubscribed')",
+ },
+ ]
+);
diff --git a/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js b/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
deleted file mode 100644
index 7d9cc6d6b..000000000
--- a/mass_mailing_custom_unsubscribe_event/static/src/js/tour.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Copyright 2020 Tecnativa - João Marques
- * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
-odoo.define("mass_mailing_custom_unsubscribe_event.tour", function (require) {
- "use strict";
- var base = require("web_editor.base");
- var tour = require("web_tour.tour");
-
- // Allow to know if an element is required
- $.extend($.expr[":"], {
- propRequired: function (element) {
- return $(element).prop("required");
- },
- });
-
- tour.register(
- "mass_mailing_custom_unsubscribe_event_tour",
- {
- test: true,
- wait_for: base.ready(),
- },
- [
- {
- content: "Choose other reason",
- trigger: ".radio:contains('Other reason') :radio:not(:checked)",
- extra_trigger: "#reason_form #custom_div_feedback",
- },
- {
- content: "Switch to not interested reason",
- trigger: '.radio:contains("I\'m not interested") :radio:not(:checked)',
- extra_trigger: "[name='details']:propRequired",
- },
- {
- content: "Unsubscribe",
- trigger: "#reason_form button:submit",
- extra_trigger: "body:not(:has([name='details']:propRequired))",
- },
- {
- content: "Successfully unsubscribed",
- trigger:
- "body:not(:has(#reason_form)) #subscription_info " +
- ":contains('successfully unsubscribed')",
- },
- ]
- );
-});
diff --git a/mass_mailing_custom_unsubscribe_event/tests/test_ui.py b/mass_mailing_custom_unsubscribe_event/tests/test_ui.py
index 8b62418bd..55c913d10 100644
--- a/mass_mailing_custom_unsubscribe_event/tests/test_ui.py
+++ b/mass_mailing_custom_unsubscribe_event/tests/test_ui.py
@@ -1,21 +1,23 @@
# Copyright 2020 Tecnativa - João Marques
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-import mock
+from unittest import mock
+
from werkzeug import urls
-from odoo.tests.common import HttpCase
+from odoo.tests.common import HttpCase, tagged
+@tagged("post_install", "-at_install")
class UICase(HttpCase):
def extract_url(self, mail, *args, **kwargs):
- url = mail._get_unsubscribe_url(self.email)
+ url = mail.mailing_id._get_unsubscribe_url(self.email, mail.res_id)
self.assertTrue(urls.url_parse(url).decode_query().get("token"))
self.assertTrue(url.startswith(self.domain))
self.url = url.replace(self.domain, "", 1)
return True
def setUp(self):
- super(UICase, self).setUp()
+ super().setUp()
self.email = "test.contact@example.com"
self.mail_postprocess_patch = mock.patch(
"odoo.addons.mass_mailing.models.mail_mail.MailMail."
@@ -23,13 +25,11 @@ class UICase(HttpCase):
autospec=True,
side_effect=self.extract_url,
)
-
self.domain = self.env["ir.config_parameter"].get_param("web.base.url")
self.partner = self.env["res.partner"].create(
{"name": "Demo Partner <%s>" % self.email, "email": self.email}
)
-
self.event_1 = self.env["event.event"].create(
{
"name": "test_event_2",
@@ -62,18 +62,15 @@ class UICase(HttpCase):
"partner_id": self.partner.id,
}
)
-
self.mailing_1 = self.env["mailing.mailing"].create(
{
"name": "test_mailing_1",
"mailing_model_id": self.env.ref("event.model_event_registration").id,
"mailing_domain": "[['id','=',%s]]" % self.event_registration_1.id,
- "reply_to_mode": "email",
+ "reply_to_mode": "update",
"subject": "Test 1",
}
)
- self.mailing_1._onchange_model_and_list()
- # HACK https://github.com/odoo/odoo/pull/14429
self.mailing_1.body_html = """
"""
-
self.mailing_2 = self.env["mailing.mailing"].create(
{
"name": "test_mailing_2",
"mailing_model_id": self.env.ref("event.model_event_registration").id,
"mailing_domain": "[['id','=',%s]]" % self.event_registration_2.id,
- "reply_to_mode": "email",
+ "reply_to_mode": "update",
"subject": "Test 2",
}
)
- self.mailing_2._onchange_model_and_list()
- # HACK https://github.com/odoo/odoo/pull/14429
self.mailing_2.body_html = """