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
@@ -58,7 +58,7 @@
c.months = _month_details(GA_Stat)
# Work out which month to show, based on query params of the first item
- c.month_desc = 'all time'
+ c.month_desc = 'all months'
c.month = request.params.get('month', '')
if c.month:
c.month_desc = ''.join([m[1] for m in c.months if m[0]==c.month])
@@ -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,
@@ -240,42 +240,14 @@
# Work out which month to show, based on query params of the first item
c.month = request.params.get('month', '')
- c.month_desc = 'all time'
+ c.month_desc = 'all months'
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:
@@ -327,7 +299,7 @@
# Work out which month to show, based on query params of the first item
c.month = request.params.get('month', '')
if not c.month:
- c.month_desc = 'all time'
+ c.month_desc = 'all months'
else:
c.month_desc = ''.join([m[1] for m in c.months if m[0]==c.month])
@@ -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,
}
--- a/ckanext/ga_report/report_model.py
+++ /dev/null
--- /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/ga_util.html
+++ b/ckanext/ga_report/templates/ga_report/ga_util.html
@@ -5,15 +5,6 @@
xmlns:xi="http://www.w3.org/2001/XInclude"
py:strip=""
>
-
- <table py:def="publisher_list(groups)" class="groups">
- <py:for each="group,title in groups">
- <tr>
- <td><a href="/publisher/${group.name}">${title}</a></td>
- </tr>
- </py:for>
- </table>
-
<table py:def="social_table(items, with_source=False)" class="table table-condensed table-bordered table-striped">
<tr>
@@ -49,12 +40,12 @@
<div id="minornavigation-bg-left">
<div id="minornavigation-bg-right">
<ul class="nav nav-pills">
- <li py:attrs="{'class': 'active' if active_name=='Site-wide' else None}"><a py:attrs="{'class': 'active' if active_name=='Site-wide' else None}" href="${h.url_for(controller='ckanext.ga_report.controller:GaReport',action='index')}"><img src="/images/icons/page_white_gear.png" height="16px" width="16px" alt="None" class="inline-icon "/> Site-wide</a></li>
+ <li py:attrs="{'class': 'active' if active_name=='Site-wide' else None}"><a py:attrs="{'class': 'active' if active_name=='Site-wide' else None}" href="${h.url_for(controller='ckanext.ga_report.controller:GaReport',action='index')}"><img src="/images/icons/page_white.png" height="16px" width="16px" alt="None" class="inline-icon "/> Site-wide</a></li>
<li py:attrs="{'class': 'active' if active_name=='Publishers' else None}">
- <a py:attrs="{'class': 'active' if active_name=='Publishers' else None}" href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='index')}"><img src="/images/icons/page_white_gear.png" height="16px" width="16px" alt="None" class="inline-icon "/> Publishers</a>
+ <a py:attrs="{'class': 'active' if active_name=='Publishers' else None}" href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='index')}"><img src="/images/icons/page_white.png" height="16px" width="16px" alt="None" class="inline-icon "/> Publishers</a>
</li>
<li py:if="publisher" class="active">
- <a class="active" href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='read', id=publisher.name)}"><img src="/images/icons/page_white_gear.png" height="16px" width="16px" alt="None" class="inline-icon "/>${publisher.title}</a>
+ <a class="active" href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='read', id=publisher.name)}"><img src="/images/icons/page_white.png" height="16px" width="16px" alt="None" class="inline-icon "/>${publisher.title}</a>
</li>
</ul>
--- 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)}
@@ -35,7 +36,7 @@
<form class="form-inline" action="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='index')}" method="get">
<div class="controls">
<select name="month">
- <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All time</option>
+ <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All months</option>
<py:for each="val,desc in c.months">
<option value='${val}' py:attrs="{'selected': 'selected' if c.month == val else None}">${desc}</option>
--- a/ckanext/ga_report/templates/ga_report/publisher/read.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/read.html
@@ -11,7 +11,7 @@
<li class="widget-container boxed widget_text">
<h4>Publishers</h4>
<p>
- Dataset views records the number of times a specific dataset page has been viewed. Visits records the number of unique site visits.
+ Dataset views records the number of times a specific dataset page has been viewed for <a href="${h.url_for(controller='ckanext.dgu.controllers.publisher:PublisherController',action='read',id=c.publisher.name)}">${c.publisher.title}</a>. Visits records the number of unique site visits.
</p>
<p>
Note: this data does not include API calls.
@@ -35,7 +35,7 @@
<form class="form-inline" action="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='read',id=c.publisher.name)}" method="get">
<div class="controls">
<select name="month">
- <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All time</option>
+ <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All months</option>
<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>
--- a/ckanext/ga_report/templates/ga_report/site/index.html
+++ b/ckanext/ga_report/templates/ga_report/site/index.html
@@ -30,7 +30,7 @@
<form class="form-inline" action="${h.url_for(controller='ckanext.ga_report.controller:GaReport',action='index')}" method="get">
<div class="controls">
<select name="month">
- <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All time</option>
+ <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All months</option>
<py:for each="val,desc in c.months">
<option value='${val}' py:attrs="{'selected': 'selected' if c.month == val else None}">${desc}</option>