Added support for a popular datasets widget.
Added support for a popular datasets widget.

The widget will look in the ga_publishers for the 30 top publishers
and then randomly choose one from that list to show the top 10 datasets
of all time

--- a/ckanext/ga_report/controller.py
+++ b/ckanext/ga_report/controller.py
@@ -58,7 +58,7 @@
         c.months = _month_details(GA_Stat)
 
         # Work out which month to show, based on query params of the first item
-        c.month_desc = 'all time'
+        c.month_desc = 'all months'
         c.month = request.params.get('month', '')
         if c.month:
             c.month_desc = ''.join([m[1] for m in c.months if m[0]==c.month])
@@ -201,7 +201,7 @@
         writer = csv.writer(response)
         writer.writerow(["Publisher", "Views", "Visits", "Period Name"])
 
-        for publisher,view,visit in self._get_publishers(None):
+        for publisher,view,visit in _get_publishers(None):
             writer.writerow([publisher.title.encode('utf-8'),
                              view,
                              visit,
@@ -240,42 +240,14 @@
 
         # Work out which month to show, based on query params of the first item
         c.month = request.params.get('month', '')
-        c.month_desc = 'all time'
+        c.month_desc = 'all months'
         if c.month:
             c.month_desc = ''.join([m[1] for m in c.months if m[0]==c.month])
 
-        c.top_publishers = self._get_publishers()
+        c.top_publishers = _get_publishers()
 
         return render('ga_report/publisher/index.html')
 
-    def _get_publishers(self, limit=20):
-        connection = model.Session.connection()
-        q = """
-            select department_id, sum(pageviews::int) views, sum(visitors::int) visits
-            from ga_url
-            where department_id <> ''"""
-        if c.month:
-            q = q + """
-                    and period_name=%s
-            """
-        q = q + """
-                group by department_id order by views desc
-            """
-        if limit:
-            q = q + " limit %s;" % (limit)
-
-        # Add this back (before and period_name =%s) if you want to ignore publisher
-        # homepage views
-        # and not url like '/publisher/%%'
-
-        top_publishers = []
-        res = connection.execute(q, c.month)
-
-        for row in res:
-            g = model.Group.get(row[0])
-            if g:
-                top_publishers.append((g, row[1], row[2]))
-        return top_publishers
 
     def _get_packages(self, publisher, count=-1):
         if count == -1:
@@ -327,7 +299,7 @@
         # Work out which month to show, based on query params of the first item
         c.month = request.params.get('month', '')
         if not c.month:
-            c.month_desc = 'all time'
+            c.month_desc = 'all months'
         else:
             c.month_desc = ''.join([m[1] for m in c.months if m[0]==c.month])
 
@@ -345,3 +317,32 @@
 
         return render('ga_report/publisher/read.html')
 
+def _get_publishers(limit=20):
+    connection = model.Session.connection()
+    q = """
+        select department_id, sum(pageviews::int) views, sum(visitors::int) visits
+        from ga_url
+        where department_id <> ''"""
+    if c.month:
+        q = q + """
+                and period_name=%s
+        """
+    q = q + """
+            group by department_id order by views desc
+        """
+    if limit:
+        q = q + " limit %s;" % (limit)
+
+    # Add this back (before and period_name =%s) if you want to ignore publisher
+    # homepage views
+    # and not url like '/publisher/%%'
+
+    top_publishers = []
+    res = connection.execute(q, c.month)
+
+    for row in res:
+        g = model.Group.get(row[0])
+        if g:
+            top_publishers.append((g, row[1], row[2]))
+    return top_publishers
+

--- a/ckanext/ga_report/helpers.py
+++ b/ckanext/ga_report/helpers.py
@@ -3,15 +3,49 @@
 import ckan.lib.base as base
 import ckan.model as model
 
+from ckanext.ga_report.ga_model import GA_Url, GA_Publisher
+from ckanext.ga_report.controller import _get_publishers
 _log = logging.getLogger(__name__)
 
+def popular_datasets(count=10):
+    import random
+
+    publisher = None
+    publishers = _get_publishers(30)
+    total = len(publishers)
+    while not publisher or not datasets:
+        rand = random.randrange(0, total)
+        publisher = publishers[rand][0]
+        if not publisher.state == 'active':
+            publisher = None
+            continue
+        datasets = _datasets_for_publisher(publisher, 10)[:count]
+
+    ctx = {
+        'datasets': datasets,
+        'publisher': publisher
+    }
+    return base.render_snippet('ga_report/ga_popular_datasets.html', **ctx)
+
+
 def most_popular_datasets(publisher, count=20):
-    from ckanext.ga_report.ga_model import GA_Url
 
     if not publisher:
         _log.error("No valid publisher passed to 'most_popular_datasets'")
         return ""
 
+    results = _datasets_for_publisher(publisher, count)
+
+    ctx = {
+        'dataset_count': len(datasets),
+        'datasets': results,
+
+        'publisher': publisher
+    }
+
+    return base.render_snippet('ga_report/publisher/popular.html', **ctx)
+
+def _datasets_for_publisher(publisher, count):
     datasets = {}
     entries = model.Session.query(GA_Url).\
         filter(GA_Url.department_id==publisher.name).\
@@ -29,14 +63,5 @@
     for k, v in datasets.iteritems():
         results.append((k,v['views'],v['visits']))
 
-    results = sorted(results, key=operator.itemgetter(1), reverse=True)
+    return sorted(results, key=operator.itemgetter(1), reverse=True)
 
-    ctx = {
-        'dataset_count': len(datasets),
-        'datasets': results,
-
-        'publisher': publisher
-    }
-
-    return base.render_snippet('ga_report/publisher/popular.html', **ctx)
-

--- a/ckanext/ga_report/plugin.py
+++ b/ckanext/ga_report/plugin.py
@@ -2,6 +2,9 @@
 import ckan.lib.helpers as h
 import ckan.plugins as p
 from ckan.plugins import implements, toolkit
+
+from ckanext.ga_report.helpers import (most_popular_datasets,
+                                       popular_datasets)
 
 log = logging.getLogger('ckanext.ga-report')
 
@@ -19,9 +22,9 @@
         A dictionary of extra helpers that will be available to provide
         ga report info to templates.
         """
-        from ckanext.ga_report.helpers import most_popular_datasets
         return {
             'ga_report_installed': lambda: True,
+            'popular_datasets': popular_datasets,
             'most_popular_datasets': most_popular_datasets,
         }
 

--- a/ckanext/ga_report/report_model.py
+++ /dev/null

--- /dev/null
+++ b/ckanext/ga_report/templates/ga_report/ga_popular_datasets.html
@@ -1,1 +1,27 @@
+<html xmlns:py="http://genshi.edgewall.org/"
+  xmlns:i18n="http://genshi.edgewall.org/i18n"
+  xmlns:xi="http://www.w3.org/2001/XInclude"
+  py:strip="">
 
+<div class="popular_datasets">
+    <div class="pull-right">
+        <a href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='index')}" class="btn btn-primary">More popular datasets »</a>
+    </div>
+    <h2>Popular datasets</h2>
+    <h4>${publisher.title}</h4>
+    <ul>
+        <py:for each="dataset, _, _ in datasets">
+            <li>
+                <span>${h.link_to(dataset.title, h.url_for(controller='package', action='read', id=dataset.name))}</span>
+        <div>${h.truncate(dataset.notes, length=80, whole_word=True)}</div>
+            </li>
+        </py:for>
+    </ul>
+
+ </div>
+
+</html>
+
+
+
+

--- a/ckanext/ga_report/templates/ga_report/ga_util.html
+++ b/ckanext/ga_report/templates/ga_report/ga_util.html
@@ -5,15 +5,6 @@
   xmlns:xi="http://www.w3.org/2001/XInclude"
   py:strip=""
   >
-
- <table py:def="publisher_list(groups)" class="groups">
-   <py:for each="group,title in groups">
-   <tr>
-     <td><a href="/publisher/${group.name}">${title}</a></td>
-   </tr>
-   </py:for>
- </table>
-
 
 <table py:def="social_table(items, with_source=False)" class="table table-condensed table-bordered table-striped">
     <tr>
@@ -49,12 +40,12 @@
     <div id="minornavigation-bg-left">
     <div id="minornavigation-bg-right">
         <ul class="nav nav-pills">
-        <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')}"><img src="/images/icons/page_white_gear.png" height="16px" width="16px" alt="None" class="inline-icon "/> Site-wide</a></li>
+        <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')}"><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:GaPublisherReport',action='index')}"><img src="/images/icons/page_white_gear.png" height="16px" width="16px" alt="None" class="inline-icon "/> Publishers</a>
+                <a py:attrs="{'class': 'active' if active_name=='Publishers' else None}"  href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='index')}"><img src="/images/icons/page_white.png" height="16px" width="16px" alt="None" class="inline-icon "/> Publishers</a>
         </li>
         <li py:if="publisher" class="active">
-                <a class="active"  href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='read', id=publisher.name)}"><img src="/images/icons/page_white_gear.png" height="16px" width="16px" alt="None" class="inline-icon "/>${publisher.title}</a>
+                <a class="active"  href="${h.url_for(controller='ckanext.ga_report.controller:GaPublisherReport',action='read', id=publisher.name)}"><img src="/images/icons/page_white.png" height="16px" width="16px" alt="None" class="inline-icon "/>${publisher.title}</a>
         </li>
 
         </ul>

--- a/ckanext/ga_report/templates/ga_report/publisher/index.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/index.html
@@ -27,6 +27,7 @@
 
 
   <div py:match="content">
+
       <h1>Site Usage</h1>
 
       ${usage_nav('Publishers', None)}
@@ -35,7 +36,7 @@
       <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>
+                <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All months</option>
 
               <py:for each="val,desc in c.months">
                 <option value='${val}' py:attrs="{'selected': 'selected' if c.month == val else None}">${desc}</option>

--- a/ckanext/ga_report/templates/ga_report/publisher/read.html
+++ b/ckanext/ga_report/templates/ga_report/publisher/read.html
@@ -11,7 +11,7 @@
     <li class="widget-container boxed widget_text">
       <h4>Publishers</h4>
       <p>
-          Dataset views records the number of times a specific dataset page has been viewed. Visits records the number of unique site visits.
+          Dataset views records the number of times a specific dataset page has been viewed for <a href="${h.url_for(controller='ckanext.dgu.controllers.publisher:PublisherController',action='read',id=c.publisher.name)}">${c.publisher.title}</a>. Visits records the number of unique site visits.
       </p>
       <p>
           Note: this data does not include API calls.
@@ -35,7 +35,7 @@
       <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>
+                <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All months</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
@@ -30,7 +30,7 @@
       <form class="form-inline" action="${h.url_for(controller='ckanext.ga_report.controller:GaReport',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>
+                <option value='' py:attrs="{'selected': 'selected' if not c.month else None}">All months</option>
 
               <py:for each="val,desc in c.months">
                 <option value='${val}' py:attrs="{'selected': 'selected' if c.month == val else None}">${desc}</option>