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/popular.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/popular.html
@@ -8,15 +8,14 @@
<py:if test="dataset_count > 0">
<div class="popular_datasets">
- <ul class="popular_dataset_list">
+ <ul>
<py:for each="dataset,views,visits in datasets">
<li>
${h.link_to(dataset.title, h.url_for(controller='package', action='read', id=dataset.name))}
</li>
</py:for>
</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 class="">${h.link_to("More analytics for " + publisher.title, h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='read',id=publisher.name))}</p>
</div>
</py:if>
</html>
--- 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>
--- a/ckanext/ga_report/templates/ga_report/site/index.html
+++ b/ckanext/ga_report/templates/ga_report/site/index.html
@@ -9,6 +9,10 @@
<li class="widget-container boxed widget_text">
<h4>Statistics</h4>
<p>It is possible to <a href="${h.url_for(controller='ckanext.ga_report.controller:GaReport',action='csv',month=c.month)}">export the analytics data</a> as a CSV file, which contains all of the information for ${c.month_desc}</p>
+ </li>
+ <li class="widget-container boxed widget_text">
+ <h4>Publisher statistics</h4>
+ <p>You can view statistics about specific publishers at the <a href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='index')}">Publisher Analytics</a> page</p>
</li>
</py:match>