Merge branch 'stable' of github.com:datagovuk/ckanext-ga-report
Merge branch 'stable' of github.com:datagovuk/ckanext-ga-report

--- a/ckanext/ga_report/controller.py
+++ b/ckanext/ga_report/controller.py
@@ -450,10 +450,11 @@
                     data.append(series)
         # Overwrite data with a set of interesting series
         others = [ x for x in raw_data if not (x in data) ]
-        data.append({ 
-            'name':'Other',
-            'data': [ {'x':x,'y':y} for x,y in get_totals(others).items() ] 
-            })
+        if len(others):
+            data.append({ 
+                'name':'Other',
+                'data': [ {'x':x,'y':y} for x,y in get_totals(others).items() ] 
+                })
         # Turn each point into a percentage
         for series in data:
             for point in series['data']:

--- a/ckanext/ga_report/helpers.py
+++ b/ckanext/ga_report/helpers.py
@@ -80,7 +80,7 @@
     return base.render_snippet('ga_report/ga_popular_single.html', **context)
 
 
-def most_popular_datasets(publisher, count=20):
+def most_popular_datasets(publisher, count=20, preview_image=None):
 
     if not publisher:
         _log.error("No valid publisher passed to 'most_popular_datasets'")
@@ -92,7 +92,8 @@
         'dataset_count': len(results),
         'datasets': results,
 
-        'publisher': publisher
+        'publisher': publisher,
+        'preview_image': preview_image
     }
 
     return base.render_snippet('ga_report/publisher/popular.html', **ctx)

--- a/ckanext/ga_report/templates/ga_report/ga_util.html
+++ b/ckanext/ga_report/templates/ga_report/ga_util.html
@@ -59,21 +59,41 @@
  </table>
 
 
-<div py:def="usage_nav(active_name)" id="minornavigation">
-    <div id="minornavigation-bg-left">
-    <div id="minornavigation-bg-right">
-      <ul class="nav nav-pills">
-        <?python querystring='?month='+c.month if c.month else '' ?>
-        <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')}${querystring}"><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:GaDatasetReport',action='publishers')}${querystring}"><img src="/images/icons/page_white.png" height="16px" width="16px" alt="None" class="inline-icon "/> Publishers</a>
-        </li>
-        <li py:attrs="{'class': 'active' if active_name=='Datasets' else None}">
-        <a py:attrs="{'class': 'active' if active_name=='Datasets' else None}"  href="${h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='read')}${querystring}"><img src="/images/icons/page_white.png" height="16px" width="16px" alt="None" class="inline-icon "/> Datasets</a>
-        </li>
+<div py:def="usage_nav(active_name)">
+  <span class="subheading">
+    <img src="/images/arrow-down-right.png" />
+    <a class="${if_(active_name=='Site-wide','active')}" href="${h.url_for(controller='ckanext.ga_report.controller:GaReport',action='index')}${if_(c.month,'?month='+c.month)}">Site-wide</a>
+    <span class="divider">|</span>
+    <a class="${if_(active_name=='Publishers','active')}" href="${h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='publishers')}${if_(c.month,'?month='+c.month)}">Publishers</a>
+    <span class="divider">|</span>
+    <a class="${if_(active_name=='Datasets','active')}" href="${h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='read')}${if_(c.month,'?month='+c.month)}">Datasets</a>
+  </span>
+</div>
+
+<div py:def="ga_sidebar(download_link)">
+  <div class="boxed">
+    <div class="widget-container widget_text">
+      <h4>Download</h4>
+      <p><center>
+        <a class="btn button btn-primary" href="${download_link}">Download as CSV</a></center>
+      </p>
+    </div>
+    <div class="widget-container widget_text">
+      <h4>Graph Legend</h4>
+      <div id="graph-legend-container">
+        <div style="display: none;" id="legend_none">(No graph is loaded)</div>
+      </div>
+    </div>
+    <div class="widget-container widget_text">
+      <h4>Notes</h4>
+      <ul>
+          <li>"Views" is the number of times a page was loaded in users' browsers.</li>
+          <li>"Downloads" is the number of times a user has clicked to download either an original or cached resource for a particular dataset. Download information is only available from 2nd December 2012; 'No data' is shown for records before that date.</li>
+          <li>These usage statistics are confined to users with javascript enabled, which excludes web crawlers and API calls.</li>
+          <li>The results are not shown when the number of views/visits is tiny. Where these relate to site pages, results are available in full in the CSV download. Where these relate to users' web browser information, results are not disclosed, for privacy reasons.</li>
       </ul>
     </div>
