Generalize Report and visits/download reports

This commit is contained in:
Alejandro Avilés 2014-10-10 14:42:20 +02:00
parent a9bc9f6298
commit c68e1ad83a

View File

@ -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()