From 16ea361e18f31a98f3cdb42fa16e99a4f2694150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Avil=C3=A9s?= Date: Wed, 8 Oct 2014 13:56:56 +0200 Subject: [PATCH] Add base and tracking queries --- piwik/indico_piwik/__init__.py | 6 ++- piwik/indico_piwik/queries/__init__.py | 57 ++++++++++++++++++++++++++ piwik/indico_piwik/queries/tracking.py | 30 ++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 piwik/indico_piwik/queries/__init__.py create mode 100644 piwik/indico_piwik/queries/tracking.py diff --git a/piwik/indico_piwik/__init__.py b/piwik/indico_piwik/__init__.py index ab32cba..70219ee 100644 --- a/piwik/indico_piwik/__init__.py +++ b/piwik/indico_piwik/__init__.py @@ -22,6 +22,8 @@ class PiwikPlugin(IndicoPlugin): """ settings_form = SettingsForm + report_script = 'index.php' + track_script = 'piwik.php' default_settings = { 'enabled': True, @@ -86,8 +88,8 @@ class PiwikPlugin(IndicoPlugin): tracker = PiwikQueryTrackDownload() resource_url = request.url if isinstance(resource, LocalFile) else resource.getURL() resource_title = resource.getFileName() if isinstance(resource, LocalFile) else resource.getURL() - log_title = 'Download - {}'.format(resource_title) - tracker.trackDownload(resource_url, log_title) + resource_title = 'Download - {}'.format(resource_title) + tracker.call(resource_url, resource_title) blueprint = IndicoPluginBlueprint('piwik', __name__) diff --git a/piwik/indico_piwik/queries/__init__.py b/piwik/indico_piwik/queries/__init__.py new file mode 100644 index 0000000..632b5f6 --- /dev/null +++ b/piwik/indico_piwik/queries/__init__.py @@ -0,0 +1,57 @@ +from indico_piwik import PiwikPlugin +from indico_piwik.piwik import PiwikRequest + + +class PiwikQueryBase(object): + """Base Piwik query""" + + def __init__(self, query_script): + self.request = PiwikRequest(server_url=PiwikPlugin.settings.get('server_api_url'), + site_id=PiwikPlugin.settings.get('site_id_events'), + query_script=query_script) + + def call(self, **query_params): + return self.request.call(**query_params) + + +class PiwikQueryReportBase(PiwikQueryBase): + """Base Piwik query to request reports""" + + def __init__(self): + super(PiwikQueryReportBase, self).__init__(query_script=PiwikPlugin.report_script) + + def call(self, date=('last7',), period='day', **query_params): + date = date[0] if len(date) == 1 else ','.join(date) + query_params.update(self.get_type_params) + return super(PiwikQueryReportBase, self).call(date=date, period=period, **query_params) + + +class PiwikQueryReportEventBase(PiwikQueryReportBase): + """Base Piwik query to request reports of events and contributions""" + + def __init__(self, start_date, end_date, event_id, contrib_id=None): + super(PiwikQueryReportEventBase, self).__init__() + self.start_date = start_date + self.end_date = end_date + self.conf_id = event_id + self.contrib_id = contrib_id + + def call(self, **query_params): + return super(PiwikQueryReportEventBase, self).call(module='API', date=[self.start_date, self.end_date], + segmentation=self.get_segmentation(), **query_params) + + def get_segmentation(self): + segmentation = {'customVariablePageName1': ('==', 'Conference'), + 'customVariablePageValue1': ('==', self.event_id)} + if self.contrib_id: + segmentation['customVariablePageName2'] = ('==', 'Contribution') + segmentation['customVariablePageValue2'] = ('==', self.contrib_id) + + segments = set() + for name, (equality, value) in segmentation.iteritems(): + if isinstance(value, list): + value = ','.join(value) + segment = '{}{}{}'.format(name, equality, value) + segments.add(segment) + + return ';'.join(segments) diff --git a/piwik/indico_piwik/queries/tracking.py b/piwik/indico_piwik/queries/tracking.py new file mode 100644 index 0000000..723b4ea --- /dev/null +++ b/piwik/indico_piwik/queries/tracking.py @@ -0,0 +1,30 @@ +from datetime import datetime +from urllib2 import quote + +from . import PiwikQueryBase +from indico_piwik import PiwikPlugin + + +class PiwikQueryTrackBase(PiwikQueryBase): + """Base class for action-tracking queries""" + + def __init__(self): + super(PiwikQueryTrackBase, self).__init__(query_script=PiwikPlugin.track_script) + + def call(self, action_url, action_name, **query_params): + """Track an action in Piwik""" + dt = datetime.now() + query_params.update({'h': dt.hour, 'm': dt.minute, 's': dt.second}) + super(PiwikQueryTrackBase, self).call(idsite=self.request.site_id, rec=1, url=quote(action_url), + action_name=quote(action_name), **query_params) + + +class PiwikQueryTrackDownload(PiwikQueryTrackBase): + def call(self, download_url, download_title): + """Track a download in Piwik""" + if not download_url: + raise ValueError("download_url can't be empty") + if not download_title: + raise ValueError("download_title can't be empty") + super(PiwikQueryTrackDownload, self).call(action_url=download_url, action_name=download_title, + download=quote(download_url))