From 460a9d9e37673db1b12a12dca1d811624e4b50b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Avil=C3=A9s?= Date: Wed, 19 Nov 2014 16:27:38 +0100 Subject: [PATCH] Move PiwikPlugin class to plugin.py file --- piwik/indico_piwik/__init__.py | 127 ------------------------- piwik/indico_piwik/plugin.py | 127 +++++++++++++++++++++++++ piwik/indico_piwik/queries/__init__.py | 4 +- piwik/indico_piwik/queries/tracking.py | 2 +- piwik/indico_piwik/reports.py | 2 +- piwik/indico_piwik/zodbimport.py | 2 +- piwik/setup.py | 2 +- 7 files changed, 133 insertions(+), 133 deletions(-) create mode 100644 piwik/indico_piwik/plugin.py diff --git a/piwik/indico_piwik/__init__.py b/piwik/indico_piwik/__init__.py index 738af57..e69de29 100644 --- a/piwik/indico_piwik/__init__.py +++ b/piwik/indico_piwik/__init__.py @@ -1,127 +0,0 @@ -# This file is part of Indico. -# Copyright (C) 2002 - 2014 European Organization for Nuclear Research (CERN). -# -# Indico is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 3 of the -# License, or (at your option) any later version. -# -# Indico is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Indico; if not, see . - -from urllib2 import urlparse - -from flask import request -from flask_pluginengine import render_plugin_template - -from indico.core import signals -from indico.core.plugins import IndicoPlugin, IndicoPluginBlueprint, url_for_plugin, plugin_url_rule_to_js -from indico.util.i18n import _ -from MaKaC.conference import ConferenceHolder, LocalFile -from MaKaC.webinterface.wcomponents import SideMenuItem - -from .controllers import (RHStatistics, RHApiMaterial, RHApiDownloads, RHApiEventVisitsPerDay, - RHApiEventGraphCountries, RHApiEventGraphDevices) -from .forms import SettingsForm -from .queries.tracking import PiwikQueryTrackDownload - - -class PiwikPlugin(IndicoPlugin): - """Piwik statistics - - Retrieves piwik statistics for conferences, meetings and contributions. - """ - - settings_form = SettingsForm - report_script = 'index.php' - track_script = 'piwik.php' - - default_settings = { - 'enabled': True, - 'enabled_for_events': True, - 'enabled_for_downloads': True, - 'cache_enabled': True, - 'cache_ttl': 3600, - 'server_url': '//127.0.0.1/piwik/', - 'server_api_url': '//127.0.0.1/piwik/', - 'use_only_server_url': True, - 'site_id_general': 1, - 'site_id_events': 2 - } - - def init(self): - super(PiwikPlugin, self).init() - self.connect(signals.event_management_sidemenu, self.add_sidemenu_item) - self.connect(signals.material_downloaded, self.track_download) - self.template_hook('html-head', self.inject_tracking) - - def inject_tracking(self, template, **kwargs): - server_url = self._get_tracking_url() - site_id_general = self.settings.get('site_id_general') - if not self.settings.get('enabled') or not server_url or not site_id_general: - return '' - event_tracking_params = self._get_event_tracking_params() - return render_plugin_template('tracking.html', - site_id_general=site_id_general, - server_url=server_url, - **event_tracking_params) - - def add_sidemenu_item(self, event, **kwargs): - menu_item = SideMenuItem(_("Statistics"), url_for_plugin('piwik.view', event)) - return 'statistics', menu_item - - def get_blueprints(self): - return blueprint - - def get_vars_js(self): - return {'urls': {'material': plugin_url_rule_to_js('piwik.material'), - 'data_downloads': plugin_url_rule_to_js('piwik.data_downloads'), - 'data_visits': plugin_url_rule_to_js('piwik.data_visits'), - 'graph_countries': plugin_url_rule_to_js('piwik.graph_countries'), - 'graph_devices': plugin_url_rule_to_js('piwik.graph_devices')}} - - def register_assets(self): - self.register_js_bundle('statistics_js', 'js/statistics.js') - self.register_css_bundle('statistics_css', 'css/statistics.css') - self.register_js_bundle('jqtree_js', 'js/lib/jqTree/tree.jquery.js') - self.register_css_bundle('jqtree_css', 'js/lib/jqTree/jqtree.css') - - def track_download(self, event, resource, **kwargs): - tracker = PiwikQueryTrackDownload() - resource_url = request.url if isinstance(resource, LocalFile) else resource.getURL() - resource_title = resource.getFileName() if isinstance(resource, LocalFile) else resource.getURL() - resource_title = 'Download - {}'.format(resource_title) - tracker.call(resource_url, resource_title) - - def _get_event_tracking_params(self): - site_id_events = PiwikPlugin.settings.get('site_id_events') - if not self.settings.get('enabled_for_events') or not site_id_events: - return {} - params = {'site_id_events': site_id_events} - if request.blueprint == 'event': - params['event_id'] = request.view_args['confId'] - contrib_id = request.view_args.get('contribId') - if contrib_id: - contribution = ConferenceHolder().getById(params['event_id']).getContributionById(contrib_id) - params['contrib_id'] = contribution.getUniqueId() - return params - - def _get_tracking_url(self): - url = self.settings.get('server_url') - url = url if url.endswith('/') else url + '/' - url = urlparse.urlparse(url) - return url.netloc + url.path - - -blueprint = IndicoPluginBlueprint('piwik', __name__, url_prefix='/event//manage/statistics') -blueprint.add_url_rule('/', 'view', RHStatistics) -blueprint.add_url_rule('/material', 'material', RHApiMaterial, methods=('GET', 'POST')) -blueprint.add_url_rule('/data/downloads', 'data_downloads', RHApiDownloads, methods=('GET', 'POST')) -blueprint.add_url_rule('/data/visits', 'data_visits', RHApiEventVisitsPerDay, methods=('GET', 'POST')) -blueprint.add_url_rule('/graph/countries', 'graph_countries', RHApiEventGraphCountries, methods=('GET', 'POST')) -blueprint.add_url_rule('/graph/devices', 'graph_devices', RHApiEventGraphDevices, methods=('GET', 'POST')) diff --git a/piwik/indico_piwik/plugin.py b/piwik/indico_piwik/plugin.py new file mode 100644 index 0000000..738af57 --- /dev/null +++ b/piwik/indico_piwik/plugin.py @@ -0,0 +1,127 @@ +# This file is part of Indico. +# Copyright (C) 2002 - 2014 European Organization for Nuclear Research (CERN). +# +# Indico is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# Indico is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Indico; if not, see . + +from urllib2 import urlparse + +from flask import request +from flask_pluginengine import render_plugin_template + +from indico.core import signals +from indico.core.plugins import IndicoPlugin, IndicoPluginBlueprint, url_for_plugin, plugin_url_rule_to_js +from indico.util.i18n import _ +from MaKaC.conference import ConferenceHolder, LocalFile +from MaKaC.webinterface.wcomponents import SideMenuItem + +from .controllers import (RHStatistics, RHApiMaterial, RHApiDownloads, RHApiEventVisitsPerDay, + RHApiEventGraphCountries, RHApiEventGraphDevices) +from .forms import SettingsForm +from .queries.tracking import PiwikQueryTrackDownload + + +class PiwikPlugin(IndicoPlugin): + """Piwik statistics + + Retrieves piwik statistics for conferences, meetings and contributions. + """ + + settings_form = SettingsForm + report_script = 'index.php' + track_script = 'piwik.php' + + default_settings = { + 'enabled': True, + 'enabled_for_events': True, + 'enabled_for_downloads': True, + 'cache_enabled': True, + 'cache_ttl': 3600, + 'server_url': '//127.0.0.1/piwik/', + 'server_api_url': '//127.0.0.1/piwik/', + 'use_only_server_url': True, + 'site_id_general': 1, + 'site_id_events': 2 + } + + def init(self): + super(PiwikPlugin, self).init() + self.connect(signals.event_management_sidemenu, self.add_sidemenu_item) + self.connect(signals.material_downloaded, self.track_download) + self.template_hook('html-head', self.inject_tracking) + + def inject_tracking(self, template, **kwargs): + server_url = self._get_tracking_url() + site_id_general = self.settings.get('site_id_general') + if not self.settings.get('enabled') or not server_url or not site_id_general: + return '' + event_tracking_params = self._get_event_tracking_params() + return render_plugin_template('tracking.html', + site_id_general=site_id_general, + server_url=server_url, + **event_tracking_params) + + def add_sidemenu_item(self, event, **kwargs): + menu_item = SideMenuItem(_("Statistics"), url_for_plugin('piwik.view', event)) + return 'statistics', menu_item + + def get_blueprints(self): + return blueprint + + def get_vars_js(self): + return {'urls': {'material': plugin_url_rule_to_js('piwik.material'), + 'data_downloads': plugin_url_rule_to_js('piwik.data_downloads'), + 'data_visits': plugin_url_rule_to_js('piwik.data_visits'), + 'graph_countries': plugin_url_rule_to_js('piwik.graph_countries'), + 'graph_devices': plugin_url_rule_to_js('piwik.graph_devices')}} + + def register_assets(self): + self.register_js_bundle('statistics_js', 'js/statistics.js') + self.register_css_bundle('statistics_css', 'css/statistics.css') + self.register_js_bundle('jqtree_js', 'js/lib/jqTree/tree.jquery.js') + self.register_css_bundle('jqtree_css', 'js/lib/jqTree/jqtree.css') + + def track_download(self, event, resource, **kwargs): + tracker = PiwikQueryTrackDownload() + resource_url = request.url if isinstance(resource, LocalFile) else resource.getURL() + resource_title = resource.getFileName() if isinstance(resource, LocalFile) else resource.getURL() + resource_title = 'Download - {}'.format(resource_title) + tracker.call(resource_url, resource_title) + + def _get_event_tracking_params(self): + site_id_events = PiwikPlugin.settings.get('site_id_events') + if not self.settings.get('enabled_for_events') or not site_id_events: + return {} + params = {'site_id_events': site_id_events} + if request.blueprint == 'event': + params['event_id'] = request.view_args['confId'] + contrib_id = request.view_args.get('contribId') + if contrib_id: + contribution = ConferenceHolder().getById(params['event_id']).getContributionById(contrib_id) + params['contrib_id'] = contribution.getUniqueId() + return params + + def _get_tracking_url(self): + url = self.settings.get('server_url') + url = url if url.endswith('/') else url + '/' + url = urlparse.urlparse(url) + return url.netloc + url.path + + +blueprint = IndicoPluginBlueprint('piwik', __name__, url_prefix='/event//manage/statistics') +blueprint.add_url_rule('/', 'view', RHStatistics) +blueprint.add_url_rule('/material', 'material', RHApiMaterial, methods=('GET', 'POST')) +blueprint.add_url_rule('/data/downloads', 'data_downloads', RHApiDownloads, methods=('GET', 'POST')) +blueprint.add_url_rule('/data/visits', 'data_visits', RHApiEventVisitsPerDay, methods=('GET', 'POST')) +blueprint.add_url_rule('/graph/countries', 'graph_countries', RHApiEventGraphCountries, methods=('GET', 'POST')) +blueprint.add_url_rule('/graph/devices', 'graph_devices', RHApiEventGraphDevices, methods=('GET', 'POST')) diff --git a/piwik/indico_piwik/queries/__init__.py b/piwik/indico_piwik/queries/__init__.py index e743fdf..3b8dc89 100644 --- a/piwik/indico_piwik/queries/__init__.py +++ b/piwik/indico_piwik/queries/__init__.py @@ -21,7 +21,7 @@ class PiwikQueryBase(object): """Base Piwik query""" def __init__(self, query_script): - from indico_piwik import PiwikPlugin + from indico_piwik.plugin import PiwikPlugin self.request = PiwikRequest(server_url=PiwikPlugin.settings.get('server_api_url'), site_id=PiwikPlugin.settings.get('site_id_events'), api_token=PiwikPlugin.settings.get('server_token'), @@ -35,7 +35,7 @@ class PiwikQueryReportBase(PiwikQueryBase): """Base Piwik query to request reports""" def __init__(self): - from indico_piwik import PiwikPlugin + from indico_piwik.plugin import PiwikPlugin super(PiwikQueryReportBase, self).__init__(query_script=PiwikPlugin.report_script) def call(self, date=('last7',), period='day', **query_params): diff --git a/piwik/indico_piwik/queries/tracking.py b/piwik/indico_piwik/queries/tracking.py index 3872b66..8d460a5 100644 --- a/piwik/indico_piwik/queries/tracking.py +++ b/piwik/indico_piwik/queries/tracking.py @@ -24,7 +24,7 @@ class PiwikQueryTrackBase(PiwikQueryBase): """Base class for action-tracking queries""" def __init__(self): - from indico_piwik import PiwikPlugin + from indico_piwik.plugin import PiwikPlugin super(PiwikQueryTrackBase, self).__init__(query_script=PiwikPlugin.track_script) def call(self, action_url, action_name, **query_params): diff --git a/piwik/indico_piwik/reports.py b/piwik/indico_piwik/reports.py index 5142e48..2cd72ca 100644 --- a/piwik/indico_piwik/reports.py +++ b/piwik/indico_piwik/reports.py @@ -54,7 +54,7 @@ class ReportBase(Serializer): def get(cls, *args, **kwargs): """Create and return a serializable Report object, retrieved from cache if possible""" - from . import PiwikPlugin + from indico_piwik.plugin import PiwikPlugin if not PiwikPlugin.settings.get('cache_enabled'): return cls(*args, **kwargs).to_serializable() diff --git a/piwik/indico_piwik/zodbimport.py b/piwik/indico_piwik/zodbimport.py index 86cac89..1f86cde 100644 --- a/piwik/indico_piwik/zodbimport.py +++ b/piwik/indico_piwik/zodbimport.py @@ -20,7 +20,7 @@ from indico.core.db import db from indico.util.console import cformat from indico_zodbimport import Importer, convert_to_unicode -from indico_piwik import PiwikPlugin +from indico_piwik.plugin import PiwikPlugin class PiwikImporter(Importer): diff --git a/piwik/setup.py b/piwik/setup.py index 0bd9839..7bdc169 100644 --- a/piwik/setup.py +++ b/piwik/setup.py @@ -39,6 +39,6 @@ setup( 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', 'Programming Language :: Python :: 2.7' ], - entry_points={'indico.plugins': {'piwik = indico_piwik:PiwikPlugin'}, + entry_points={'indico.plugins': {'piwik = indico_piwik.plugin:PiwikPlugin'}, 'indico.zodb_importers': {'piwik = indico_piwik.zodbimport:PiwikImporter'}} )