Feature #162: Added Rickshaw graphs to most panes of statistics. Needs a little tidying for clarity.
[ckanext-ga-report.git] / ckanext / ga_report / controller.py
blob:a/ckanext/ga_report/controller.py -> blob:b/ckanext/ga_report/controller.py
--- 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',
@@ -327,8 +334,9 @@
                         filter(GA_Stat.key==package.name)
                     if month != 'All':  # Fetch everything unless the month is specific
                         dls = dls.filter(GA_Stat.period_name==month)
-
-                    downloads = sum(int(d.value) for d in dls.all())
+                    downloads = 0
+                    for x in dls:
+                        downloads += int(x.value)
                 else:
                     downloads = 'No data'
                 top_packages.append((package, entry.pageviews, entry.visits, downloads))
@@ -378,6 +386,26 @@
         c.publisher_page_views = entry.pageviews if entry else 0
 
         c.top_packages = self._get_packages(c.publisher, 20)
+
+        # Graph query
+        top_package_names = [ x[0].name for x in c.top_packages ]
+        graph_query = model.Session.query(GA_Url,model.Package)\
+            .filter(model.Package.name==GA_Url.package_id)\
+            .filter(GA_Url.url.like('/dataset/%'))\
+            .filter(GA_Url.package_id.in_(top_package_names))
+        graph_data = {}
+        for entry,package in graph_query:
+            if not package: continue
+            if entry.period_name=='All': continue
+            graph_data[package.id] = graph_data.get(package.id,{
+                'name':package.title,
+                'data':[]
+                })
+            graph_data[package.id]['data'].append({
+                'x':_get_unix_epoch(entry.period_name),
+                'y':int(entry.pageviews),
+                })
+        c.graph_data = json.dumps(graph_data.values())
 
         return render('ga_report/publisher/read.html')