Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
5671fca
[ADD] mass_mailing_custom_unsubscribe addon
antespi Aug 19, 2015
896a4c9
[MIG] Make modules uninstallable
pedrobaeza Oct 14, 2015
00bbc2d
[FIX] remove en.po that was erroneously created by transbot
sbidoul Aug 15, 2016
8199bfb
[MIG] Rename manifest files
pedrobaeza Oct 6, 2016
a5e3471
Add beautier pages for unsubscription process.
yajo Sep 25, 2015
f549b40
[8.0][IMP][mass_mailing_custom_unsubscribe] Get reasons for unsubscri…
yajo Jul 25, 2016
9d8feb0
[9.0][MIG][mass_mailing_custom_unsubscribe] Migrate.
yajo Nov 11, 2016
a1026ff
[MIG][mass_mailing_custom_unsubscribe] Migrate to v10
yajo Jul 5, 2017
a185c6a
[IMP] mass_mailing_custom_unsubscribe: GDPR compliance (#267)
yajo May 10, 2018
0fde0bd
[MIG] mass_mailing_custom_unsubscribe: Migration to 11.0
chienandalu May 25, 2018
cde6f0d
[FIX] do not use section titles in readme fragments
sbidoul Jun 16, 2018
391e9d7
Translated using Weblate (French)
didierdonze Jun 18, 2018
48adae1
mass_mailing_custom_unsubscribe: Fix testing error
ernestotejeda Jun 19, 2018
ca70c83
[MIG] mass_mailing_custom_unsubscribe: Migration to 12.0
ernestotejeda Apr 5, 2019
4de3c8d
Translated using Weblate (Slovenian)
sysadminmatmoz Mar 30, 2020
1ecd1d1
[ADD] mass_mailing_custom_unsubscribe_event: Allow to unsubscribe dis…
pedrobaeza Jun 19, 2020
f3398e9
[FIX] mass_mailing_custom_unsubscribe: mailing contact contains `opt_…
pedrobaeza Jun 30, 2020
71656d9
[IMP] mass_mailing_custom_unsubscribe: black, isort, prettier
CarlosRoca13 Aug 24, 2020
2a9f1e0
[MIG] mass_mailing_custom_unsubscribe: Migration to v13.0
CarlosRoca13 Aug 26, 2020
a4e1455
[FIX] mass_mailing_custom_unsubscribe: Added the changes to avoid the…
CarlosRoca13 Aug 28, 2020
f616b7f
[IMP] pre-commit run -a
Jan 26, 2021
6898c95
[IMP] mass_mailing_custom_unsubscribe: chatter permissions
chienandalu Mar 30, 2021
e652e8b
[FIX] mass_mailing_custom_unsubscribe: contacts model rename
chienandalu Jun 11, 2021
8fca566
[IMP] mass_mailing_custom_unsubscribe: black, isort, prettier
Jul 21, 2021
8d0c4d3
[MIG] mass_mailing_custom_unsubscribe: Migration to 14.0
Jul 21, 2021
8e6e0ee
[MIG] mass_mailing_custom_unsubscribe: Migration to 15.0
Dec 16, 2022
91f3451
Translated using Weblate (Italian)
mymage Mar 23, 2023
5bdbf9c
Translated using Weblate (Spanish)
Ivorra78 Oct 19, 2023
c612203
Update translation files
weblate Oct 28, 2023
a40bc3d
[MIG] mass_mailing_custom_unsubscribe: Migration to 16.0
carolinafernandez-tecnativa Feb 26, 2024
4e784cc
[MIG] mass_mailing_custom_unsubscribe: Continue migration to version …
pilarvargas-tecnativa Feb 27, 2024
7642444
Translated using Weblate (Italian)
mymage Mar 5, 2024
8ba2bda
[FIX] mass_mailing_custom_unsubscribe: fix warning from override crea…
pilarvargas-tecnativa Apr 2, 2024
71cfb4d
[IMP] mass_mailing_custom_unsubscribe: pre-commit auto fixes
chienandalu Jul 8, 2024
bb64db6
[MIG] mass_mailing_custom_unsubscribe: Migration to 17.0
chienandalu Jul 15, 2024
c055362
[17.0][FIX] mass_mailing_custom_unsubscribe: Error migration SQL
FernandoRomera Apr 10, 2025
052d29e
[MIG] mass_mailing_custom_unsubscribe: Migration to version 18.0
carlos-lopez-tecnativa Apr 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 100 additions & 0 deletions mass_mailing_custom_unsubscribe/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
====================================
Mass mailing unsubscription metadata
====================================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:bf0d97009da282877f64b12125b492791a4793a784f6bf5d564bf5f17f3b762e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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/18.0/mass_mailing_custom_unsubscribe
:alt: OCA/social
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/social-18-0/social-18-0-mass_mailing_custom_unsubscribe
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/social&target_branch=18.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This addon extends the Odoo subscription engine to provide proof on why
you are sending mass mailings to a given contact, as required by the
GDPR in Europe.

**Table of contents**

.. contents::
:local:

Usage
=====

Once configured:

1. Go to *Email Marketing > Mailings > Create*.
2. Edit your mass mailing at wish, but remember to add a snippet from
*Footers*, so people have an *Unsubscribe* link.
3. Send it.
4. If somebody gets unsubscribed, you will see logs about that under
*Email Marketing > Unsubscriptions*.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/social/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/social/issues/new?body=module:%20mass_mailing_custom_unsubscribe%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Tecnativa

Contributors
------------

- `Tecnativa <https://www.tecnativa.com>`__:

- Rafael Blasco
- Antonio Espinosa
- Jairo Llopis
- David Vidal
- Ernesto Tejeda
- Pedro M. Baeza
- Carlos Roca
- Pilar Vargas
- Carlos Lopez

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 <https://github.com/OCA/social/tree/18.0/mass_mailing_custom_unsubscribe>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
4 changes: 4 additions & 0 deletions mass_mailing_custom_unsubscribe/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import controllers
from . import models
24 changes: 24 additions & 0 deletions mass_mailing_custom_unsubscribe/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Copyright 2016 Tecnativa - Jairo Llopis
# Copyright 2018 Tecnativa - David Vidal
# Copyright 2020 Tecnativa - Pedro M. Baeza
# Copyright 2024 Tecnativa - Carolina Fernandez
# Copyright 2024 Tecnativa - David Vidal
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Mass mailing unsubscription metadata",
"summary": "Track metadata for GDPR compliance",
"category": "Marketing",
"version": "18.0.1.0.0",
"depends": ["mass_mailing"],
"data": [
"views/mail_subscription_view.xml",
],
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/social",
"license": "AGPL-3",
"assets": {
"web.assets_tests": [
"mass_mailing_custom_unsubscribe/static/tests/**/*",
],
},
}
4 changes: 4 additions & 0 deletions mass_mailing_custom_unsubscribe/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2016 Jairo Llopis <jairo.llopis@tecnativa.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import main
86 changes: 86 additions & 0 deletions mass_mailing_custom_unsubscribe/controllers/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Copyright 2015 Antiun Ingeniería S.L. (http://www.antiun.com)
# Copyright 2016 Tecnativa - Jairo Llopis
# Copyright 2020 Tecnativa - Pedro M. Baeza
# Copyright 2024 Tecnativa - David Vidal
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.http import request, route

from odoo.addons.mass_mailing.controllers.main import MassMailController


class CustomUnsubscribe(MassMailController):
def _mailing_unsubscribe_from_list(self, mailing, document_id, email, hash_token):
self._add_metadata()
return super()._mailing_unsubscribe_from_list(
mailing, document_id, email, hash_token
)

def _mailing_unsubscribe_from_document(
self, mailing, document_id, email, hash_token
):
self._add_metadata()
return super()._mailing_unsubscribe_from_document(
mailing, document_id, email, hash_token
)

@route()
def mailing_update_list_subscription(
self,
mailing_id=None,
document_id=None,
email=None,
hash_token=None,
lists_optin_ids=None,
**post,
):
self._add_metadata()
return super().mailing_update_list_subscription(
mailing_id, document_id, email, hash_token, lists_optin_ids, **post
)

@route()
def mail_blocklist_add(
self, mailing_id=None, document_id=None, email=None, hash_token=None
):
self._add_metadata()
return super().mail_blocklist_add(mailing_id, document_id, email, hash_token)

@route()
def mail_blocklist_remove(
self, mailing_id=None, document_id=None, email=None, hash_token=None
):
self._add_metadata()
return super().mail_blocklist_remove(mailing_id, document_id, email, hash_token)

@route()
def mailing_send_feedback(
self,
mailing_id=None,
document_id=None,
email=None,
hash_token=None,
last_action=None,
opt_out_reason_id=False,
feedback=None,
**post,
):
self._add_metadata()
return super().mailing_send_feedback(
mailing_id,
document_id,
email,
hash_token,
last_action,
opt_out_reason_id,
feedback,
**post,
)

def _add_metadata(self):
extra_context = {
"metadata": "\n".join(
f"{val}: {request.httprequest.headers.environ.get(val)}"
for val in ("REMOTE_ADDR", "HTTP_USER_AGENT", "HTTP_ACCEPT_LANGUAGE")
),
}
request.update_context(**extra_context)
Loading