mirror of
https://github.com/lucaspalomodevelop/indico-plugins.git
synced 2026-03-17 01:04:55 +00:00
Generalize Report and visits/download reports
This commit is contained in:
parent
a9bc9f6298
commit
c68e1ad83a
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user