X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/2d8bcd45b873aa01d43b07d0179d373e0bdc9bb5..92ff4af75a2e0defd8989e6b29e39196f790d16c:/apps/stats/utils.py diff --git a/apps/stats/utils.py b/apps/stats/utils.py new file mode 100644 index 000000000..7ee4cfdbe --- /dev/null +++ b/apps/stats/utils.py @@ -0,0 +1,70 @@ + +from django.contrib.sites.models import Site +from piwik.django.models import PiwikSite +from django.conf import settings +import logging +from functools import update_wrapper +import httplib +import urlparse +import urllib +from random import random +from inspect import isclass + +logger = logging.getLogger(__name__) + + +def piwik_url(**kw): + url = settings.PIWIK_URL + u"/piwik.php?" + url += u'&'.join([k + u"=" + str(v) for k, v in kw.items()]) + logger.info("piwik url: %s" % url) + return url + +PIWIK_API_VERSION = 1 + + +def piwik_track(klass_or_method): + """Track decorated class or method using Piwik (according to configuration in settings and django-piwik) + Works for handler classes (executed by __call__) or handler methods. Expects request to be the first parameter + """ + # Retrieve piwik information + current_site = Site.objects.get_current() + piwik_site = PiwikSite.objects.filter(site=current_site.id) + + if len(piwik_site) == 0: + logger.debug("No PiwikSite is configured for Site " + current_site.name) + return klass_or_method + + id_piwik = piwik_site[0].id_site + host = urlparse.urlsplit(settings.PIWIK_URL).netloc + + # get target method + if isclass(klass_or_method): + klass = klass_or_method + call_func = klass.__call__ + else: + call_func = klass_or_method + + def wrap(self, request, *args, **kw): + conn = httplib.HTTPConnection(host) + conn.request('GET', piwik_url( + rec=1, + apiv=PIWIK_API_VERSION, + rand=int(random() * 0x10000), + token_auth=urllib.quote(settings.PIWIK_TOKEN), + cip=urllib.quote(request.META['REMOTE_ADDR']), + url=urllib.quote('http://' + request.META['HTTP_HOST'] + request.path), + urlref=urllib.quote(request.META['HTTP_REFERER']) if 'HTTP_REFERER' in request.META else '', + idsite=id_piwik)) + + conn.close() + return call_func(self, request, *args, **kw) + + # and wrap it + update_wrapper(wrap, call_func) + + if isclass(klass_or_method): + klass.__call__ = wrap + return klass + else: + print klass_or_method + return wrap