File: analytical.py

package info (click to toggle)
python-django-analytical 3.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 720 kB
  • sloc: python: 4,693; makefile: 7
file content (96 lines) | stat: -rw-r--r-- 2,703 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
"""
Analytical template tags and filters.
"""

import logging
from importlib import import_module

from django import template
from django.template import Node, TemplateSyntaxError

from analytical.utils import AnalyticalException

TAG_LOCATIONS = ['head_top', 'head_bottom', 'body_top', 'body_bottom']
TAG_POSITIONS = ['first', None, 'last']
TAG_MODULES = [
    'analytical.chartbeat',
    'analytical.clickmap',
    'analytical.clicky',
    'analytical.crazy_egg',
    'analytical.facebook_pixel',
    'analytical.gauges',
    'analytical.google_analytics',
    'analytical.google_analytics_js',
    'analytical.google_analytics_gtag',
    'analytical.gosquared',
    'analytical.heap',
    'analytical.hotjar',
    'analytical.hubspot',
    'analytical.intercom',
    'analytical.kiss_insights',
    'analytical.kiss_metrics',
    'analytical.luckyorange',
    'analytical.matomo',
    'analytical.mixpanel',
    'analytical.olark',
    'analytical.optimizely',
    'analytical.performable',
    'analytical.rating_mailru',
    'analytical.snapengage',
    'analytical.spring_metrics',
    'analytical.uservoice',
    'analytical.woopra',
    'analytical.yandex_metrica',
]

logger = logging.getLogger(__name__)
register = template.Library()


def _location_tag(location):
    def analytical_tag(parser, token):
        bits = token.split_contents()
        if len(bits) > 1:
            raise TemplateSyntaxError("'%s' tag takes no arguments" % bits[0])
        return AnalyticalNode(location)

    return analytical_tag


for loc in TAG_LOCATIONS:
    register.tag('analytical_%s' % loc, _location_tag(loc))


class AnalyticalNode(Node):
    def __init__(self, location):
        self.nodes = [node_cls() for node_cls in template_nodes[location]]

    def render(self, context):
        return ''.join([node.render(context) for node in self.nodes])


def _load_template_nodes():
    template_nodes = {loc: {pos: [] for pos in TAG_POSITIONS} for loc in TAG_LOCATIONS}

    def add_node_cls(location, node, position=None):
        template_nodes[location][position].append(node)

    for path in TAG_MODULES:
        module = _import_tag_module(path)
        try:
            module.contribute_to_analytical(add_node_cls)
        except AnalyticalException as e:
            logger.debug("not loading tags from '%s': %s", path, e)
    for location in TAG_LOCATIONS:
        template_nodes[location] = sum(
            (template_nodes[location][p] for p in TAG_POSITIONS), []
        )
    return template_nodes


def _import_tag_module(path):
    app_name, lib_name = path.rsplit('.', 1)
    return import_module('%s.templatetags.%s' % (app_name, lib_name))


template_nodes = _load_template_nodes()