diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 4f3cc3f..9100a8d 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -3,6 +3,7 @@
* Fix GA gtag user_id setup and add support for custom dimensions (Erick Massip)
* Change spelling of "JavaScript" across all files in docstrings and docs
(Peter Bittner)
+* Ask site visitors for consent when using Matomo (Julian Haluska & Ronard Luna)
Version 3.2.0
-------------
diff --git a/analytical/templatetags/matomo.py b/analytical/templatetags/matomo.py
index 2509150..4ff6c2e 100644
--- a/analytical/templatetags/matomo.py
+++ b/analytical/templatetags/matomo.py
@@ -46,6 +46,30 @@ VARIABLE_CODE = (
IDENTITY_CODE = '_paq.push(["setUserId", "%(userid)s"]);'
DISABLE_COOKIES_CODE = "_paq.push(['disableCookies']);"
+GIVE_CONSENT_CLASS = 'matomo_give_consent'
+REMOVE_CONSENT_CLASS = 'matomo_remove_consent'
+ASK_FOR_CONSENT_CODE = """
+_paq.push(['requireConsent']);
+
+var elements = document.getElementsByClassName("{}");
+for (var i = 0; i < elements.length; i++) {{
+ elements[i].addEventListener("click",
+ function () {{
+ _paq.push(["forgetConsentGiven"]);
+ }}
+ );
+}}
+
+var elements = document.getElementsByClassName("{}");
+for (var i = 0; i < elements.length; i++) {{
+ elements[i].addEventListener("click",
+ function () {{
+ _paq.push(["rememberConsentGiven"]);
+ }}
+ );
+}}
+""".format(REMOVE_CONSENT_CLASS, GIVE_CONSENT_CLASS)
+
DEFAULT_SCOPE = 'page'
MatomoVar = namedtuple('MatomoVar', ('index', 'name', 'value', 'scope'))
@@ -103,6 +127,9 @@ class MatomoNode(Node):
if getattr(settings, 'MATOMO_DISABLE_COOKIES', False):
commands.append(DISABLE_COOKIES_CODE)
+ if getattr(settings, 'MATOMO_ASK_FOR_CONSENT', False):
+ commands.append(ASK_FOR_CONSENT_CODE)
+
userid = get_identity(context, 'matomo')
if userid is not None:
variables_code = chain(
diff --git a/docs/services/matomo.rst b/docs/services/matomo.rst
index 2aad059..a59394f 100644
--- a/docs/services/matomo.rst
+++ b/docs/services/matomo.rst
@@ -149,6 +149,28 @@ If you want to `disable cookies`_, set :data:`MATOMO_DISABLE_COOKIES` to
.. _`disable cookies`: https://matomo.org/faq/general/faq_157/
+Ask for consent
+---------------
+
+If you do not want to track visitors without permission, you can `ask for consent`_ first.
+To enable this, set :data:`MATOMO_ASK_FOR_CONSENT` to :const:`True`.
+By default, no consent for tracking is needed (i.e. :const:`False`).
+
+To give and remove consent in your page, create DOM elements with the following classes:
+
+`matomo_give_consent` - class name for element to click when visitors want to **give** consent
+`matomo_remove_consent` - class name for element to click when visitors want to **remove** consent
+
+Examples::
+
+ # button to allow tracking
+
+
+ # button to remove tracking consent
+
+
+.. _`asking for consent`: https://developer.matomo.org/guides/tracking-javascript-guide#asking-for-consent
+
Internal IP addresses
---------------------
diff --git a/pyproject.toml b/pyproject.toml
index b51a2f8..bee00a3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -59,6 +59,8 @@ authors = [
{name = "Tinnet Coronam", email = "tinnet@coronam.net"},
{name = "Uros Trebec", email = "uros@trebec.org"},
{name = "Walter Renner", email = "walter.renner@me.com"},
+ {name = "Julian Haluska", email = "mail@julianhaluska.de"},
+ {name = "Ronard Luna", email = "rlunag@proton.me"},
]
maintainers = [
{name = "Jazzband community", email = "jazzband-bot@users.noreply.github.com"},
diff --git a/tests/unit/test_tag_matomo.py b/tests/unit/test_tag_matomo.py
index 0765c12..c6ebd93 100644
--- a/tests/unit/test_tag_matomo.py
+++ b/tests/unit/test_tag_matomo.py
@@ -159,3 +159,8 @@ class MatomoTagTestCase(TagTestCase):
def test_disable_cookies(self):
r = MatomoNode().render(Context({}))
assert "_paq.push(['disableCookies']);" in r
+
+ @override_settings(MATOMO_ASK_FOR_CONSENT=True)
+ def test_ask_for_consent(self):
+ r = MatomoNode().render(Context({}))
+ self.assertTrue("_paq.push(['requireConsent']);" in r, r)