diff --git a/analytical/templatetags/matomo.py b/analytical/templatetags/matomo.py index 98bdf8a..00dd88d 100644 --- a/analytical/templatetags/matomo.py +++ b/analytical/templatetags/matomo.py @@ -41,7 +41,31 @@ TRACKING_CODE = """ VARIABLE_CODE = '_paq.push(["setCustomVariable", %(index)s, "%(name)s", "%(value)s", "%(scope)s"]);' # noqa IDENTITY_CODE = '_paq.push(["setUserId", "%(userid)s"]);' -DISABLE_COOKIES_CODE = '_paq.push([\'disableCookies\']);' +DISABLE_COOKIES_CODE = "_paq.push(['disableCookies']);" + +GIVE_CONSENT_CLASS = "piwik_give_consent" +REMOVE_CONSENT_CLASS = "piwik_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' @@ -96,6 +120,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(variables_code, ( diff --git a/analytical/tests/test_tag_matomo.py b/analytical/tests/test_tag_matomo.py index d3d6785..01e6cb2 100644 --- a/analytical/tests/test_tag_matomo.py +++ b/analytical/tests/test_tag_matomo.py @@ -150,3 +150,8 @@ class MatomoTagTestCase(TagTestCase): def test_disable_cookies(self): r = MatomoNode().render(Context({})) self.assertTrue("_paq.push(['disableCookies']);" in r, r) + + @override_settings(PIWIK_ASK_FOR_CONSENT=True) + def test_ask_for_consent(self): + r = PiwikNode().render(Context({})) + self.assertTrue("_paq.push(['requireConsent']);" in r, r) \ No newline at end of file diff --git a/docs/services/matomo.rst b/docs/services/matomo.rst index 0aa4731..8527795 100644 --- a/docs/services/matomo.rst +++ b/docs/services/matomo.rst @@ -149,6 +149,26 @@ 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: + +`piwik_give_consent` - class name for element to click when visitors want to **give** consent +`piwik_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 ---------------------