Fixes to show All Time data
--- a/ckanext/ga_report/controller.py
+++ b/ckanext/ga_report/controller.py
@@ -105,23 +105,31 @@
c.months = _month_details(GA_Url)
# 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])
+ c.month = request.params.get('month', '')
+ c.month_desc = 'all time'
+ if c.month:
+ c.month_desc = ''.join([m[1] for m in c.months if m[0]==c.month])
connection = model.Session.connection()
q = """
select department_id, sum(pageviews::int) views, sum(visitors::int) visits
from ga_url
- where department_id <> ''
- and period_name=%s
- group by department_id order by views desc limit 20;
- """
+ where department_id <> ''"""
+ if c.month:
+ q = q + """
+ and period_name=%s
+ """
+ q = q + """
+ group by department_id order by views desc limit 20;
+ """
+
# Add this back (before and period_name =%s) if you want to ignore publisher
# homepage views
# and not url like '/publisher/%%'
c.top_publishers = []
res = connection.execute(q, c.month)
+
for row in res:
c.top_publishers.append((model.Group.get(row[0]), row[1], row[2]))
@@ -129,6 +137,7 @@
def read(self, id):
+ count = 20
c.publisher = model.Group.get(id)
if not c.publisher:
@@ -140,22 +149,50 @@
c.months = _month_details(GA_Url)
# 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])
+ c.month = request.params.get('month', '')
+ if not c.month:
+ c.month_desc = 'all time'
+ 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
+ c.publisher_page_views = 0
+ q = model.Session.query(GA_Url).\
+ filter(GA_Url.url=='/publisher/%s' % c.publisher.name)
+ if c.month:
+ entry = q.filter(GA_Url.period_name==c.month).first()
+ c.publisher_page_views = entry.pageviews if entry else 0
+ else:
+ for e in q.all():
+ c.publisher_page_views = c.publisher_page_views + int(e.pageviews)
- entries = model.Session.query(GA_Url).\
+
+ q = 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::int desc')[:20]
- for entry in entries:
- if entry.url.startswith('/dataset/'):
+ filter(GA_Url.url.like('/dataset/%'))
+ if c.month:
+ q = q.filter(GA_Url.period_name==c.month)
+ q = q.order_by('ga_url.pageviews::int desc')
+
+ if c.month:
+ for entry in q[:count]:
p = model.Package.get(entry.url[len('/dataset/'):])
c.top_packages.append((p,entry.pageviews,entry.visitors))
+ else:
+ ds = {}
+ for entry in q.all():
+ if len(ds) >= count:
+ break
+ p = model.Package.get(entry.url[len('/dataset/'):])
+ if not p in ds:
+ ds[p] = {'views':0, 'visits': 0}
+ ds[p]['views'] = ds[p]['views'] + int(entry.pageviews)
+ ds[p]['visits'] = ds[p]['visits'] + int(entry.visitors)
+
+ results = []
+ for k, v in ds.iteritems():
+ results.append((k,v['views'],v['visits']))
+
+ c.top_packages = sorted(results, key=operator.itemgetter(1), reverse=True)
return render('ga_report/publisher/read.html')
--- a/ckanext/ga_report/helpers.py
+++ b/ckanext/ga_report/helpers.py
@@ -16,13 +16,14 @@
entries = model.Session.query(GA_Url).\
filter(GA_Url.department_id==publisher.name).\
filter(GA_Url.url.like('/dataset/%')).\
- order_by('ga_url.pageviews::int desc')[:count]
+ order_by('ga_url.pageviews::int desc').all()
for entry in entries:
- p = model.Package.get(entry.url[len('/dataset/'):])
- if not p in datasets:
- datasets[p] = {'views':0, 'visits': 0}
- datasets[p]['views'] = datasets[p]['views'] + int(entry.pageviews)
- datasets[p]['visits'] = datasets[p]['visits'] + int(entry.visitors)
+ if len(datasets) < count:
+ p = model.Package.get(entry.url[len('/dataset/'):])
+ if not p in datasets:
+ datasets[p] = {'views':0, 'visits': 0}
+ datasets[p]['views'] = datasets[p]['views'] + int(entry.pageviews)
+ datasets[p]['visits'] = datasets[p]['visits'] + int(entry.visitors)
results = []
for k, v in datasets.iteritems():
--- a/ckanext/ga_report/templates/ga_report/publisher/index.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/index.html
@@ -14,11 +14,13 @@
<div py:match="content">
<h1>Publisher Analytics</h1>
- <h2>The top 20 publishers</h2>
+ <h2>The top 20 publishers of ${c.month_desc}</h2>
<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>
+
<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/publisher/read.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/read.html
@@ -13,10 +13,10 @@
The table shows the top 20 most viewed datasets belonging to ${c.publisher.title}.
</p>
<p>
- As well as showing the number of views within ${c.month_desc}, it will also show the
+ As well as showing the number of views for ${c.month_desc}, it will also show the
number of visitors that viewed each dataset.
</p>
- <p>The dataset list page for <a href="${h.url_for(controller='ckanext.dgu.controllers.publisher:PublisherController', action='read', id=c.publisher.name)}">${c.publisher.title}</a> was viewed ${c.publisher_page_views} times during ${c.month_desc}</p>
+ <p>The dataset list page for <a href="${h.url_for(controller='ckanext.dgu.controllers.publisher:PublisherController', action='read', id=c.publisher.name)}">${c.publisher.title}</a> was viewed ${c.publisher_page_views} times during the selected time period</p>
<p>View the <a href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport', action='index')}">publishers</a> leaderboard</p>
</li>
</py:match>
@@ -24,12 +24,13 @@
<div py:match="content">
<h1>Analytics for ${c.publisher.title}</h1>
- <h2>Top 20 most viewed datasets</h2>
+ <h2>Top 20 most viewed datasets of ${c.month_desc}</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='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>
<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>