-    </div>
+  </div>
 </div>
 
 

--- a/ckanext/ga_report/templates/ga_report/notes.html
+++ /dev/null
@@ -1,16 +1,1 @@
-<html xmlns:py="http://genshi.edgewall.org/"
-  xmlns:i18n="http://genshi.edgewall.org/i18n"
-  xmlns:xi="http://www.w3.org/2001/XInclude"
-  py:strip="">
 
-    <li class="widget-container boxed widget_text">
-      <h4>Notes</h4>
-      <ul>
-          <li>"Views" is the number of times a page was loaded in users' browsers.</li>
-          <li>"Downloads" is the number of times a user has clicked to download either an original or cached resource for a particular dataset. Download information is only available from 2nd December 2012; 'No data' is shown for records before that date.</li>
-          <li>These usage statistics are confined to users with javascript enabled, which excludes web crawlers and API calls.</li>
-          <li>The results are not shown when the number of views/visits is tiny. Where these relate to site pages, results are available in full in the CSV download. Where these relate to users' web browser information, results are not disclosed, for privacy reasons.</li>
-      </ul>
-    </li>
-</html>
-

--- a/ckanext/ga_report/templates/ga_report/publisher/index.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/index.html
@@ -7,19 +7,9 @@
 
   <py:def function="page_title">Usage by Publisher</py:def>
 
+
   <py:match path="primarysidebar">
-    <li class="widget-container boxed widget_text">
-      <h4>Download</h4>
-      <p><center>
-          <a class="btn button btn-primary" href="${h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='publisher_csv',month=c.month or 'all')}">Download as CSV</a></center>
-      </p>
-    </li>
-    <li class="widget-container boxed widget_text">
-      <h4>Graph Legend</h4>
-      <div id="graph-legend-container">
-      </div>
-    </li>
-    <xi:include href="../notes.html" />
+    ${ga_sidebar(download_link=h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='publisher_csv',month=c.month or 'all'))}
   </py:match>
 
   <py:def function="optional_head">
@@ -35,13 +25,12 @@
 
   <div py:match="content">
 
-      <h1>Site Usage</h1>
+    <h1>Site Usage ${usage_nav('Publishers')}</h1>
 
-      ${usage_nav('Publishers')}
-
+    <div class="boxed">
 
        ${rickshaw_graph(c.top_publishers_graph,'publishers')}
-      <form class="form-inline" action="${h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='publishers')}" method="get">
+       <form class="form-inline" action="${h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='publishers')}" method="get">
           <div class="controls">
             <label>Show stats table for:</label>
             ${month_selector(c.month, c.months, c.day)}
@@ -49,22 +38,21 @@
        </form>
 
        <table class="ga-reports-table table table-condensed table-bordered table-striped">
-	 <tr>
-	   <th>Publisher</th>
-	   <th class="td-numeric">Dataset Views</th>
-	 </tr>
+         <tr>
+           <th>Publisher</th>
+           <th class="td-numeric">Dataset Views</th>
+         </tr>
         <py:for each="publisher, views, visits in c.top_publishers">
