Refactoring and tidying Rickshaw code. Placeholder graphs inserted. Front page sparklines are sensibly sorted.
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>