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('index.html') | return render('ga_report/site/index.html') |
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): | |
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')[:10] | |
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') | |
import logging | import logging |
import ckan.lib.helpers as h | import ckan.lib.helpers as h |
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 GoogleAnalyticsPlugin(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/index', | '/data/analytics/', |
controller='ckanext.ga-report.controller:GaReport', | controller='ckanext.ga_report.controller:GaReport', |
action='index' | |
) | |
map.connect( | |
'/data/analytics/publisher/{id}', | |
controller='ckanext.ga_report.controller:GaPublisherReport', | |
action='index' | action='index' |
) | ) |
return map | return map |
<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> | |
HAI Site |
from setuptools import setup, find_packages | from setuptools import setup, find_packages |
import sys, os | import sys, os |
version = '0.1' | version = '0.1' |
setup( | setup( |
name='ckanext-ga-report', | name='ckanext-ga-report', |
version=version, | version=version, |
description="GA reporting for CKAN", | description="GA reporting for CKAN", |
long_description="""\ | long_description="""\ |
""", | """, |
classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers | classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers |
keywords='', | keywords='', |
author='David Read', | author='David Read', |
author_email='david.read@hackneyworkshop.com', | author_email='david.read@hackneyworkshop.com', |
url='', | url='', |
license='', | license='', |
packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), | packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), |
namespace_packages=['ckanext', 'ckanext.ga_report'], | namespace_packages=['ckanext', 'ckanext.ga_report'], |
include_package_data=True, | include_package_data=True, |
zip_safe=False, | zip_safe=False, |
install_requires=[ | install_requires=[ |
'gdata', | 'gdata', |
'google-api-python-client' | 'google-api-python-client' |
], | ], |
entry_points=\ | entry_points=\ |
""" | """ |
[ckan.plugins] | [ckan.plugins] |
# Add plugins here, eg | # Add plugins here, eg |
ga-report=ckanext.ga_report.plugin:GaReportPlugin | ga-report=ckanext.ga_report.plugin:GAReportPlugin |
[paste.paster_command] | [paste.paster_command] |
loadanalytics = ckanext.ga_report.command:LoadAnalytics | loadanalytics = ckanext.ga_report.command:LoadAnalytics |
initdb = ckanext.ga_report.command:InitDB | initdb = ckanext.ga_report.command:InitDB |
""", | """, |
) | ) |