import logging | import logging |
from ckan.lib.base import BaseController, c, render | import operator |
import report_model | from ckan.lib.base import BaseController, c, render,request |
import ckan.model as model | |
from ga_model import GA_Url | |
log = logging.getLogger('ckanext.ga-report') | log = logging.getLogger('ckanext.ga-report') |
class GaReport(BaseController): | class GaReport(BaseController): |
def index(self): | def index(self): |
return render('ga_report/site/index.html') | return render('ga_report/site/index.html') |
class GaPublisherReport(BaseController): | class GaPublisherReport(BaseController): |
""" | |
Displays the pageview and visit count for specific publishers based on | |
the datasets associated with the publisher. | |
""" | |
def _get_month_name(self, str): | |
import calendar | |
from time import strptime | |
d = strptime('2012-10', '%Y-%m') | |
return '%s %s' % (calendar.month_name[d.tm_mon], d.tm_year) | |
def index(self, id): | def index(self, id): |
c.publisher = model.Group.get(id) | |
c.top_packages = [] # package, dataset_views in c.top_packages | |
# Get the month details by fetching distinct values and determining the | |
# month names from the values. | |
c.months = [] | |
vals = model.Session.query(GA_Url.period_name).distinct().all() | |
for m in vals: | |
c.months.append( (m[0],self._get_month_name(m))) | |
# Sort the months, so most recent is at the head of our list | |
c.months = sorted(c.months, key=operator.itemgetter(0), reverse=True) | |
# Work out which month to show, based on query params of the first item | |
c.month = request.params.get('month', c.months[0][0] if c.months else '') | |
c.month_desc = ''.join([m[1] for m in c.months if m[0]==c.month]) | |
entry = model.Session.query(GA_Url).\ | |
filter(GA_Url.url=='/publisher/%s' % c.publisher.name).\ | |
filter(GA_Url.period_name==c.month).first() | |
c.publisher_page_views = entry.pageviews if entry else 0 | |
entries = model.Session.query(GA_Url).\ | |
filter(GA_Url.department_id==c.publisher.name).\ | |
filter(GA_Url.period_name==c.month).\ | |
order_by('ga_url.pageviews desc').all() | |
for entry in entries: | |
if entry.url.startswith('/dataset/'): | |
p = model.Package.get(entry.url[len('/dataset/'):]) | |
c.top_packages.append((p,entry.pageviews,entry.visitors)) | |
return render('ga_report/publisher/index.html') | return render('ga_report/publisher/index.html') |
import logging | import logging |
import ckan.lib.helpers as h | import ckan.lib.helpers as h |
import ckan.plugins as p | import ckan.plugins as p |
from ckan.plugins import implements, toolkit | from ckan.plugins import implements, toolkit |
#import gasnippet | #import gasnippet |
#import commands | #import commands |
#import dbutil | #import dbutil |
log = logging.getLogger('ckanext.ga-report') | log = logging.getLogger('ckanext.ga-report') |
class GAReportPlugin(p.SingletonPlugin): | class GAReportPlugin(p.SingletonPlugin): |
implements(p.IConfigurer, inherit=True) | implements(p.IConfigurer, inherit=True) |
implements(p.IRoutes, inherit=True) | implements(p.IRoutes, inherit=True) |
def update_config(self, config): | def update_config(self, config): |
toolkit.add_template_directory(config, 'templates') | toolkit.add_template_directory(config, 'templates') |
toolkit.add_public_directory(config, 'public') | toolkit.add_public_directory(config, 'public') |
def after_map(self, map): | def after_map(self, map): |
map.connect( | map.connect( |
'/data/analytics/usage', | '/data/analytics/', |
controller='ckanext.ga_report.controller:GaReport', | controller='ckanext.ga_report.controller:GaReport', |
action='index' | action='index' |
) | ) |
map.connect( | map.connect( |
'/data/analytics/publisher/{id}', | '/data/analytics/publisher/{id}', |
controller='ckanext.ga_report.controller:GaPublisherReport', | controller='ckanext.ga_report.controller:GaPublisherReport', |
action='index' | action='index' |
) | ) |
return map | return map |
HAI | <html xmlns:py="http://genshi.edgewall.org/" |
xmlns:i18n="http://genshi.edgewall.org/i18n" | |
xmlns:xi="http://www.w3.org/2001/XInclude" | |
py:strip=""> | |
<py:def function="page_title">Analytics for ${g.site_title}</py:def> | |
<div py:match="content"> | |
<h1>Analytics for ${c.publisher.title}</h1> | |
<h2>Most viewed datasets</h2> | |
<p><em>Note: this data does not include API calls</em></p> | |
<form class="form-inline" action="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='index',id=c.publisher.name)}" method="get"> | |
<div class="controls"> | |
<select name="month"> | |
<py:for each="val,desc in c.months"> | |
<option value='${val}' py:attrs="{'selected': 'selected' if c.month == val else None}">${desc}</option> | |
</py:for> | |
</select> | |
<input class="btn button" type='submit' value="Update"/> | |
</div> | |
</form> | |
<p><a href="${h.url_for(controller='ckanext.dgu.controllers.publisher:PublisherController', action='read', id=c.publisher.name)}">${c.publisher.title} dataset list</a> was viewed ${c.publisher_page_views} times in ${c.month_desc}</p> | |
<table class="table table-condensed table-bordered table-striped"> | |
<tr> | |
<th>Dataset</th> | |
<th>Views</th> | |
<th>Visits</th> | |
</tr> | |
<py:for each="package, views, visits in c.top_packages"> | |
<tr> | |
<td>${h.link_to(package.title or package.name, h.url_for(controller='package', action='read', id=package.name))} | |
</td> | |
<td>${views}</td> | |
<td>${visits}</td> | |
</tr> | |
</py:for> | |
</table> | |
</div> | |
<xi:include href="../../layout.html" /> | |
</html> | |