Added support for a popular datasets widget.
The widget will look in the ga_publishers for the 30 top publishers
and then randomly choose one from that list to show the top 10 datasets
of all time
--- a/ckanext/ga_report/controller.py
+++ b/ckanext/ga_report/controller.py
@@ -201,7 +201,7 @@
writer = csv.writer(response)
writer.writerow(["Publisher", "Views", "Visits", "Period Name"])
- for publisher,view,visit in self._get_publishers(None):
+ for publisher,view,visit in _get_publishers(None):
writer.writerow([publisher.title.encode('utf-8'),
view,
visit,
@@ -244,38 +244,10 @@
if c.month:
c.month_desc = ''.join([m[1] for m in c.months if m[0]==c.month])
- c.top_publishers = self._get_publishers()
+ c.top_publishers = _get_publishers()
return render('ga_report/publisher/index.html')
- def _get_publishers(self, limit=20):
- connection = model.Session.connection()
- q = """
- select department_id, sum(pageviews::int) views, sum(visitors::int) visits
- from ga_url
- where department_id <> ''"""
- if c.month:
- q = q + """
- and period_name=%s
- """
- q = q + """
- group by department_id order by views desc
- """
- if limit:
- q = q + " limit %s;" % (limit)
-
- # Add this back (before and period_name =%s) if you want to ignore publisher
- # homepage views
- # and not url like '/publisher/%%'
-
- top_publishers = []
- res = connection.execute(q, c.month)
-
- for row in res:
- g = model.Group.get(row[0])
- if g:
- top_publishers.append((g, row[1], row[2]))
- return top_publishers
def _get_packages(self, publisher, count=-1):
if count == -1:
@@ -345,3 +317,32 @@
return render('ga_report/publisher/read.html')
+def _get_publishers(limit=20):
+ connection = model.Session.connection()
+ q = """
+ select department_id, sum(pageviews::int) views, sum(visitors::int) visits
+ from ga_url
+ where department_id <> ''"""
+ if c.month:
+ q = q + """
+ and period_name=%s
+ """
+ q = q + """
+ group by department_id order by views desc
+ """
+ if limit:
+ q = q + " limit %s;" % (limit)
+
+ # Add this back (before and period_name =%s) if you want to ignore publisher
+ # homepage views
+ # and not url like '/publisher/%%'
+
+ top_publishers = []
+ res = connection.execute(q, c.month)
+
+ for row in res:
+ g = model.Group.get(row[0])
+ if g:
+ top_publishers.append((g, row[1], row[2]))
+ return top_publishers
+
--- a/ckanext/ga_report/helpers.py
+++ b/ckanext/ga_report/helpers.py
@@ -3,15 +3,49 @@
import ckan.lib.base as base
import ckan.model as model
+from ckanext.ga_report.ga_model import GA_Url, GA_Publisher
+from ckanext.ga_report.controller import _get_publishers
_log = logging.getLogger(__name__)
+def popular_datasets(count=10):
+ import random
+
+ publisher = None
+ publishers = _get_publishers(30)
+ total = len(publishers)
+ while not publisher or not datasets:
+ rand = random.randrange(0, total)
+ publisher = publishers[rand][0]
+ if not publisher.state == 'active':
+ publisher = None
+ continue
+ datasets = _datasets_for_publisher(publisher, 10)[:count]
+
+ ctx = {
+ 'datasets': datasets,
+ 'publisher': publisher
+ }
+ return base.render_snippet('ga_report/ga_popular_datasets.html', **ctx)
+
+
def most_popular_datasets(publisher, count=20):
- from ckanext.ga_report.ga_model import GA_Url
if not publisher:
_log.error("No valid publisher passed to 'most_popular_datasets'")
return ""
+ results = _datasets_for_publisher(publisher, count)
+
+ ctx = {
+ 'dataset_count': len(datasets),
+ 'datasets': results,
+
+ 'publisher': publisher
+ }
+
+ return base.render_snippet('ga_report/publisher/popular.html', **ctx)
+
+def _datasets_for_publisher(publisher, count):
datasets = {}
entries = model.Session.query(GA_Url).\
filter(GA_Url.department_id==publisher.name).\
@@ -29,14 +63,5 @@
for k, v in datasets.iteritems():
results.append((k,v['views'],v['visits']))
- results = sorted(results, key=operator.itemgetter(1), reverse=True)
+ return sorted(results, key=operator.itemgetter(1), reverse=True)
- ctx = {
- 'dataset_count': len(datasets),
- 'datasets': results,
-
- 'publisher': publisher
- }
-
- return base.render_snippet('ga_report/publisher/popular.html', **ctx)
-
--- a/ckanext/ga_report/plugin.py
+++ b/ckanext/ga_report/plugin.py
@@ -2,6 +2,9 @@
import ckan.lib.helpers as h
import ckan.plugins as p
from ckan.plugins import implements, toolkit
+
+from ckanext.ga_report.helpers import (most_popular_datasets,
+ popular_datasets)
log = logging.getLogger('ckanext.ga-report')
@@ -19,9 +22,9 @@
A dictionary of extra helpers that will be available to provide
ga report info to templates.
"""
- from ckanext.ga_report.helpers import most_popular_datasets
return {
'ga_report_installed': lambda: True,
+ 'popular_datasets': popular_datasets,
'most_popular_datasets': most_popular_datasets,
}
--- /dev/null
+++ b/ckanext/ga_report/templates/ga_report/ga_popular_datasets.html
@@ -1,1 +1,27 @@
+<html xmlns:py="http://genshi.edgewall.org/"
+ xmlns:i18n="http://genshi.edgewall.org/i18n"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ py:strip="">
+<div class="popular_datasets">
+ <div class="pull-right">
+ <a href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='index')}" class="btn btn-primary">More popular datasets »</a>
+ </div>
+ <h2>Popular datasets</h2>
+ <h4>${publisher.title}</h4>
+ <ul>
+ <py:for each="dataset, _, _ in datasets">
+ <li>
+ <span>${h.link_to(dataset.title, h.url_for(controller='package', action='read', id=dataset.name))}</span>
+ <div>${h.truncate(dataset.notes, length=80, whole_word=True)}</div>
+ </li>
+ </py:for>
+ </ul>
+
+ </div>
+
+</html>
+
+
+
+
--- a/ckanext/ga_report/templates/ga_report/publisher/index.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/index.html
@@ -27,6 +27,7 @@
<div py:match="content">
+
<h1>Site Usage</h1>
${usage_nav('Publishers', None)}