Refactoring and tidying Rickshaw code. Placeholder graphs inserted. Front page sparklines are sensibly sorted.
--- a/ckanext/ga_report/controller.py
+++ b/ckanext/ga_report/controller.py
@@ -113,24 +113,24 @@
return key, val
# Query historic values for sparkline rendering
- graph_query = model.Session.query(GA_Stat)\
+ sparkline_query = model.Session.query(GA_Stat)\
.filter(GA_Stat.stat_name=='Totals')\
.order_by(GA_Stat.period_name)
- graph_data = {}
- for x in graph_query:
- graph_data[x.key] = graph_data.get(x.key,[])
+ sparkline_data = {}
+ for x in sparkline_query:
+ sparkline_data[x.key] = sparkline_data.get(x.key,[])
key, val = clean_key(x.key,float(x.value))
tooltip = '%s: %s' % (_get_month_name(x.period_name), val)
- graph_data[x.key].append( (tooltip,x.value) )
+ sparkline_data[x.key].append( (tooltip,x.value) )
# Trim the latest month, as it looks like a huge dropoff
- for key in graph_data:
- graph_data[key] = graph_data[key][:-1]
+ for key in sparkline_data:
+ sparkline_data[key] = sparkline_data[key][:-1]
c.global_totals = []
if c.month:
for e in entries:
key, val = clean_key(e.key, e.value)
- sparkline = graph_data[e.key]
+ sparkline = sparkline_data[e.key]
c.global_totals.append((key, val, sparkline))
else:
d = collections.defaultdict(list)
@@ -141,11 +141,18 @@
v = sum(v)
else:
v = float(sum(v))/float(len(v))
- sparkline = graph_data[k]
+ sparkline = sparkline_data[k]
key, val = clean_key(k,v)
c.global_totals.append((key, val, sparkline))
- c.global_totals = sorted(c.global_totals, key=operator.itemgetter(0))
+ # Sort the global totals into a more pleasant order
+ def sort_func(x):
+ key = x[0]
+ total_order = ['Total page views','Total visits','Pages per visit']
+ if key in total_order:
+ return total_order.index(key)
+ return 999
+ c.global_totals = sorted(c.global_totals, key=sort_func)
keys = {
'Browser versions': 'browser_versions',
--- /dev/null
+++ b/ckanext/ga_report/public/css/ga_report.css
@@ -1,1 +1,33 @@
+.table-condensed td.sparkline-cell {
+ padding: 1px 0 0 0;
+ width: 108px;
+ text-align: center;
+}
+.rickshaw_chart_container {
+ position: relative;
+ height: 300px;
+ margin: 0 auto 20px auto;
+}
+.rickshaw_chart {
+ position: absolute;
+ left: 40px;
+ width: 500px;
+ top: 0;
+ bottom: 0;
+}
+.rickshaw_legend {
+ position: absolute;
+ right: 0;
+ top: 0;
+ margin-left: 15px;
+ background: transparent;
+ max-width: 150px;
+ overflow: hidden;
+}
+.rickshaw_y_axis {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 40px;
+}
--- a/ckanext/ga_report/templates/ga_report/ga_util.html
+++ b/ckanext/ga_report/templates/ga_report/ga_util.html
@@ -30,14 +30,15 @@
</table>
-<div py:def="rickshaw_graph(items_json,id)">
- <div id="chart_container_$id" class="chart_container">
- <div id="y_axis_$id" class="y_axis"></div>
- <div id="chart_$id" class="chart"></div>
- <div id="legend_$id" class="legend"></div>
+<div py:def="rickshaw_graph(items_json,id,debug=False)">
+ <div id="chart_container_$id" class="rickshaw_chart_container">
+ <div id="y_axis_$id" class="rickshaw_y_axis"></div>
+ <div id="chart_$id" class="rickshaw_chart"></div>
+ <div id="legend_$id" class="rickshaw_legend"></div>
<script type="text/javascript">
$(function() {
var series = ${items_json};
+ <py:if test="debug">console.log(series);</py:if>
var palette = new Rickshaw.Color.Palette( { scheme: 'spectrum2001' } );
$.each(series, function(i, object) {
object['color'] = palette.color();
--- a/ckanext/ga_report/templates/ga_report/publisher/index.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/index.html
@@ -17,6 +17,14 @@
<xi:include href="../notes.html" />
</py:match>
+ <py:def function="optional_head">
+ <link rel="stylesheet" type="text/css" href="/scripts/vendor/rickshaw.min.css"/>
+ <link rel="stylesheet" type="text/css" href="/css/ga_report.css"/>
+ <script type="text/javascript" src="/scripts/vendor/jquery.sparkline.modified.js"></script>
+ <script type="text/javascript" src="/scripts/vendor/d3.v2.js"></script>
+ <script type="text/javascript" src="/scripts/vendor/d3.layout.min.js"></script>
+ <script type="text/javascript" src="/scripts/vendor/rickshaw.min.js"></script>
+ </py:def>
<div py:match="content">
@@ -34,6 +42,7 @@
</div>
</form>
+ ${rickshaw_graph('[{name:"test series",data:[{x:1,y:200},{x:3,y:300},{x:5,y:100}]}]','dataset-downloads',debug=True)}
<table class="table table-condensed table-bordered table-striped">
<tr>
<th>Publisher</th>
--- a/ckanext/ga_report/templates/ga_report/publisher/read.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/read.html
@@ -6,6 +6,15 @@
<xi:include href="../ga_util.html" />
<py:def function="page_title">Usage by Dataset</py:def>
+
+ <py:def function="optional_head">
+ <link rel="stylesheet" type="text/css" href="/scripts/vendor/rickshaw.min.css"/>
+ <link rel="stylesheet" type="text/css" href="/css/ga_report.css"/>
+ <script type="text/javascript" src="/scripts/vendor/jquery.sparkline.modified.js"></script>
+ <script type="text/javascript" src="/scripts/vendor/d3.v2.js"></script>
+ <script type="text/javascript" src="/scripts/vendor/d3.layout.min.js"></script>
+ <script type="text/javascript" src="/scripts/vendor/rickshaw.min.js"></script>
+ </py:def>
<py:match path="primarysidebar">
<li class="widget-container boxed widget_text">
@@ -41,21 +50,26 @@
<h3 py:if="c.publisher"><a href="${h.url_for(controller='ckanext.dgu.controllers.publisher:PublisherController',action='read',id=c.publisher.name)}">${c.publisher.title}</a></h3>
<p py:if="not c.top_packages">No page views in this period</p>
- <table py:if="c.top_packages" class="table table-condensed table-bordered table-striped">
- <tr>
- <th>Dataset</th>
- <th>Views</th>
- <th>Downloads</th>
- </tr>
- <py:for each="package, views, visits,downloads in c.top_packages">
- <tr>
- <td>${h.link_to(package.title or package.name, h.url_for(controller='package', action='read', id=package.name))}
- </td>
- <td>${views}</td>
- <td>${downloads}</td>
- </tr>
+
+ <py:if test="c.top_packages">
+ ${rickshaw_graph('[{name:"test series",data:[{x:1,y:200},{x:3,y:300},{x:5,y:100}]}]','dataset-downloads',debug=True)}
+ <table class="table table-condensed table-bordered table-striped">
+ <tr>
+ <th>Dataset</th>
+ <th>Views</th>
+ <th>Downloads</th>
+ </tr>
+ <py:for each="package, views, visits,downloads in c.top_packages">
+ <tr>
+ <td>
+ ${h.link_to(package.title or package.name, h.url_for(controller='package', action='read', id=package.name))}
+ </td>
+ <td>${views}</td>
+ <td>${downloads}</td>
+ </tr>
</py:for>
- </table>
+ </table>
+ </py:if>
</div>
--- a/ckanext/ga_report/templates/ga_report/site/index.html
+++ b/ckanext/ga_report/templates/ga_report/site/index.html
@@ -9,44 +9,11 @@
<py:def function="optional_head">
<link rel="stylesheet" type="text/css" href="/scripts/vendor/rickshaw.min.css"/>
+ <link rel="stylesheet" type="text/css" href="/css/ga_report.css"/>
<script type="text/javascript" src="/scripts/vendor/jquery.sparkline.modified.js"></script>
<script type="text/javascript" src="/scripts/vendor/d3.v2.js"></script>
<script type="text/javascript" src="/scripts/vendor/d3.layout.min.js"></script>
<script type="text/javascript" src="/scripts/vendor/rickshaw.min.js"></script>
- <style type="text/css">
- .table-condensed td.sparkline-cell {
- padding: 1px 0 0 0;
- width: 108px;
- text-align: center;
- }
- .chart_container {
- position: relative;
- height: 300px;
- margin: 0 auto 20px auto;
- }
- .chart {
- position: absolute;
- left: 40px;
- width: 500px;
- top: 0;
- bottom: 0;
- }
- .legend {
- position: absolute;
- right: 0;
- top: 0;
- margin-left: 15px;
- background: transparent;
- max-width: 150px;
- overflow: hidden;
- }
- .y_axis {
- position: absolute;
- top: 0;
- bottom: 0;
- width: 40px;
- }
- </style>
</py:def>
<py:match path="primarysidebar">
@@ -160,13 +127,8 @@
${rickshaw_graph(c.country_graph,'country')}
${stat_table(c.country)}
</div>
-
-
</div>
</div>
-
-
-
</div>