import logging | import logging |
import operator | import operator |
import ckan.lib.base as base | import ckan.lib.base as base |
import ckan.model as model | import ckan.model as model |
_log = logging.getLogger(__name__) | _log = logging.getLogger(__name__) |
def most_popular_datasets(publisher, count=20): | def most_popular_datasets(publisher, count=20): |
from ckanext.ga_report.ga_model import GA_Url | from ckanext.ga_report.ga_model import GA_Url |
if not publisher: | if not publisher: |
_log.error("No valid publisher passed to 'most_popular_datasets'") | _log.error("No valid publisher passed to 'most_popular_datasets'") |
return "" | return "" |
datasets = {} | datasets = {} |
entries = model.Session.query(GA_Url).\ | entries = model.Session.query(GA_Url).\ |
filter(GA_Url.department_id==publisher.name).\ | filter(GA_Url.department_id==publisher.name).\ |
filter(GA_Url.url.like('/dataset/%')).\ | filter(GA_Url.url.like('/dataset/%')).\ |
order_by('ga_url.pageviews::int desc')[:count] | order_by('ga_url.pageviews::int desc')[:count] |
for entry in entries: | for entry in entries: |
p = model.Package.get(entry.url[len('/dataset/'):]) | p = model.Package.get(entry.url[len('/dataset/'):]) |
if not p in datasets: | if not p in datasets: |
datasets[p] = {'views':0, 'visits': 0} | datasets[p] = {'views':0, 'visits': 0} |
datasets[p]['views'] = datasets[p]['views'] + int(entry.pageviews) | datasets[p]['views'] = datasets[p]['views'] + int(entry.pageviews) |
datasets[p]['visits'] = datasets[p]['visits'] + int(entry.visitors) | datasets[p]['visits'] = datasets[p]['visits'] + int(entry.visitors) |
results = [] | results = [] |
for k, v in datasets.iteritems(): | for k, v in datasets.iteritems(): |
results.append((k,v['views'],v['visits'])) | results.append((k,v['views'],v['visits'])) |
results = sorted(results, key=operator.itemgetter(1), reverse=True) | results = sorted(results, key=operator.itemgetter(1), reverse=True) |
ctx = { | ctx = { |
'dataset_count': len(datasets), | 'dataset_count': len(datasets), |
'datasets': results, | 'datasets': results, |
'publisher': publisher | 'publisher': publisher |
} | } |
return base.render_snippet('ga_report/publisher/popular.html', **ctx) | return base.render_snippet('ga_report/publisher/popular.html', **ctx) |
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 |
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) |
implements(p.ITemplateHelpers, inherit=True) | implements(p.ITemplateHelpers, 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 get_helpers(self): | def get_helpers(self): |
""" | """ |
A dictionary of extra helpers that will be available to provide | A dictionary of extra helpers that will be available to provide |
ga report info to templates. | ga report info to templates. |
""" | """ |
from ckanext.ga_report.helpers import most_popular_datasets | from ckanext.ga_report.helpers import most_popular_datasets |
return { | return { |
'most_popular_datasets': most_popular_datasets | 'ga_report_installed': lambda: True, |
'most_popular_datasets': most_popular_datasets, | |
} | } |
def after_map(self, map): | def after_map(self, map): |
map.connect( | map.connect( |
'/data/analytics/publisher', | '/data/analytics/publisher', |
controller='ckanext.ga_report.controller:GaPublisherReport', | controller='ckanext.ga_report.controller:GaPublisherReport', |
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='read' | action='read' |
) | ) |
map.connect( | map.connect( |
'/data/analytics', | '/data/analytics', |
controller='ckanext.ga_report.controller:GaReport', | controller='ckanext.ga_report.controller:GaReport', |
action='index' | action='index' |
) | ) |
map.connect( | map.connect( |
'/data/analytics/data_{month}.csv', | '/data/analytics/data_{month}.csv', |
controller='ckanext.ga_report.controller:GaReport', | controller='ckanext.ga_report.controller:GaReport', |
action='csv' | action='csv' |
) | ) |
return map | return map |
<html xmlns:py="http://genshi.edgewall.org/" | <html xmlns:py="http://genshi.edgewall.org/" |
xmlns:i18n="http://genshi.edgewall.org/i18n" | xmlns:i18n="http://genshi.edgewall.org/i18n" |
xmlns:xi="http://www.w3.org/2001/XInclude" | xmlns:xi="http://www.w3.org/2001/XInclude" |
py:strip=""> | py:strip=""> |
<py:if test="dataset_count == 0"> | |
<p>We do not currently have analytics data for ${publisher.title}</p> | |
</py:if> | |
<py:if test="dataset_count > 0"> | <py:if test="dataset_count > 0"> |
<div class="popular_datasets"> | <div class="popular_datasets"> |
<ul class="popular_dataset_list"> | <ul class="popular_dataset_list"> |
<py:for each="dataset,views,visits in datasets"> | <py:for each="dataset,views,visits in datasets"> |
<li> | <li> |
${h.link_to(dataset.title, h.url_for(controller='package', action='read', id=dataset.name))} | ${h.link_to(dataset.title, h.url_for(controller='package', action='read', id=dataset.name))} |
</li> | </li> |
</py:for> | </py:for> |
</ul> | </ul> |
<p>${h.link_to("More analytics for " + publisher.title, h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='read',id=publisher.name))}</p> | <p>${h.link_to("More analytics for " + publisher.title, h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='read',id=publisher.name))}</p> |
</div> | </div> |
</py:if> | </py:if> |
</html> | </html> |