diff --git a/analytical/templatetags/matomo.py b/analytical/templatetags/matomo.py index 15334fb..4e912cf 100644 --- a/analytical/templatetags/matomo.py +++ b/analytical/templatetags/matomo.py @@ -43,6 +43,7 @@ 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\']);' +CUSTOM_COMMAND_CODE = '_paq.push([%(args)s]);' DEFAULT_SCOPE = 'page' @@ -86,6 +87,7 @@ class MatomoNode(Node): def render(self, context): custom_variables = context.get('matomo_vars', ()) + custom_commands = context.get('matomo_commands', []) complete_variables = (var if len(var) >= 4 else var + (DEFAULT_SCOPE,) for var in custom_variables) @@ -94,6 +96,12 @@ class MatomoNode(Node): for var in complete_variables) commands = [] + + for custom_command in custom_commands: + args = ', '.join('"%s"' % arg if isinstance(arg, str) else str(arg) + for arg in custom_command) + commands.append(CUSTOM_COMMAND_CODE % {'args': args}) + if getattr(settings, 'MATOMO_DISABLE_COOKIES', False): commands.append(DISABLE_COOKIES_CODE) diff --git a/docs/services/matomo.rst b/docs/services/matomo.rst index d6a5b83..5ac8e61 100644 --- a/docs/services/matomo.rst +++ b/docs/services/matomo.rst @@ -109,6 +109,25 @@ in :file:`settings.py`. .. _`custom variables`: http://developer.matomo.org/guides/tracking-javascript-guide#custom-variables +User commands +------------- + +Matomo commands that uses ``_paq.push()`` can be passed using context variable +``matomo_commands`` similar user variables using a list. :: + + context = Context({ + 'matomo_commands': [['setIgnoreClasses', 'no-tracking'], + ['setDocumentTitle', 'foobar'], + ['tackGoal', 1, 1000.01]] + }) + return some_template.render(context) + +This generates following JavaScript code. :: + + _paq.push(["setIgnoreClasses", "no-tracking"]); + _paq.push(["setDocumentTitle", "foobar"]); + _paq.push(["tackGoal", 1, 1000.01]); + .. _matomo-user-tracking: User tracking diff --git a/tests/unit/test_tag_matomo.py b/tests/unit/test_tag_matomo.py index f842d29..3f54f33 100644 --- a/tests/unit/test_tag_matomo.py +++ b/tests/unit/test_tag_matomo.py @@ -113,6 +113,16 @@ class MatomoTagTestCase(TagTestCase): '_paq.push(["setCustomVariable", 3, "spam", "spam_val", "visit"]);']: assert var_code in r + def test_user_commands(self): + context = Context({'matomo_commands': [['setIgnoreClasses', 'no-tracking'], + ['setDocumentTitle', 'foobar'], + ['tackGoal', 1, 1000.01]]}) + r = MatomoNode().render(context) + for var_code in ['_paq.push(["setIgnoreClasses", "no-tracking"]);', + '_paq.push(["setDocumentTitle", "foobar"]);', + '_paq.push(["tackGoal", 1, 1000.01]);']: + assert var_code in r + @override_settings(ANALYTICAL_AUTO_IDENTIFY=True) def test_default_usertrack(self): context = Context({