From 7a6708e9fe89fbc9bccf449a134a7ba69ac2afdb Mon Sep 17 00:00:00 2001 From: Marcin Koziej Date: Thu, 6 Oct 2011 13:15:51 +0200 Subject: [PATCH] OPDS Piwik stats --- apps/opds/utils.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++ apps/opds/views.py | 19 ++++++++++------- 2 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 apps/opds/utils.py diff --git a/apps/opds/utils.py b/apps/opds/utils.py new file mode 100644 index 000000000..1cfcdd9a2 --- /dev/null +++ b/apps/opds/utils.py @@ -0,0 +1,52 @@ + +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 +from random import random + +logging.basicConfig(level=logging.WARN) +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()]) + return url + +PIWIK_API_VERSION = 1 + + +def piwik_track(klass): + current_site = Site.objects.get_current() + piwik_site = PiwikSite.objects.filter(site=current_site.id) + + if len(piwik_site) == 0: + logger.warn("No PiwikSite is configured for Site " + current_site.name) + return klass + + id_piwik = piwik_site[0].id_site + call_func = klass.__call__ + host = urlparse.urlsplit(settings.PIWIK_URL).netloc + + 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), + cip=request.META['REMOTE_ADDR'], + url='http://' + request.META['HTTP_HOST'] + request.path, + urlref=request.META['HTTP_REFERER'] if 'HTTP_REFERER' in request.META else '', + idsite=id_piwik)) + + conn.close() + return call_func(self, request, *args, **kw) + + update_wrapper(wrap, call_func) + klass.__call__ = wrap + + return klass diff --git a/apps/opds/views.py b/apps/opds/views.py index 9431684b3..52335709b 100644 --- a/apps/opds/views.py +++ b/apps/opds/views.py @@ -18,6 +18,7 @@ from basicauth import logged_in_or_basicauth, factory_decorator from catalogue.models import Book, Tag from catalogue.views import books_starting_with +from opds.utils import piwik_track _root_feeds = ( { @@ -186,7 +187,7 @@ class AcquisitionFeed(Feed): def item_enclosure_length(self, book): return book.root_ancestor.epub_file.size - +@piwik_track class RootFeed(Feed): feed_type = OPDSFeed title = u'Wolne Lektury' @@ -207,7 +208,7 @@ class RootFeed(Feed): def item_description(self, item): return item['description'] - +@piwik_track class ByCategoryFeed(Feed): feed_type = OPDSFeed link = u'http://www.wolnelektury.pl/' @@ -239,7 +240,7 @@ class ByCategoryFeed(Feed): def item_description(self): return u'' - +@piwik_track class ByTagFeed(AcquisitionFeed): def link(self, tag): return tag.get_absolute_url() @@ -263,7 +264,8 @@ class ByTagFeed(AcquisitionFeed): return books -#@factory_decorator(logged_in_or_basicauth()) +@factory_decorator(logged_in_or_basicauth()) +@piwik_track class UserFeed(Feed): feed_type = OPDSFeed link = u'http://www.wolnelektury.pl/' @@ -290,10 +292,11 @@ class UserFeed(Feed): return u'' # no class decorators in python 2.5 -UserFeed = factory_decorator(logged_in_or_basicauth())(UserFeed) +#UserFeed = factory_decorator(logged_in_or_basicauth())(UserFeed) -#@factory_decorator(logged_in_or_basicauth()) +@factory_decorator(logged_in_or_basicauth()) +@piwik_track class UserSetFeed(AcquisitionFeed): def link(self, tag): return tag.get_absolute_url() @@ -311,9 +314,9 @@ class UserSetFeed(AcquisitionFeed): return Book.tagged.with_any([tag]) # no class decorators in python 2.5 -UserSetFeed = factory_decorator(logged_in_or_basicauth())(UserSetFeed) - +#UserSetFeed = factory_decorator(logged_in_or_basicauth())(UserSetFeed) +@piwik_track class SearchFeed(AcquisitionFeed): description = u"Wyniki wyszukiwania na stronie WolneLektury.pl" title = u"Wyniki wyszukiwania" -- 2.20.1