mirror of
https://github.com/jazzband/django-analytical.git
synced 2026-03-16 22:20:25 +00:00
Compare commits
6 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e6f12719cc | ||
|
|
694fc9097a | ||
|
|
10102d1017 | ||
|
|
033d2dc02f | ||
|
|
4ea4605791 | ||
|
|
7253a3a048 |
54 changed files with 263 additions and 109 deletions
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
|
@ -37,7 +37,7 @@ jobs:
|
||||||
|
|
||||||
- name: Upload packages to Jazzband
|
- name: Upload packages to Jazzband
|
||||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
|
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
|
||||||
uses: pypa/gh-action-pypi-publish@master
|
uses: pypa/gh-action-pypi-publish@release/v1
|
||||||
with:
|
with:
|
||||||
user: jazzband
|
user: jazzband
|
||||||
password: ${{ secrets.JAZZBAND_RELEASE_KEY }}
|
password: ${{ secrets.JAZZBAND_RELEASE_KEY }}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,10 @@
|
||||||
|
(unreleased)
|
||||||
|
------------
|
||||||
|
* 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
|
Version 3.2.0
|
||||||
-------------
|
-------------
|
||||||
* Remove deprecated Piwik integration. Use Matomo instead! (Peter Bittner)
|
* Remove deprecated Piwik integration. Use Matomo instead! (Peter Bittner)
|
||||||
|
|
|
||||||
21
README.rst
21
README.rst
|
|
@ -1,14 +1,14 @@
|
||||||
django-analytical |latest-version|
|
django-analytical |latest-version|
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
|build-status| |coverage| |python-support| |license| |gitter| |jazzband|
|
|build-status| |coverage| |python-support| |license| |jazzband|
|
||||||
|
|
||||||
The django-analytical application integrates analytics services into a
|
The django-analytical application integrates analytics services into a
|
||||||
Django_ project.
|
Django_ project.
|
||||||
|
|
||||||
.. start docs include
|
.. start docs include
|
||||||
|
|
||||||
Using an analytics service with a Django project means adding Javascript
|
Using an analytics service with a Django project means adding JavaScript
|
||||||
tracking code to the project templates. Of course, every service has
|
tracking code to the project templates. Of course, every service has
|
||||||
its own specific installation instructions. Furthermore, you need to
|
its own specific installation instructions. Furthermore, you need to
|
||||||
include your unique identifiers, which then end up in the templates.
|
include your unique identifiers, which then end up in the templates.
|
||||||
|
|
@ -19,7 +19,7 @@ behind a generic interface, and keeps personal information and
|
||||||
configuration out of the templates. Its goal is to make the basic
|
configuration out of the templates. Its goal is to make the basic
|
||||||
set-up very simple, while allowing advanced users to customize tracking.
|
set-up very simple, while allowing advanced users to customize tracking.
|
||||||
Each service is set up as recommended by the services themselves, using
|
Each service is set up as recommended by the services themselves, using
|
||||||
an asynchronous version of the Javascript code if possible.
|
an asynchronous version of the JavaScript code if possible.
|
||||||
|
|
||||||
.. end docs include
|
.. end docs include
|
||||||
|
|
||||||
|
|
@ -38,12 +38,9 @@ an asynchronous version of the Javascript code if possible.
|
||||||
.. |license| image:: https://img.shields.io/pypi/l/django-analytical.svg
|
.. |license| image:: https://img.shields.io/pypi/l/django-analytical.svg
|
||||||
:alt: Software license
|
:alt: Software license
|
||||||
:target: https://github.com/jazzband/django-analytical/blob/main/LICENSE.txt
|
:target: https://github.com/jazzband/django-analytical/blob/main/LICENSE.txt
|
||||||
.. |gitter| image:: https://img.shields.io/gitter/room/jazzband/django-analytical.svg
|
|
||||||
:alt: Gitter chat room
|
|
||||||
:target: https://gitter.im/jazzband/django-analytical
|
|
||||||
.. |jazzband| image:: https://jazzband.co/static/img/badge.svg
|
.. |jazzband| image:: https://jazzband.co/static/img/badge.svg
|
||||||
:alt: Jazzband
|
:alt: Jazzband
|
||||||
:target: https://jazzband.co/
|
:target: https://jazzband.co/projects/django-analytical
|
||||||
.. _`Django`: http://www.djangoproject.com/
|
.. _`Django`: http://www.djangoproject.com/
|
||||||
|
|
||||||
Currently Supported Services
|
Currently Supported Services
|
||||||
|
|
@ -108,9 +105,7 @@ Documentation and Support
|
||||||
|
|
||||||
The documentation can be found in the ``docs`` directory or `read
|
The documentation can be found in the ``docs`` directory or `read
|
||||||
online`_. The source code and issue tracker are generously `hosted by
|
online`_. The source code and issue tracker are generously `hosted by
|
||||||
GitHub`_. Bugs should be reported there, whereas for lengthy chats
|
GitHub`_.
|
||||||
and coding support when implementing new service integrations you're
|
|
||||||
welcome to use our `Gitter chat room`_.
|
|
||||||
|
|
||||||
.. _`read online`: https://django-analytical.readthedocs.io/
|
.. _`read online`: https://django-analytical.readthedocs.io/
|
||||||
.. _`hosted by GitHub`: https://github.com/jazzband/django-analytical
|
.. _`hosted by GitHub`: https://github.com/jazzband/django-analytical
|
||||||
|
|
@ -128,11 +123,17 @@ services to support, or suggesting documentation improvements, use the
|
||||||
the repository, make changes and place a `pull request`_. Creating an
|
the repository, make changes and place a `pull request`_. Creating an
|
||||||
issue to discuss your plans is useful.
|
issue to discuss your plans is useful.
|
||||||
|
|
||||||
|
At the end, don't forget to add yourself to the `list of authors`_ and
|
||||||
|
update the `changelog`_ with a short description of your contribution.
|
||||||
|
We want you to stand out from the crowd as an open source superstar! ✦
|
||||||
|
|
||||||
This is a `Jazzband`_ project. By contributing you agree to abide by the
|
This is a `Jazzband`_ project. By contributing you agree to abide by the
|
||||||
`Contributor Code of Conduct`_ and follow the `guidelines`_.
|
`Contributor Code of Conduct`_ and follow the `guidelines`_.
|
||||||
|
|
||||||
.. _`issue tracker`: https://github.com/jazzband/django-analytical/issues
|
.. _`issue tracker`: https://github.com/jazzband/django-analytical/issues
|
||||||
.. _`pull request`: https://github.com/jazzband/django-analytical/pulls
|
.. _`pull request`: https://github.com/jazzband/django-analytical/pulls
|
||||||
|
.. _`list of authors`: https://github.com/jazzband/django-analytical/blob/main/pyproject.toml
|
||||||
|
.. _`changelog`: https://github.com/jazzband/django-analytical/blob/main/CHANGELOG.rst
|
||||||
.. _`Jazzband`: https://jazzband.co
|
.. _`Jazzband`: https://jazzband.co
|
||||||
.. _`Contributor Code of Conduct`: https://jazzband.co/about/conduct
|
.. _`Contributor Code of Conduct`: https://jazzband.co/about/conduct
|
||||||
.. _`guidelines`: https://jazzband.co/about/guidelines
|
.. _`guidelines`: https://jazzband.co/about/guidelines
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ def chartbeat_top(parser, token):
|
||||||
"""
|
"""
|
||||||
Top Chartbeat template tag.
|
Top Chartbeat template tag.
|
||||||
|
|
||||||
Render the top Javascript code for Chartbeat.
|
Render the top JavaScript code for Chartbeat.
|
||||||
"""
|
"""
|
||||||
bits = token.split_contents()
|
bits = token.split_contents()
|
||||||
if len(bits) > 1:
|
if len(bits) > 1:
|
||||||
|
|
@ -64,7 +64,7 @@ def chartbeat_bottom(parser, token):
|
||||||
"""
|
"""
|
||||||
Bottom Chartbeat template tag.
|
Bottom Chartbeat template tag.
|
||||||
|
|
||||||
Render the bottom Javascript code for Chartbeat. You must supply
|
Render the bottom JavaScript code for Chartbeat. You must supply
|
||||||
your Chartbeat User ID (as a string) in the ``CHARTBEAT_USER_ID``
|
your Chartbeat User ID (as a string) in the ``CHARTBEAT_USER_ID``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ def clickmap(parser, token):
|
||||||
"""
|
"""
|
||||||
Clickmap tracker template tag.
|
Clickmap tracker template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your clickmap tracker ID (as a string) in the ``CLICKMAP_TRACKER_ID``
|
your clickmap tracker ID (as a string) in the ``CLICKMAP_TRACKER_ID``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ def clicky(parser, token):
|
||||||
"""
|
"""
|
||||||
Clicky tracking template tag.
|
Clicky tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your Clicky Site ID (as a string) in the ``CLICKY_SITE_ID``
|
your Clicky Site ID (as a string) in the ``CLICKY_SITE_ID``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ def crazy_egg(parser, token):
|
||||||
"""
|
"""
|
||||||
Crazy Egg tracking template tag.
|
Crazy Egg tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page clicks. You must supply
|
Renders JavaScript code to track page clicks. You must supply
|
||||||
your Crazy Egg account number (as a string) in the
|
your Crazy Egg account number (as a string) in the
|
||||||
``CRAZY_EGG_ACCOUNT_NUMBER`` setting.
|
``CRAZY_EGG_ACCOUNT_NUMBER`` setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ def gauges(parser, token):
|
||||||
"""
|
"""
|
||||||
Gaug.es template tag.
|
Gaug.es template tag.
|
||||||
|
|
||||||
Renders Javascript code to gaug.es testing. You must supply
|
Renders JavaScript code to gaug.es testing. You must supply
|
||||||
your Site ID account number in the ``GAUGES_SITE_ID``
|
your Site ID account number in the ``GAUGES_SITE_ID``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ def google_analytics(parser, token):
|
||||||
"""
|
"""
|
||||||
Google Analytics tracking template tag.
|
Google Analytics tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your website property ID (as a string) in the
|
your website property ID (as a string) in the
|
||||||
``GOOGLE_ANALYTICS_PROPERTY_ID`` setting.
|
``GOOGLE_ANALYTICS_PROPERTY_ID`` setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
"""
|
"""
|
||||||
Google Analytics template tags and filters, using the new analytics.js library.
|
Google Analytics template tags and filters, using the new gtag.js library.
|
||||||
|
https://developers.google.com/tag-platform/gtagjs/reference
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import json
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from django.template import Library, Node, TemplateSyntaxError
|
from django.template import Library, Node, TemplateSyntaxError
|
||||||
|
|
@ -23,13 +25,10 @@ SETUP_CODE = """
|
||||||
function gtag(){{dataLayer.push(arguments);}}
|
function gtag(){{dataLayer.push(arguments);}}
|
||||||
gtag('js', new Date());
|
gtag('js', new Date());
|
||||||
|
|
||||||
{extra}
|
gtag('config', '{property_id}', {custom_dimensions});
|
||||||
gtag('config', '{property_id}');
|
|
||||||
</script>
|
</script>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
GTAG_SET_CODE = """gtag('set', {{'{key}': '{value}'}});"""
|
|
||||||
|
|
||||||
register = Library()
|
register = Library()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -38,7 +37,7 @@ def google_analytics_gtag(parser, token):
|
||||||
"""
|
"""
|
||||||
Google Analytics tracking template tag.
|
Google Analytics tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your website property ID (as a string) in the
|
your website property ID (as a string) in the
|
||||||
``GOOGLE_ANALYTICS_GTAG_PROPERTY_ID`` setting.
|
``GOOGLE_ANALYTICS_GTAG_PROPERTY_ID`` setting.
|
||||||
"""
|
"""
|
||||||
|
|
@ -59,21 +58,15 @@ class GoogleAnalyticsGTagNode(Node):
|
||||||
)
|
)
|
||||||
|
|
||||||
def render(self, context):
|
def render(self, context):
|
||||||
other_fields = {}
|
custom_dimensions = context.get('google_analytics_custom_dimensions', {})
|
||||||
|
|
||||||
identity = get_identity(context, 'google_analytics_gtag')
|
identity = get_identity(context, prefix='google_analytics_gtag')
|
||||||
if identity is not None:
|
if identity is not None:
|
||||||
other_fields['user_id'] = identity
|
custom_dimensions['user_id'] = identity
|
||||||
|
|
||||||
extra = '\n'.join(
|
|
||||||
[
|
|
||||||
GTAG_SET_CODE.format(key=key, value=value)
|
|
||||||
for key, value in other_fields.items()
|
|
||||||
]
|
|
||||||
)
|
|
||||||
html = SETUP_CODE.format(
|
html = SETUP_CODE.format(
|
||||||
property_id=self.property_id,
|
property_id=self.property_id,
|
||||||
extra=extra,
|
custom_dimensions=json.dumps(custom_dimensions),
|
||||||
)
|
)
|
||||||
if is_internal_ip(context, 'GOOGLE_ANALYTICS'):
|
if is_internal_ip(context, 'GOOGLE_ANALYTICS'):
|
||||||
html = disable_html(html, 'Google Analytics')
|
html = disable_html(html, 'Google Analytics')
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ def google_analytics_js(parser, token):
|
||||||
"""
|
"""
|
||||||
Google Analytics tracking template tag.
|
Google Analytics tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your website property ID (as a string) in the
|
your website property ID (as a string) in the
|
||||||
``GOOGLE_ANALYTICS_JS_PROPERTY_ID`` setting.
|
``GOOGLE_ANALYTICS_JS_PROPERTY_ID`` setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ def gosquared(parser, token):
|
||||||
"""
|
"""
|
||||||
GoSquared tracking template tag.
|
GoSquared tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your GoSquared site token in the ``GOSQUARED_SITE_TOKEN`` setting.
|
your GoSquared site token in the ``GOSQUARED_SITE_TOKEN`` setting.
|
||||||
"""
|
"""
|
||||||
bits = token.split_contents()
|
bits = token.split_contents()
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ def heap(parser, token):
|
||||||
"""
|
"""
|
||||||
Heap tracker template tag.
|
Heap tracker template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your heap tracker ID (as a string) in the ``HEAP_TRACKER_ID``
|
your heap tracker ID (as a string) in the ``HEAP_TRACKER_ID``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ def hubspot(parser, token):
|
||||||
"""
|
"""
|
||||||
HubSpot tracking template tag.
|
HubSpot tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your portal ID (as a string) in the ``HUBSPOT_PORTAL_ID`` setting.
|
your portal ID (as a string) in the ``HUBSPOT_PORTAL_ID`` setting.
|
||||||
"""
|
"""
|
||||||
bits = token.split_contents()
|
bits = token.split_contents()
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ def intercom(parser, token):
|
||||||
"""
|
"""
|
||||||
Intercom.io template tag.
|
Intercom.io template tag.
|
||||||
|
|
||||||
Renders Javascript code to intercom.io testing. You must supply
|
Renders JavaScript code to intercom.io testing. You must supply
|
||||||
your APP ID account number in the ``INTERCOM_APP_ID``
|
your APP ID account number in the ``INTERCOM_APP_ID``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ def kiss_insights(parser, token):
|
||||||
"""
|
"""
|
||||||
KISSinsights set-up template tag.
|
KISSinsights set-up template tag.
|
||||||
|
|
||||||
Renders Javascript code to set-up surveys. You must supply
|
Renders JavaScript code to set-up surveys. You must supply
|
||||||
your account number and site code in the
|
your account number and site code in the
|
||||||
``KISS_INSIGHTS_ACCOUNT_NUMBER`` and ``KISS_INSIGHTS_SITE_CODE``
|
``KISS_INSIGHTS_ACCOUNT_NUMBER`` and ``KISS_INSIGHTS_SITE_CODE``
|
||||||
settings.
|
settings.
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ def kiss_metrics(parser, token):
|
||||||
"""
|
"""
|
||||||
KISSinsights tracking template tag.
|
KISSinsights tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your KISSmetrics API key in the ``KISS_METRICS_API_KEY``
|
your KISSmetrics API key in the ``KISS_METRICS_API_KEY``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,30 @@ VARIABLE_CODE = (
|
||||||
IDENTITY_CODE = '_paq.push(["setUserId", "%(userid)s"]);'
|
IDENTITY_CODE = '_paq.push(["setUserId", "%(userid)s"]);'
|
||||||
DISABLE_COOKIES_CODE = "_paq.push(['disableCookies']);"
|
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'
|
DEFAULT_SCOPE = 'page'
|
||||||
|
|
||||||
MatomoVar = namedtuple('MatomoVar', ('index', 'name', 'value', 'scope'))
|
MatomoVar = namedtuple('MatomoVar', ('index', 'name', 'value', 'scope'))
|
||||||
|
|
@ -59,7 +83,7 @@ def matomo(parser, token):
|
||||||
"""
|
"""
|
||||||
Matomo tracking template tag.
|
Matomo tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your Matomo domain (plus optional URI path), and tracked site ID
|
your Matomo domain (plus optional URI path), and tracked site ID
|
||||||
in the ``MATOMO_DOMAIN_PATH`` and the ``MATOMO_SITE_ID`` setting.
|
in the ``MATOMO_DOMAIN_PATH`` and the ``MATOMO_SITE_ID`` setting.
|
||||||
|
|
||||||
|
|
@ -103,6 +127,9 @@ class MatomoNode(Node):
|
||||||
if getattr(settings, 'MATOMO_DISABLE_COOKIES', False):
|
if getattr(settings, 'MATOMO_DISABLE_COOKIES', False):
|
||||||
commands.append(DISABLE_COOKIES_CODE)
|
commands.append(DISABLE_COOKIES_CODE)
|
||||||
|
|
||||||
|
if getattr(settings, 'MATOMO_ASK_FOR_CONSENT', False):
|
||||||
|
commands.append(ASK_FOR_CONSENT_CODE)
|
||||||
|
|
||||||
userid = get_identity(context, 'matomo')
|
userid = get_identity(context, 'matomo')
|
||||||
if userid is not None:
|
if userid is not None:
|
||||||
variables_code = chain(
|
variables_code = chain(
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ def mixpanel(parser, token):
|
||||||
"""
|
"""
|
||||||
Mixpanel tracking template tag.
|
Mixpanel tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your Mixpanel token in the ``MIXPANEL_API_TOKEN`` setting.
|
your Mixpanel token in the ``MIXPANEL_API_TOKEN`` setting.
|
||||||
"""
|
"""
|
||||||
bits = token.split_contents()
|
bits = token.split_contents()
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ def olark(parser, token):
|
||||||
"""
|
"""
|
||||||
Olark set-up template tag.
|
Olark set-up template tag.
|
||||||
|
|
||||||
Renders Javascript code to set-up Olark chat. You must supply
|
Renders JavaScript code to set-up Olark chat. You must supply
|
||||||
your site ID in the ``OLARK_SITE_ID`` setting.
|
your site ID in the ``OLARK_SITE_ID`` setting.
|
||||||
"""
|
"""
|
||||||
bits = token.split_contents()
|
bits = token.split_contents()
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ def optimizely(parser, token):
|
||||||
"""
|
"""
|
||||||
Optimizely template tag.
|
Optimizely template tag.
|
||||||
|
|
||||||
Renders Javascript code to set-up A/B testing. You must supply
|
Renders JavaScript code to set-up A/B testing. You must supply
|
||||||
your Optimizely account number in the ``OPTIMIZELY_ACCOUNT_NUMBER``
|
your Optimizely account number in the ``OPTIMIZELY_ACCOUNT_NUMBER``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ def performable(parser, token):
|
||||||
"""
|
"""
|
||||||
Performable template tag.
|
Performable template tag.
|
||||||
|
|
||||||
Renders Javascript code to set-up Performable tracking. You must
|
Renders JavaScript code to set-up Performable tracking. You must
|
||||||
supply your Performable API key in the ``PERFORMABLE_API_KEY``
|
supply your Performable API key in the ``PERFORMABLE_API_KEY``
|
||||||
setting.
|
setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ def rating_mailru(parser, token):
|
||||||
"""
|
"""
|
||||||
Rating@Mail.ru counter template tag.
|
Rating@Mail.ru counter template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your website counter ID (as a string) in the
|
your website counter ID (as a string) in the
|
||||||
``RATING_MAILRU_COUNTER_ID`` setting.
|
``RATING_MAILRU_COUNTER_ID`` setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ def snapengage(parser, token):
|
||||||
"""
|
"""
|
||||||
SnapEngage set-up template tag.
|
SnapEngage set-up template tag.
|
||||||
|
|
||||||
Renders Javascript code to set-up SnapEngage chat. You must supply
|
Renders JavaScript code to set-up SnapEngage chat. You must supply
|
||||||
your widget ID in the ``SNAPENGAGE_WIDGET_ID`` setting.
|
your widget ID in the ``SNAPENGAGE_WIDGET_ID`` setting.
|
||||||
"""
|
"""
|
||||||
bits = token.split_contents()
|
bits = token.split_contents()
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ def spring_metrics(parser, token):
|
||||||
"""
|
"""
|
||||||
Spring Metrics tracking template tag.
|
Spring Metrics tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your Spring Metrics Tracking ID in the
|
your Spring Metrics Tracking ID in the
|
||||||
``SPRING_METRICS_TRACKING_ID`` setting.
|
``SPRING_METRICS_TRACKING_ID`` setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ def uservoice(parser, token):
|
||||||
"""
|
"""
|
||||||
UserVoice tracking template tag.
|
UserVoice tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your UserVoice Widget Key in the ``USERVOICE_WIDGET_KEY``
|
your UserVoice Widget Key in the ``USERVOICE_WIDGET_KEY``
|
||||||
setting or the ``uservoice_widget_key`` template context variable.
|
setting or the ``uservoice_widget_key`` template context variable.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ def woopra(parser, token):
|
||||||
"""
|
"""
|
||||||
Woopra tracking template tag.
|
Woopra tracking template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your Woopra domain in the ``WOOPRA_DOMAIN`` setting.
|
your Woopra domain in the ``WOOPRA_DOMAIN`` setting.
|
||||||
"""
|
"""
|
||||||
bits = token.split_contents()
|
bits = token.split_contents()
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ def yandex_metrica(parser, token):
|
||||||
"""
|
"""
|
||||||
Yandex.Metrica counter template tag.
|
Yandex.Metrica counter template tag.
|
||||||
|
|
||||||
Renders Javascript code to track page visits. You must supply
|
Renders JavaScript code to track page visits. You must supply
|
||||||
your website counter ID (as a string) in the
|
your website counter ID (as a string) in the
|
||||||
``YANDEX_METRICA_COUNTER_ID`` setting.
|
``YANDEX_METRICA_COUNTER_ID`` setting.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ file of your project:
|
||||||
Adding the template tags to the base template
|
Adding the template tags to the base template
|
||||||
=============================================
|
=============================================
|
||||||
|
|
||||||
Because every analytics service uses own specific Javascript code that
|
Because every analytics service uses own specific JavaScript code that
|
||||||
should be added to the top or bottom of either the head or body of the
|
should be added to the top or bottom of either the head or body of the
|
||||||
HTML page, django-analytical provides four general-purpose template tags
|
HTML page, django-analytical provides four general-purpose template tags
|
||||||
that will render the code needed for the services you are using. Your
|
that will render the code needed for the services you are using. Your
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ important information about detecting the visitor IP address.
|
||||||
Setting the domain
|
Setting the domain
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
The Javascript tracking code can send the website domain to Chartbeat.
|
The JavaScript tracking code can send the website domain to Chartbeat.
|
||||||
If you use multiple subdomains this enables you to treat them as one
|
If you use multiple subdomains this enables you to treat them as one
|
||||||
website in Chartbeat. If your project uses the sites framework, the
|
website in Chartbeat. If your project uses the sites framework, the
|
||||||
domain name of the current :class:`~django.contrib.sites.models.Site`
|
domain name of the current :class:`~django.contrib.sites.models.Site`
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ This step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`clickmap-configuration`.
|
:ref:`clickmap-configuration`.
|
||||||
|
|
||||||
The Clickmap Javascript code is inserted into templates using a template
|
The Clickmap JavaScript code is inserted into templates using a template
|
||||||
tag. Load the :mod:`clickmap` template tag library and insert the
|
tag. Load the :mod:`clickmap` template tag library and insert the
|
||||||
:ttag:`clickmap` tag. Because every page that you want to track must
|
:ttag:`clickmap` tag. Because every page that you want to track must
|
||||||
have the tag, it is useful to add it to your base template. Insert
|
have the tag, it is useful to add it to your base template. Insert
|
||||||
|
|
@ -54,7 +54,7 @@ Setting the Tracker ID
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
Clickmap gives you a unique Tracker ID, and the :ttag:`clickmap`
|
Clickmap gives you a unique Tracker ID, and the :ttag:`clickmap`
|
||||||
tag will include it in the rendered Javascript code. You can find your
|
tag will include it in the rendered JavaScript code. You can find your
|
||||||
Tracker ID clicking the link named "Tracker" in the dashboard
|
Tracker ID clicking the link named "Tracker" in the dashboard
|
||||||
of your Clickmap account. Set :const:`CLICKMAP_TRACKER_ID` in the project
|
of your Clickmap account. Set :const:`CLICKMAP_TRACKER_ID` in the project
|
||||||
:file:`settings.py` file::
|
:file:`settings.py` file::
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ Setting the Site ID
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
Every website you track with Clicky gets its own Site ID, and the
|
Every website you track with Clicky gets its own Site ID, and the
|
||||||
:ttag:`clicky` tag will include it in the rendered Javascript code.
|
:ttag:`clicky` tag will include it in the rendered JavaScript code.
|
||||||
You can find the Site ID in the *Info* tab of the website *Preferences*
|
You can find the Site ID in the *Info* tab of the website *Preferences*
|
||||||
page, in your Clicky account. Set :const:`CLICKY_SITE_ID` in the
|
page, in your Clicky account. Set :const:`CLICKY_SITE_ID` in the
|
||||||
project :file:`settings.py` file::
|
project :file:`settings.py` file::
|
||||||
|
|
@ -84,7 +84,7 @@ Custom data
|
||||||
|
|
||||||
As described in the Clicky `customized tracking`_ documentation page,
|
As described in the Clicky `customized tracking`_ documentation page,
|
||||||
the data that is tracked by Clicky can be customized by setting the
|
the data that is tracked by Clicky can be customized by setting the
|
||||||
:data:`clicky_custom` Javascript variable before loading the tracking
|
:data:`clicky_custom` JavaScript variable before loading the tracking
|
||||||
code. Using template context variables, you can let the :ttag:`clicky`
|
code. Using template context variables, you can let the :ttag:`clicky`
|
||||||
tag pass custom data to Clicky automatically. You can set the context
|
tag pass custom data to Clicky automatically. You can set the context
|
||||||
variables in your view when you render a template containing the
|
variables in your view when you render a template containing the
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ Setting the account number
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Crazy Egg gives you a unique account number, and the :ttag:`crazy egg`
|
Crazy Egg gives you a unique account number, and the :ttag:`crazy egg`
|
||||||
tag will include it in the rendered Javascript code. You can find your
|
tag will include it in the rendered JavaScript code. You can find your
|
||||||
account number by clicking the link named "What's my code?" in the
|
account number by clicking the link named "What's my code?" in the
|
||||||
dashboard of your Crazy Egg account. Set
|
dashboard of your Crazy Egg account. Set
|
||||||
:const:`CRAZY_EGG_ACCOUNT_NUMBER` in the project :file:`settings.py`
|
:const:`CRAZY_EGG_ACCOUNT_NUMBER` in the project :file:`settings.py`
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ This step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`gauges-configuration`.
|
:ref:`gauges-configuration`.
|
||||||
|
|
||||||
The Gaug.es Javascript code is inserted into templates using a
|
The Gaug.es JavaScript code is inserted into templates using a
|
||||||
template tag. Load the :mod:`gauges` template tag library and
|
template tag. Load the :mod:`gauges` template tag library and
|
||||||
insert the :ttag:`gauges` tag. Because every page that you want to
|
insert the :ttag:`gauges` tag. Because every page that you want to
|
||||||
track must have the tag, it is useful to add it to your base template.
|
track must have the tag, it is useful to add it to your base template.
|
||||||
|
|
@ -51,7 +51,7 @@ Setting the site id
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Gaug.es gives you a unique site id, and the :ttag:`gauges`
|
Gaug.es gives you a unique site id, and the :ttag:`gauges`
|
||||||
tag will include it in the rendered Javascript code. You can find your
|
tag will include it in the rendered JavaScript code. You can find your
|
||||||
site id by clicking the *Tracking Code* link when logged into
|
site id by clicking the *Tracking Code* link when logged into
|
||||||
the on the gaug.es website. A page will display containing
|
the on the gaug.es website. A page will display containing
|
||||||
HTML code looking like this::
|
HTML code looking like this::
|
||||||
|
|
@ -76,7 +76,7 @@ file::
|
||||||
|
|
||||||
GAUGES_SITE_ID = 'XXXXXXXXXXXXXXXXXXXXXXX'
|
GAUGES_SITE_ID = 'XXXXXXXXXXXXXXXXXXXXXXX'
|
||||||
|
|
||||||
If you do not set an site id, the Javascript code will not be
|
If you do not set an site id, the JavaScript code will not be
|
||||||
rendered.
|
rendered.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ Setting the property ID
|
||||||
|
|
||||||
Every website you track with Google Analytics gets its own property ID,
|
Every website you track with Google Analytics gets its own property ID,
|
||||||
and the :ttag:`google_analytics` tag will include it in the rendered
|
and the :ttag:`google_analytics` tag will include it in the rendered
|
||||||
Javascript code. You can find the web property ID on the overview page
|
JavaScript code. You can find the web property ID on the overview page
|
||||||
of your account. Set :const:`GOOGLE_ANALYTICS_PROPERTY_ID` in the
|
of your account. Set :const:`GOOGLE_ANALYTICS_PROPERTY_ID` in the
|
||||||
project :file:`settings.py` file::
|
project :file:`settings.py` file::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ Setting the property ID
|
||||||
|
|
||||||
Every website you track with Google Analytics gets its own property ID,
|
Every website you track with Google Analytics gets its own property ID,
|
||||||
and the :ttag:`google_analytics_gtag` tag will include it in the rendered
|
and the :ttag:`google_analytics_gtag` tag will include it in the rendered
|
||||||
Javascript code. You can find the web property ID on the overview page
|
JavaScript code. You can find the web property ID on the overview page
|
||||||
of your account. Set :const:`GOOGLE_ANALYTICS_GTAG_PROPERTY_ID` in the
|
of your account. Set :const:`GOOGLE_ANALYTICS_GTAG_PROPERTY_ID` in the
|
||||||
project :file:`settings.py` file::
|
project :file:`settings.py` file::
|
||||||
|
|
||||||
|
|
@ -117,3 +117,52 @@ or in the template:
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
|
|
||||||
.. _`Google Analytics conditions`: https://developers.google.com/analytics/solutions/crm-integration#user_id
|
.. _`Google Analytics conditions`: https://developers.google.com/analytics/solutions/crm-integration#user_id
|
||||||
|
|
||||||
|
.. _google-analytics-custom-dimensions:
|
||||||
|
|
||||||
|
Custom dimensions
|
||||||
|
----------------
|
||||||
|
|
||||||
|
As described in the Google Analytics `custom dimensions`_ documentation
|
||||||
|
page, you can define custom dimensions which are variables specific to your
|
||||||
|
business needs. These variables can include both custom event parameters as
|
||||||
|
well as customer user properties. Using the template context variable
|
||||||
|
``google_analytics_custom_dimensions``, you can let the :ttag:`google_analytics_gtag`
|
||||||
|
pass custom dimensions to Google Analytics automatically. The ``google_analytics_custom_dimensions``
|
||||||
|
variable must be set to a dictionary where the keys are the dimension names
|
||||||
|
and the values are the dimension values. You can set the context variable in your
|
||||||
|
view when you render a template containing the tracking code::
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
context = RequestContext({
|
||||||
|
'google_analytics_custom_dimensions': {
|
||||||
|
'gender': 'female',
|
||||||
|
'country': 'US',
|
||||||
|
'user_properties': {
|
||||||
|
'age': 25
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return some_template.render(context)
|
||||||
|
|
||||||
|
Note that the ``user_properties`` key is used to pass user properties to Google
|
||||||
|
Analytics. It's not necessary to always use this key, but that'd be the way of
|
||||||
|
sending user properties to Google Analytics automatically.
|
||||||
|
|
||||||
|
You may want to set custom dimensions in a context processor that you add
|
||||||
|
to the :data:`TEMPLATE_CONTEXT_PROCESSORS` list in :file:`settings.py`::
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
def google_analytics_segment_language(request):
|
||||||
|
try:
|
||||||
|
return {'google_analytics_custom_dimensions': {'language': request.LANGUAGE_CODE}}
|
||||||
|
except AttributeError:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
Just remember that if you set the same context variable in the
|
||||||
|
:class:`~django.template.context.RequestContext` constructor and in a
|
||||||
|
context processor, the latter clobbers the former.
|
||||||
|
|
||||||
|
.. _`custom dimensions`: https://support.google.com/analytics/answer/10075209
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ Setting the property ID
|
||||||
|
|
||||||
Every website you track with Google Analytics gets its own property ID,
|
Every website you track with Google Analytics gets its own property ID,
|
||||||
and the :ttag:`google_analytics_js` tag will include it in the rendered
|
and the :ttag:`google_analytics_js` tag will include it in the rendered
|
||||||
Javascript code. You can find the web property ID on the overview page
|
JavaScript code. You can find the web property ID on the overview page
|
||||||
of your account. Set :const:`GOOGLE_ANALYTICS_JS_PROPERTY_ID` in the
|
of your account. Set :const:`GOOGLE_ANALYTICS_JS_PROPERTY_ID` in the
|
||||||
project :file:`settings.py` file::
|
project :file:`settings.py` file::
|
||||||
|
|
||||||
|
|
@ -229,7 +229,7 @@ The value is the cookie expiration in seconds or 0 to delete the cookie when the
|
||||||
|
|
||||||
.. _`Cookie Expiration`: https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiBasicConfiguration#_setsessioncookietimeout
|
.. _`Cookie Expiration`: https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiBasicConfiguration#_setsessioncookietimeout
|
||||||
|
|
||||||
Custom Javascript Source
|
Custom JavaScript Source
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
You can configure a custom URL for the javascript file by setting the
|
You can configure a custom URL for the javascript file by setting the
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ This step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`intercom-configuration`.
|
:ref:`intercom-configuration`.
|
||||||
|
|
||||||
The Intercom.io Javascript code is inserted into templates using a
|
The Intercom.io JavaScript code is inserted into templates using a
|
||||||
template tag. Load the :mod:`intercom` template tag library and
|
template tag. Load the :mod:`intercom` template tag library and
|
||||||
insert the :ttag:`intercom` tag. Because every page that you want to
|
insert the :ttag:`intercom` tag. Because every page that you want to
|
||||||
track must have the tag, it is useful to add it to your base template.
|
track must have the tag, it is useful to add it to your base template.
|
||||||
|
|
@ -55,7 +55,7 @@ Setting the app id
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Intercom.io gives you a unique app id, and the :ttag:`intercom`
|
Intercom.io gives you a unique app id, and the :ttag:`intercom`
|
||||||
tag will include it in the rendered Javascript code. You can find your
|
tag will include it in the rendered JavaScript code. You can find your
|
||||||
app id by clicking the *Tracking Code* link when logged into
|
app id by clicking the *Tracking Code* link when logged into
|
||||||
the on the intercom.io website. A page will display containing
|
the on the intercom.io website. A page will display containing
|
||||||
HTML code looking like this::
|
HTML code looking like this::
|
||||||
|
|
@ -71,7 +71,7 @@ file::
|
||||||
|
|
||||||
INTERCOM_APP_ID = 'XXXXXXXXXXXXXXXXXXXXXXX'
|
INTERCOM_APP_ID = 'XXXXXXXXXXXXXXXXXXXXXXX'
|
||||||
|
|
||||||
If you do not set an app id, the Javascript code will not be
|
If you do not set an app id, the JavaScript code will not be
|
||||||
rendered.
|
rendered.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,10 +54,10 @@ Setting the account number and site code
|
||||||
|
|
||||||
In order to install the survey code, you need to set your KISSinsights
|
In order to install the survey code, you need to set your KISSinsights
|
||||||
account number and website code. The :ttag:`kiss_insights` tag will
|
account number and website code. The :ttag:`kiss_insights` tag will
|
||||||
include it in the rendered Javascript code. You can find the account
|
include it in the rendered JavaScript code. You can find the account
|
||||||
number and website code by visiting the code installation page of the
|
number and website code by visiting the code installation page of the
|
||||||
website you want to place the surveys on. You will see some HTML code
|
website you want to place the surveys on. You will see some HTML code
|
||||||
with a Javascript tag with a ``src`` attribute containing
|
with a JavaScript tag with a ``src`` attribute containing
|
||||||
``//s3.amazonaws.com/ki.js/XXXXX/YYY.js``. Here ``XXXXX`` is the
|
``//s3.amazonaws.com/ki.js/XXXXX/YYY.js``. Here ``XXXXX`` is the
|
||||||
account number and ``YYY`` the website code. Set
|
account number and ``YYY`` the website code. Set
|
||||||
:const:`KISS_INSIGHTS_ACCOUNT_NUMBER` and
|
:const:`KISS_INSIGHTS_ACCOUNT_NUMBER` and
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ This step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`kiss-metrics-configuration`.
|
:ref:`kiss-metrics-configuration`.
|
||||||
|
|
||||||
The KISSmetrics Javascript code is inserted into templates using a
|
The KISSmetrics JavaScript code is inserted into templates using a
|
||||||
template tag. Load the :mod:`kiss_metrics` template tag library and
|
template tag. Load the :mod:`kiss_metrics` template tag library and
|
||||||
insert the :ttag:`kiss_metrics` tag. Because every page that you want
|
insert the :ttag:`kiss_metrics` tag. Because every page that you want
|
||||||
to track must have the tag, it is useful to add it to your base
|
to track must have the tag, it is useful to add it to your base
|
||||||
|
|
@ -53,7 +53,7 @@ Setting the API key
|
||||||
|
|
||||||
Every website you track events for with KISSmetrics gets its own API
|
Every website you track events for with KISSmetrics gets its own API
|
||||||
key, and the :ttag:`kiss_metrics` tag will include it in the rendered
|
key, and the :ttag:`kiss_metrics` tag will include it in the rendered
|
||||||
Javascript code. You can find the website API key by visiting the
|
JavaScript code. You can find the website API key by visiting the
|
||||||
website *Product center* on your KISSmetrics dashboard. Set
|
website *Product center* on your KISSmetrics dashboard. Set
|
||||||
:const:`KISS_METRICS_API_KEY` in the project :file:`settings.py` file::
|
:const:`KISS_METRICS_API_KEY` in the project :file:`settings.py` file::
|
||||||
|
|
||||||
|
|
@ -144,7 +144,7 @@ For example::
|
||||||
})
|
})
|
||||||
return some_template.render(context)
|
return some_template.render(context)
|
||||||
|
|
||||||
The output script tag will then include the corresponding Javascript event as
|
The output script tag will then include the corresponding JavaScript event as
|
||||||
documented in the `KISSmetrics record API`_ docs.
|
documented in the `KISSmetrics record API`_ docs.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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/
|
.. _`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 class="matomo_give_consent">Track me!</button>
|
||||||
|
|
||||||
|
# button to remove tracking consent
|
||||||
|
<button class="matomo_remove_consent">Don't track me anymore!</button>
|
||||||
|
|
||||||
|
.. _`asking for consent`: https://developer.matomo.org/guides/tracking-javascript-guide#asking-for-consent
|
||||||
|
|
||||||
Internal IP addresses
|
Internal IP addresses
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`mixpanel-configuration`.
|
:ref:`mixpanel-configuration`.
|
||||||
|
|
||||||
The Mixpanel Javascript code is inserted into templates using a
|
The Mixpanel JavaScript code is inserted into templates using a
|
||||||
template tag. Load the :mod:`mixpanel` template tag library and
|
template tag. Load the :mod:`mixpanel` template tag library and
|
||||||
insert the :ttag:`mixpanel` tag. Because every page that you want
|
insert the :ttag:`mixpanel` tag. Because every page that you want
|
||||||
to track must have the tag, it is useful to add it to your base
|
to track must have the tag, it is useful to add it to your base
|
||||||
|
|
@ -53,7 +53,7 @@ Setting the token
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Every website you track events for with Mixpanel gets its own token,
|
Every website you track events for with Mixpanel gets its own token,
|
||||||
and the :ttag:`mixpanel` tag will include it in the rendered Javascript
|
and the :ttag:`mixpanel` tag will include it in the rendered JavaScript
|
||||||
code. You can find the project token on the Mixpanel *projects* page.
|
code. You can find the project token on the Mixpanel *projects* page.
|
||||||
Set :const:`MIXPANEL_API_TOKEN` in the project :file:`settings.py`
|
Set :const:`MIXPANEL_API_TOKEN` in the project :file:`settings.py`
|
||||||
file::
|
file::
|
||||||
|
|
@ -137,16 +137,16 @@ For example::
|
||||||
Tracking events
|
Tracking events
|
||||||
===============
|
===============
|
||||||
|
|
||||||
The django-analytical app integrates the Mixpanel Javascript API in
|
The django-analytical app integrates the Mixpanel JavaScript API in
|
||||||
templates. To tracking events in views or other parts of Django, you
|
templates. To tracking events in views or other parts of Django, you
|
||||||
can use Wes Winham's `mixpanel-celery`_ package.
|
can use Wes Winham's `mixpanel-celery`_ package.
|
||||||
|
|
||||||
If you want to track an event in Javascript, use the asynchronous
|
If you want to track an event in JavaScript, use the asynchronous
|
||||||
notation, as described in the section titled
|
notation, as described in the section titled
|
||||||
`"Asynchronous Tracking with Javascript"`_ in the Mixpanel
|
`"Asynchronous Tracking with JavaScript"`_ in the Mixpanel
|
||||||
documentation. For example::
|
documentation. For example::
|
||||||
|
|
||||||
mixpanel.track("play-game", {"level": "12", "weapon": "sword", "character": "knight"});
|
mixpanel.track("play-game", {"level": "12", "weapon": "sword", "character": "knight"});
|
||||||
|
|
||||||
.. _mixpanel-celery: http://github.com/winhamwr/mixpanel-celery
|
.. _mixpanel-celery: http://github.com/winhamwr/mixpanel-celery
|
||||||
.. _`"Asynchronous Tracking with Javascript"`: http://mixpanel.com/api/docs/guides/integration/js#async
|
.. _`"Asynchronous Tracking with JavaScript"`: http://mixpanel.com/api/docs/guides/integration/js#async
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`olark-configuration`.
|
:ref:`olark-configuration`.
|
||||||
|
|
||||||
The Olark Javascript code is inserted into templates using a template
|
The Olark JavaScript code is inserted into templates using a template
|
||||||
tag. Load the :mod:`olark` template tag library and insert the
|
tag. Load the :mod:`olark` template tag library and insert the
|
||||||
:ttag:`olark` tag. Because every page that you want to track
|
:ttag:`olark` tag. Because every page that you want to track
|
||||||
must have the tag, it is useful to add it to your base template. Insert
|
must have the tag, it is useful to add it to your base template. Insert
|
||||||
|
|
@ -52,7 +52,7 @@ Setting the site ID
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
In order to install the chat code, you need to set your Olark site ID.
|
In order to install the chat code, you need to set your Olark site ID.
|
||||||
The :ttag:`olark` tag will include it in the rendered Javascript code.
|
The :ttag:`olark` tag will include it in the rendered JavaScript code.
|
||||||
You can find the site ID on `installation page`_ of you Olark account.
|
You can find the site ID on `installation page`_ of you Olark account.
|
||||||
Set :const:`OLARK_SITE_ID` in the project :file:`settings.py` file::
|
Set :const:`OLARK_SITE_ID` in the project :file:`settings.py` file::
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@ Just remember that if you set the same context variable in the
|
||||||
:class:`~django.template.context.RequestContext` constructor and in a
|
:class:`~django.template.context.RequestContext` constructor and in a
|
||||||
context processor, the latter clobbers the former.
|
context processor, the latter clobbers the former.
|
||||||
|
|
||||||
See also `api.chat.updateVisitorNickname`_ in the Olark Javascript API
|
See also `api.chat.updateVisitorNickname`_ in the Olark JavaScript API
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
.. _`api.chat.updateVisitorNickname`: http://www.olark.com/documentation/javascript/api.chat.updateVisitorNickname
|
.. _`api.chat.updateVisitorNickname`: http://www.olark.com/documentation/javascript/api.chat.updateVisitorNickname
|
||||||
|
|
@ -113,7 +113,7 @@ and the :ttag:`olark` tag will pass them to Olark as status messages::
|
||||||
]})
|
]})
|
||||||
return some_template.render(context)
|
return some_template.render(context)
|
||||||
|
|
||||||
See also `api.chat.updateVisitorStatus`_ in the Olark Javascript API
|
See also `api.chat.updateVisitorStatus`_ in the Olark JavaScript API
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
.. _`api.chat.updateVisitorStatus`: http://www.olark.com/documentation/javascript/api.chat.updateVisitorStatus
|
.. _`api.chat.updateVisitorStatus`: http://www.olark.com/documentation/javascript/api.chat.updateVisitorStatus
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ This step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`optimizely-configuration`.
|
:ref:`optimizely-configuration`.
|
||||||
|
|
||||||
The Optimizely Javascript code is inserted into templates using a
|
The Optimizely JavaScript code is inserted into templates using a
|
||||||
template tag. Load the :mod:`optimizely` template tag library and
|
template tag. Load the :mod:`optimizely` template tag library and
|
||||||
insert the :ttag:`optimizely` tag. Because every page that you want to
|
insert the :ttag:`optimizely` tag. Because every page that you want to
|
||||||
track must have the tag, it is useful to add it to your base template.
|
track must have the tag, it is useful to add it to your base template.
|
||||||
|
|
@ -53,7 +53,7 @@ Setting the account number
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Optimizely gives you a unique account number, and the :ttag:`optimizely`
|
Optimizely gives you a unique account number, and the :ttag:`optimizely`
|
||||||
tag will include it in the rendered Javascript code. You can find your
|
tag will include it in the rendered JavaScript code. You can find your
|
||||||
account number by clicking the *Implementation* link in the top
|
account number by clicking the *Implementation* link in the top
|
||||||
right-hand corner of the Optimizely website. A pop-up window will
|
right-hand corner of the Optimizely website. A pop-up window will
|
||||||
appear containing HTML code looking like this::
|
appear containing HTML code looking like this::
|
||||||
|
|
@ -66,7 +66,7 @@ file::
|
||||||
|
|
||||||
OPTIMIZELY_ACCOUNT_NUMBER = 'XXXXXXX'
|
OPTIMIZELY_ACCOUNT_NUMBER = 'XXXXXXX'
|
||||||
|
|
||||||
If you do not set an account number, the Javascript code will not be
|
If you do not set an account number, the JavaScript code will not be
|
||||||
rendered.
|
rendered.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ This step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`performable-configuration`.
|
:ref:`performable-configuration`.
|
||||||
|
|
||||||
The Performable Javascript code is inserted into templates using a
|
The Performable JavaScript code is inserted into templates using a
|
||||||
template tag. Load the :mod:`performable` template tag library and
|
template tag. Load the :mod:`performable` template tag library and
|
||||||
insert the :ttag:`performable` tag. Because every page that you want to
|
insert the :ttag:`performable` tag. Because every page that you want to
|
||||||
track must have the tag, it is useful to add it to your base template.
|
track must have the tag, it is useful to add it to your base template.
|
||||||
|
|
@ -53,14 +53,14 @@ Setting the API key
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
You Performable account has its own API key, which :ttag:`performable`
|
You Performable account has its own API key, which :ttag:`performable`
|
||||||
tag will include it in the rendered Javascript code. You can find your
|
tag will include it in the rendered JavaScript code. You can find your
|
||||||
API key on the *Account Settings* page (click 'Account Settings' in the
|
API key on the *Account Settings* page (click 'Account Settings' in the
|
||||||
top right-hand corner of your Performable dashboard). Set
|
top right-hand corner of your Performable dashboard). Set
|
||||||
:const:`PERFORMABLE_API_KEY` in the project :file:`settings.py` file::
|
:const:`PERFORMABLE_API_KEY` in the project :file:`settings.py` file::
|
||||||
|
|
||||||
PERFORMABLE_API_KEY = 'XXXXXX'
|
PERFORMABLE_API_KEY = 'XXXXXX'
|
||||||
|
|
||||||
If you do not set an API key, the Javascript code will not be rendered.
|
If you do not set an API key, the JavaScript code will not be rendered.
|
||||||
|
|
||||||
|
|
||||||
.. _performable-identity-user:
|
.. _performable-identity-user:
|
||||||
|
|
@ -116,7 +116,7 @@ Embedding a landing page
|
||||||
========================
|
========================
|
||||||
|
|
||||||
You can embed a Performable landing page in your Django website. The
|
You can embed a Performable landing page in your Django website. The
|
||||||
:ttag:`performable_embed` template tag adds the Javascript code to embed
|
:ttag:`performable_embed` template tag adds the JavaScript code to embed
|
||||||
the page. It takes two arguments: the hostname and the page ID::
|
the page. It takes two arguments: the hostname and the page ID::
|
||||||
|
|
||||||
{% performable_embed HOSTNAME PAGE_ID %}
|
{% performable_embed HOSTNAME PAGE_ID %}
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ Setting the counter ID
|
||||||
|
|
||||||
Every website you track with Rating\@Mail.ru gets its own counter ID,
|
Every website you track with Rating\@Mail.ru gets its own counter ID,
|
||||||
and the :ttag:`rating_mailru` tag will include it in the rendered
|
and the :ttag:`rating_mailru` tag will include it in the rendered
|
||||||
Javascript code. You can find the web counter ID on the overview page
|
JavaScript code. You can find the web counter ID on the overview page
|
||||||
of your account. Set :const:`RATING_MAILRU_COUNTER_ID` in the
|
of your account. Set :const:`RATING_MAILRU_COUNTER_ID` in the
|
||||||
project :file:`settings.py` file::
|
project :file:`settings.py` file::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ This step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`snapengage-configuration`.
|
:ref:`snapengage-configuration`.
|
||||||
|
|
||||||
The SnapEngage Javascript code is inserted into templates using a
|
The SnapEngage JavaScript code is inserted into templates using a
|
||||||
template tag. Load the :mod:`SnapEngage` template tag library and
|
template tag. Load the :mod:`SnapEngage` template tag library and
|
||||||
insert the :ttag:`SnapEngage` tag. Because every page that you want to
|
insert the :ttag:`SnapEngage` tag. Because every page that you want to
|
||||||
track must have the tag, it is useful to add it to your base template.
|
track must have the tag, it is useful to add it to your base template.
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ Setting the Tracking ID
|
||||||
|
|
||||||
Every website you track with Spring Metrics gets its own Tracking ID,
|
Every website you track with Spring Metrics gets its own Tracking ID,
|
||||||
and the :ttag:`spring_metrics` tag will include it in the rendered
|
and the :ttag:`spring_metrics` tag will include it in the rendered
|
||||||
Javascript code. You can find the Tracking ID in the `Site Settings`_
|
JavaScript code. You can find the Tracking ID in the `Site Settings`_
|
||||||
of your Spring Metrics account. Set :const:`SPRING_METRICS_TRACKING_ID`
|
of your Spring Metrics account. Set :const:`SPRING_METRICS_TRACKING_ID`
|
||||||
in the project :file:`settings.py` file::
|
in the project :file:`settings.py` file::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ This step is only needed if you are not using the generic
|
||||||
:ttag:`analytical.*` tags. If you are, skip to
|
:ttag:`analytical.*` tags. If you are, skip to
|
||||||
:ref:`uservoice-configuration`.
|
:ref:`uservoice-configuration`.
|
||||||
|
|
||||||
The UserVoice Javascript code is inserted into templates using a
|
The UserVoice JavaScript code is inserted into templates using a
|
||||||
template tag. Load the :mod:`uservoice` template tag library and insert
|
template tag. Load the :mod:`uservoice` template tag library and insert
|
||||||
the :ttag:`uservoice` tag. Because every page that you want to have
|
the :ttag:`uservoice` tag. Because every page that you want to have
|
||||||
the feedback tab to appear on must have the tag, it is useful to add
|
the feedback tab to appear on must have the tag, it is useful to add
|
||||||
|
|
@ -57,8 +57,8 @@ Setting the widget key
|
||||||
|
|
||||||
In order to use the feedback widget, you need to configure which widget
|
In order to use the feedback widget, you need to configure which widget
|
||||||
you want to show. You can find the widget keys in the *Channels* tab on
|
you want to show. You can find the widget keys in the *Channels* tab on
|
||||||
your UserVoice *Settings* page. Under the *Javascript Widget* heading,
|
your UserVoice *Settings* page. Under the *JavaScript Widget* heading,
|
||||||
find the Javascript embed code of the widget. The widget key is the
|
find the JavaScript embed code of the widget. The widget key is the
|
||||||
alphanumerical string contained in the URL of the script imported by the
|
alphanumerical string contained in the URL of the script imported by the
|
||||||
embed code::
|
embed code::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ the tag at the bottom of the HTML head::
|
||||||
</head>
|
</head>
|
||||||
...
|
...
|
||||||
|
|
||||||
Because Javascript code is asynchronous, putting the tag in the head
|
Because JavaScript code is asynchronous, putting the tag in the head
|
||||||
section increases the chances that a page view is going to be tracked
|
section increases the chances that a page view is going to be tracked
|
||||||
before the visitor leaves the page. See for details the `Asynchronous
|
before the visitor leaves the page. See for details the `Asynchronous
|
||||||
JavaScript Developer’s Guide`_ on the Woopra website.
|
JavaScript Developer’s Guide`_ on the Woopra website.
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ Setting the counter ID
|
||||||
|
|
||||||
Every website you track with Yandex.Metrica gets its own counter ID,
|
Every website you track with Yandex.Metrica gets its own counter ID,
|
||||||
and the :ttag:`yandex_metrica` tag will include it in the rendered
|
and the :ttag:`yandex_metrica` tag will include it in the rendered
|
||||||
Javascript code. You can find the web counter ID on the overview page
|
JavaScript code. You can find the web counter ID on the overview page
|
||||||
of your account. Set :const:`YANDEX_METRICA_COUNTER_ID` in the
|
of your account. Set :const:`YANDEX_METRICA_COUNTER_ID` in the
|
||||||
project :file:`settings.py` file::
|
project :file:`settings.py` file::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ authors = [
|
||||||
{name = "Eric Amador", email = "eric.amador14@gmail.com"},
|
{name = "Eric Amador", email = "eric.amador14@gmail.com"},
|
||||||
{name = "Eric Davis", email = "eric@davislv.com"},
|
{name = "Eric Davis", email = "eric@davislv.com"},
|
||||||
{name = "Eric Wang", email = "gnawrice@gmail.com"},
|
{name = "Eric Wang", email = "gnawrice@gmail.com"},
|
||||||
|
{name = "Erick Massip", email = "ericmassip1@gmail.com"},
|
||||||
{name = "Garrett Coakley", email = "garrettc@users.noreply.github.com"},
|
{name = "Garrett Coakley", email = "garrettc@users.noreply.github.com"},
|
||||||
{name = "Garrett Robinson", email = "garrett.f.robinson@gmail.com"},
|
{name = "Garrett Robinson", email = "garrett.f.robinson@gmail.com"},
|
||||||
{name = "GreenKahuna", email = "info@greenkahuna.com"},
|
{name = "GreenKahuna", email = "info@greenkahuna.com"},
|
||||||
|
|
@ -58,6 +59,8 @@ authors = [
|
||||||
{name = "Tinnet Coronam", email = "tinnet@coronam.net"},
|
{name = "Tinnet Coronam", email = "tinnet@coronam.net"},
|
||||||
{name = "Uros Trebec", email = "uros@trebec.org"},
|
{name = "Uros Trebec", email = "uros@trebec.org"},
|
||||||
{name = "Walter Renner", email = "walter.renner@me.com"},
|
{name = "Walter Renner", email = "walter.renner@me.com"},
|
||||||
|
{name = "Julian Haluska", email = "mail@julianhaluska.de"},
|
||||||
|
{name = "Ronard Luna", email = "rlunag@proton.me"},
|
||||||
]
|
]
|
||||||
maintainers = [
|
maintainers = [
|
||||||
{name = "Jazzband community", email = "jazzband-bot@users.noreply.github.com"},
|
{name = "Jazzband community", email = "jazzband-bot@users.noreply.github.com"},
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ from analytical.utils import AnalyticalException
|
||||||
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='UA-123456-7')
|
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='UA-123456-7')
|
||||||
class GoogleAnalyticsTagTestCase(TagTestCase):
|
class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
"""
|
"""
|
||||||
Tests for the ``google_analytics_js`` template tag.
|
Tests for the ``google_analytics_gtag`` template tag.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def test_tag(self):
|
def test_tag(self):
|
||||||
|
|
@ -25,7 +25,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
'<script async src="https://www.googletagmanager.com/gtag/js?id=UA-123456-7"></script>'
|
'<script async src="https://www.googletagmanager.com/gtag/js?id=UA-123456-7"></script>'
|
||||||
) in r
|
) in r
|
||||||
assert "gtag('js', new Date());" in r
|
assert "gtag('js', new Date());" in r
|
||||||
assert "gtag('config', 'UA-123456-7');" in r
|
assert "gtag('config', 'UA-123456-7', {});" in r
|
||||||
|
|
||||||
def test_node(self):
|
def test_node(self):
|
||||||
r = GoogleAnalyticsGTagNode().render(Context())
|
r = GoogleAnalyticsGTagNode().render(Context())
|
||||||
|
|
@ -33,7 +33,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
'<script async src="https://www.googletagmanager.com/gtag/js?id=UA-123456-7"></script>'
|
'<script async src="https://www.googletagmanager.com/gtag/js?id=UA-123456-7"></script>'
|
||||||
) in r
|
) in r
|
||||||
assert "gtag('js', new Date());" in r
|
assert "gtag('js', new Date());" in r
|
||||||
assert "gtag('config', 'UA-123456-7');" in r
|
assert "gtag('config', 'UA-123456-7', {});" in r
|
||||||
|
|
||||||
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID=None)
|
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID=None)
|
||||||
def test_no_property_id(self):
|
def test_no_property_id(self):
|
||||||
|
|
@ -57,7 +57,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
@override_settings(ANALYTICAL_AUTO_IDENTIFY=True)
|
@override_settings(ANALYTICAL_AUTO_IDENTIFY=True)
|
||||||
def test_identify(self):
|
def test_identify(self):
|
||||||
r = GoogleAnalyticsGTagNode().render(Context({'user': User(username='test')}))
|
r = GoogleAnalyticsGTagNode().render(Context({'user': User(username='test')}))
|
||||||
assert "gtag('set', {'user_id': 'test'});" in r
|
assert 'gtag(\'config\', \'UA-123456-7\', {"user_id": "test"});' in r
|
||||||
|
|
||||||
def test_identity_context_specific_provider(self):
|
def test_identity_context_specific_provider(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -68,12 +68,13 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
Context(
|
Context(
|
||||||
{
|
{
|
||||||
'google_analytics_gtag_identity': 'foo_gtag_identity',
|
'google_analytics_gtag_identity': 'foo_gtag_identity',
|
||||||
'analytical_identity': 'bar_analytical_identity',
|
|
||||||
'user': User(username='test'),
|
'user': User(username='test'),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
assert "gtag('set', {'user_id': 'foo_gtag_identity'});" in r
|
assert (
|
||||||
|
'gtag(\'config\', \'UA-123456-7\', {"user_id": "foo_gtag_identity"});' in r
|
||||||
|
)
|
||||||
|
|
||||||
def test_identity_context_general(self):
|
def test_identity_context_general(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -87,7 +88,10 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
assert "gtag('set', {'user_id': 'bar_analytical_identity'});" in r
|
assert (
|
||||||
|
'gtag(\'config\', \'UA-123456-7\', {"user_id": "bar_analytical_identity"});'
|
||||||
|
in r
|
||||||
|
)
|
||||||
|
|
||||||
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='G-12345678')
|
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='G-12345678')
|
||||||
def test_tag_with_measurement_id(self):
|
def test_tag_with_measurement_id(self):
|
||||||
|
|
@ -96,7 +100,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
'<script async src="https://www.googletagmanager.com/gtag/js?id=G-12345678"></script>'
|
'<script async src="https://www.googletagmanager.com/gtag/js?id=G-12345678"></script>'
|
||||||
) in r
|
) in r
|
||||||
assert "gtag('js', new Date());" in r
|
assert "gtag('js', new Date());" in r
|
||||||
assert "gtag('config', 'G-12345678');" in r
|
assert "gtag('config', 'G-12345678', {});" in r
|
||||||
|
|
||||||
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='AW-1234567890')
|
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='AW-1234567890')
|
||||||
def test_tag_with_conversion_id(self):
|
def test_tag_with_conversion_id(self):
|
||||||
|
|
@ -105,7 +109,7 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
'<script async src="https://www.googletagmanager.com/gtag/js?id=AW-1234567890"></script'
|
'<script async src="https://www.googletagmanager.com/gtag/js?id=AW-1234567890"></script'
|
||||||
) in r
|
) in r
|
||||||
assert "gtag('js', new Date());" in r
|
assert "gtag('js', new Date());" in r
|
||||||
assert "gtag('config', 'AW-1234567890');" in r
|
assert "gtag('config', 'AW-1234567890', {});" in r
|
||||||
|
|
||||||
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='DC-12345678')
|
@override_settings(GOOGLE_ANALYTICS_GTAG_PROPERTY_ID='DC-12345678')
|
||||||
def test_tag_with_advertiser_id(self):
|
def test_tag_with_advertiser_id(self):
|
||||||
|
|
@ -114,4 +118,47 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
|
||||||
'<script async src="https://www.googletagmanager.com/gtag/js?id=DC-12345678"></script>'
|
'<script async src="https://www.googletagmanager.com/gtag/js?id=DC-12345678"></script>'
|
||||||
) in r
|
) in r
|
||||||
assert "gtag('js', new Date());" in r
|
assert "gtag('js', new Date());" in r
|
||||||
assert "gtag('config', 'DC-12345678');" in r
|
assert "gtag('config', 'DC-12345678', {});" in r
|
||||||
|
|
||||||
|
def test_tag_with_custom_dimensions(self):
|
||||||
|
r = GoogleAnalyticsGTagNode().render(
|
||||||
|
Context(
|
||||||
|
{
|
||||||
|
'google_analytics_custom_dimensions': {
|
||||||
|
'dimension_1': 'foo',
|
||||||
|
'dimension_2': 'bar',
|
||||||
|
'user_properties': {
|
||||||
|
'user_property_1': True,
|
||||||
|
'user_property_2': 'xyz',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"gtag('config', 'UA-123456-7', {"
|
||||||
|
'"dimension_1": "foo", '
|
||||||
|
'"dimension_2": "bar", '
|
||||||
|
'"user_properties": {'
|
||||||
|
'"user_property_1": true, '
|
||||||
|
'"user_property_2": "xyz"}});' in r
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_tag_with_identity_and_custom_dimensions(self):
|
||||||
|
r = GoogleAnalyticsGTagNode().render(
|
||||||
|
Context(
|
||||||
|
{
|
||||||
|
'google_analytics_gtag_identity': 'foo_gtag_identity',
|
||||||
|
'google_analytics_custom_dimensions': {
|
||||||
|
'dimension_1': 'foo',
|
||||||
|
'dimension_2': 'bar',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"gtag('config', 'UA-123456-7', {"
|
||||||
|
'"dimension_1": "foo", '
|
||||||
|
'"dimension_2": "bar", '
|
||||||
|
'"user_id": "foo_gtag_identity"});' in r
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -159,3 +159,8 @@ class MatomoTagTestCase(TagTestCase):
|
||||||
def test_disable_cookies(self):
|
def test_disable_cookies(self):
|
||||||
r = MatomoNode().render(Context({}))
|
r = MatomoNode().render(Context({}))
|
||||||
assert "_paq.push(['disableCookies']);" in r
|
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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue