diff --git a/piwik/indico_piwik/reports.py b/piwik/indico_piwik/reports.py index 822fb95..b26935f 100644 --- a/piwik/indico_piwik/reports.py +++ b/piwik/indico_piwik/reports.py @@ -1,3 +1,4 @@ +from collections import defaultdict from datetime import timedelta from indico.util.date_time import format_time @@ -6,59 +7,28 @@ from MaKaC.common.cache import GenericCache from MaKaC.common.timezoneUtils import nowutc, utc2server from MaKaC.conference import ConferenceHolder -from queries.metrics import (PiwikQueryReportEventMetricReferrers, PiwikQueryReportEventMetricUniqueVisits, - PiwikQueryReportEventMetricVisits, PiwikQueryReportEventMetricVisitDuration, - PiwikQueryReportEventMetricPeakDateAndVisitors) +from queries.metrics import (PiwikQueryReportEventMetricDownloads, PiwikQueryReportEventMetricPeakDateAndVisitors, + PiwikQueryReportEventMetricReferrers, PiwikQueryReportEventMetricUniqueVisits, + PiwikQueryReportEventMetricVisits, PiwikQueryReportEventMetricVisitDuration) -class Report(Serializer): +class ReportBase(Serializer): + """Wrapper for Piwik report collection""" + __public__ = ['metrics'] default_report_interval = 14 - __public__ = ['event_id', 'contrib_id', 'start_date', 'end_date', 'metrics', 'contributions', 'timestamp'] - - def __init__(self, event_id, contrib_id=None, start_date=None, end_date=None): + def __init__(self, event_id, contrib_id=None, start_date=None, end_date=None, **report_params): self.metrics = {} - self.contributions = {} - self.event_id = event_id self.contrib_id = contrib_id self._init_date_range(start_date, end_date) - - params = {'start_date': self.start_date, - 'end_date': self.end_date, - 'event_id': event_id, - 'contrib_id': contrib_id} - - self._queries = {'visits': PiwikQueryReportEventMetricVisits(**params), - 'uniqueVisits': PiwikQueryReportEventMetricUniqueVisits(**params), - 'visitLength': PiwikQueryReportEventMetricVisitDuration(**params), - 'referrers': PiwikQueryReportEventMetricReferrers(**params), - 'peakDate': PiwikQueryReportEventMetricPeakDateAndVisitors(**params)} - - self._fetch_report() - self._fetch_contribution_info() + self._build_report(**report_params) self.timestamp = utc2server(nowutc(), naive=False) - @property - def event(self): - return ConferenceHolder().getById(self.event_id) - - def _fetch_contribution_info(self): - """Build the list of information entries for contributions of the event""" - contributions = self.event.getContributionList() - for contribution in contributions: - if not contribution.isScheduled(): - continue - time = format_time(contribution.getStartDate()) - info = '{} ({})'.format(contribution.getTitle(), time) - contrib_id = contribution.getUniqueId() - self.contributions[contrib_id] = info - - def _fetch_report(self): - """Build the report by performing queries to Piwik""" - for query_name, query in self._queries.iteritems(): - self.metrics[query_name] = query.get_result() + def _build_report(self): + """To be overriden""" + pass def _init_date_range(self, start_date=None, end_date=None): """Set date range defaults if no dates are passed""" @@ -69,7 +39,76 @@ class Report(Serializer): end_date = self.event.getEndDate().date() self.end_date = end_date if end_date < today else today if self.start_date is None: - self.start_date = self.end_date - timedelta(days=Report.default_report_interval) + self.start_date = self.end_date - timedelta(days=ReportBase.default_report_interval) + + +class ReportDownloads(ReportBase): + def _build_report(self, download_url): + params = {'start_date': self.start_date, + 'end_date': self.end_date, + 'event_id': self.event_id, + 'contrib_id': self.contrib_id} + self.metrics['downloads'] = PiwikQueryReportEventMetricDownloads(**params).get_result(download_url) + + +class ReportGeneral(ReportBase): + + __public__ = ['event_id', 'contrib_id', 'start_date', 'end_date', 'metrics', 'contributions', 'timestamp'] + + @property + def event(self): + return ConferenceHolder().getById(self.event_id) + + def _build_report(self): + """Build the report by performing queries to Piwik""" + params = {'start_date': self.start_date, + 'end_date': self.end_date, + 'event_id': self.event_id, + 'contrib_id': self.contrib_id} + + queries = {'visits': PiwikQueryReportEventMetricVisits(**params), + 'uniqueVisits': PiwikQueryReportEventMetricUniqueVisits(**params), + 'visitLength': PiwikQueryReportEventMetricVisitDuration(**params), + 'referrers': PiwikQueryReportEventMetricReferrers(**params), + 'peakDate': PiwikQueryReportEventMetricPeakDateAndVisitors(**params)} + + for query_name, query in queries.iteritems(): + self.metrics[query_name] = query.get_result() + + self._fetch_contribution_info() + + def _fetch_contribution_info(self): + """Build the list of information entries for contributions of the event""" + self.contributions = {} + + contributions = self.event.getContributionList() + for contribution in contributions: + if not contribution.isScheduled(): + continue + time = format_time(contribution.getStartDate()) + info = '{} ({})'.format(contribution.getTitle(), time) + contrib_id = contribution.getUniqueId() + self.contributions[contrib_id] = info + + +class ReportVisits(ReportBase): + def _build_report(self): + params = {'start_date': self.start_date, + 'end_date': self.end_date, + 'event_id': self.event_id, + 'contrib_id': self.contrib_id} + self.metrics['unique'] = PiwikQueryReportEventMetricUniqueVisits(**params).get_result() + self.metrics['total'] = PiwikQueryReportEventMetricVisits(**params).get_result() + self._reduce_metrics() + + def _reduce_metrics(self): + reduced_metrics = defaultdict(dict) + + for metric_type, records in self.metrics.iteritems(): + for date, hits in records.iteritems(): + reduced_metrics[date][metric_type] = int(hits) + + self.metrics = reduced_metrics def obtain_report(event_id, contrib_id=None, start_date=None, end_date=None): @@ -77,13 +116,13 @@ def obtain_report(event_id, contrib_id=None, start_date=None, end_date=None): from . import PiwikPlugin if not PiwikPlugin.settings.get('cache_enabled'): - return Report(event_id, contrib_id, start_date, end_date).to_serializable() + return ReportGeneral(event_id, contrib_id, start_date, end_date).to_serializable() cache = GenericCache('Piwik.ReportCache') key = '{}-{}-{}-{}'.format(event_id, contrib_id, unicode(start_date), unicode(end_date)) report = cache.get(key) if not report: - report = Report(event_id, contrib_id, start_date, end_date) + report = ReportGeneral(event_id, contrib_id, start_date, end_date) cache.set(key, report, PiwikPlugin.settings.get('cache_ttl')) return report.to_serializable()