-	  <tr>
-	    <td>
-	        ${h.link_to(publisher.title, h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport', action='read_publisher', id=publisher.name) + (("?month=" + c.month) if c.month else ''))}
-	    </td>
-	    <td class="td-numeric">${views}</td>
-	  </tr>
+          <tr>
+            <td>
+                ${h.link_to(publisher.title, h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport', action='read_publisher', id=publisher.name) + (("?month=" + c.month) if c.month else ''))}
+            </td>
+            <td class="td-numeric">${views}</td>
+          </tr>
         </py:for>
        </table>
-
-
-  </div>
+    </div><!--/boxed-->
+  </div><!--/content-->
 
   <py:def function="optional_footer">
     <script type="text/javascript">

--- a/ckanext/ga_report/templates/ga_report/publisher/popular.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/popular.html
@@ -15,7 +15,12 @@
                 </li>
             </py:for>
         </ul>
-      <p class="">${h.link_to("More usage data for " + publisher.title, h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='read_publisher',id=publisher.name))}</p>
+      <p>
+        <a href="${h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='read_publisher',id=publisher.name)}">
+          <img py:if="preview_image" src="${preview_image}" /><br/>
+          More usage data for ${publisher.title}
+        </a>
+      </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
@@ -19,27 +19,14 @@
   </py:def>
 
   <py:match path="primarysidebar">
-    <li class="widget-container boxed widget_text">
-      <h4>Download</h4>
-      <p><center>
-          <a class="btn button btn-primary" href="${h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='dataset_csv',id=c.publisher_name or 'all',month=c.month or 'all')}">Download as CSV</a></center>
-      </p>
-    </li>
-    <li class="widget-container boxed widget_text">
-      <h4>Graph Legend</h4>
-      <div id="graph-legend-container">
-      </div>
-    </li>
-    <xi:include href="../notes.html" />
+    ${ga_sidebar(download_link=h.url_for(controller='ckanext.ga_report.controller:GaDatasetReport',action='dataset_csv',id=c.publisher_name or 'all',month=c.month or 'all'))}
   </py:match>
 
 
   <div py:match="content">
-     <h1>Site Usage</h1>
+    <h1>Site Usage ${usage_nav('Datasets')}</h1>
 
-     ${usage_nav('Datasets')}
-
-
+    <div class="boxed">
      <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>
@@ -80,6 +67,7 @@
       </table>
     </py:if>
 
+  </div>
 
   </div>
 

--- a/ckanext/ga_report/templates/ga_report/site/downloads.html
+++ b/ckanext/ga_report/templates/ga_report/site/downloads.html
@@ -8,19 +8,13 @@
   <py:def function="page_title">Downloads</py:def>
 
   <py:match path="primarysidebar">
-    <li py:if="c.downloads" class="widget-container boxed widget_text">
-      <h4>Download</h4>
-      <p><center>
-          <a class="btn button btn-primary" href="${h.url_for(controller='ckanext.ga_report.controller:GaReport',action='csv_downloads',month=c.month or 'all')}">Download as CSV</a></center>
-      </p>
-    </li>
-    <xi:include href="../notes.html" />
-
+    ${ga_sidebar(download_link=h.url_for(controller='ckanext.ga_report.controller:GaReport',action='csv_downloads',month=c.month or 'all'))}
   </py:match>
 
   <div py:match="content">
-      <h1>Downloads</h1>
-      ${usage_nav('Downloads')}
+      <h1>Downloads ${usage_nav('Downloads')}</h1>
+
+    <div class="boxed">
 
       <form class="form-inline" action="${h.url_for(controller='ckanext.ga_report.controller:GaReport',action='downloads')}" method="get">
           <div class="controls">
@@ -38,6 +32,7 @@
          <h4>No data</h4>
          <p>There is no download data available for this month</p>
        </py:if>
+     </div>
   </div>
 
   <xi:include href="../../layout.html" />

--- a/ckanext/ga_report/templates/ga_report/site/index.html
+++ b/ckanext/ga_report/templates/ga_report/site/index.html
@@ -19,26 +19,13 @@
   </py:def>
 
   <py:match path="primarysidebar">
-    <li class="widget-container boxed widget_text">
-      <h4>Download</h4>
-      <p><center>
-          <a class="btn button btn-primary" href="${h.url_for(controller='ckanext.ga_report.controller:GaReport',action='csv',month=c.month or 'all')}">Download as CSV</a></center>
-      </p>
-    </li>
-    <li class="widget-container boxed widget_text">
-      <h4>Graph Legend</h4>
-      <div id="graph-legend-container">
-        <div id="legend_none">(No graph loaded)</div>
-      </div>
-    </li>
-    <xi:include href="../notes.html" />
-
+    ${ga_sidebar(download_link=h.url_for(controller='ckanext.ga_report.controller:GaReport',action='csv',month=c.month or 'all'))}
   </py:match>
 
   <div py:match="content">
-      <h1>Site Usage</h1>
-      ${usage_nav('Site-wide')}
+      <h1>Site Usage ${usage_nav('Site-wide')}</h1>
 
+    <div class="boxed">
     <div class="tabbable">
       <ul class="nav nav-tabs">
         <li class="active"><a href="#totals" data-toggle="hashtab">Totals</a></li>
@@ -162,6 +149,7 @@
         </div>
        </div>
      </div>
+   </div>
   </div>