From 539d8f44fda7d45c59e35ae6d0fa33674e0d0fbe Mon Sep 17 00:00:00 2001
From: Brian Moe <brian.moe@ligo.org>
Date: Mon, 9 Jan 2012 12:43:19 -0600
Subject: [PATCH] Playing with data sources

---
 gracedb/datas.py             | 151 +++++++++++++++++++++++++++++++++++
 templates/gracedb/datas.html | 108 +++++++++++++++++++++++++
 urls.py                      |   3 +
 3 files changed, 262 insertions(+)
 create mode 100644 gracedb/datas.py
 create mode 100644 templates/gracedb/datas.html

diff --git a/gracedb/datas.py b/gracedb/datas.py
new file mode 100644
index 000000000..f18d9e2ad
--- /dev/null
+++ b/gracedb/datas.py
@@ -0,0 +1,151 @@
+from django.http import HttpResponse
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+
+from gracedb.gracedb.models import Event
+
+from django.db import connection, transaction
+
+import gviz_api
+from datetime import datetime
+
+def index(request):
+
+    # foo = Event.objects.raw("select date_format(date, '%Y-%m') as month, sum(quantity) as hours from hourentries group by date_format(date, '%Y-%m') order by date;")
+
+#   q = "SELECT * from gracedb_event LIMIT 10"
+#   q = "SELECT date_format(created, '%%Y-%%m') as month, COUNT(*) AS total FROM gracedb_event GROUP BY date_format(created, '%%Y-%%m') order by created"
+
+#   cursor = connection.cursor()
+#   cursor.execute(q)
+
+#   desc = cursor.description
+#   foo = [ dict(zip([col[0] for col in desc], row))
+#                       for row in cursor.fetchall()
+#                           ]
+    foo = "I AM THE FOO"
+
+    return render_to_response(
+            'gracedb/datas.html',
+            {'thing' : str(foo)},
+            context_instance=RequestContext(request))
+
+def source(request):
+    tq = request.GET.get('tq',"")
+    tqx = request.GET.get('tqx',"")
+
+    atypes = ["OM", "LM"]
+    description = [ ("Year", "string"), ]
+
+    buffy = []
+
+    things = dict(zip(atypes, [{}]*len(atypes)))
+    things = {}
+    dates = set()
+    for t in atypes:
+        description.append( (t, "number") )
+        q = "SELECT date_format(created, '%%Y-%%m') as month, COUNT(*) AS total FROM gracedb_event WHERE analysisType = %s GROUP BY date_format(created, '%%Y-%%m')"
+        cursor = connection.cursor()
+        cursor.execute(q, [t])
+        d = {}
+        for row in cursor.fetchall():
+            d[str(row[0])] = int(row[1])
+            dates.update([row[0]])
+            buffy.append(row)
+        things[t] = d
+        cursor.close()
+# THINGS
+#  {'OM': {u'2010-01': 37, u'2011-08': 1, u'2010-08': 5193, u'2010-07': 1085, u'2011-11': 1, u'2010-04': 433, u'2011-12': 3, u'2009-07': 10, u'2009-06': 5, u'2010-03': 528, u'2010-02': 307, u'2009-10': 109, u'2009-11': 281, u'2009-12': 1, u'2010-06': 221, u'2010-09': 4018, u'2010-05': 519, u'2012-01': 3, u'2010-10': 1871, u'2009-08': 149}, 'LM': {u'2010-01': 37, u'2011-08': 1, u'2010-08': 5193, u'2010-07': 1085, u'2011-11': 1, u'2010-04': 433, u'2011-12': 3, u'2009-07': 10, u'2009-06': 5, u'2010-03': 528, u'2010-02': 307, u'2009-10': 109, u'2009-11': 281, u'2009-12': 1, u'2010-06': 221, u'2010-09': 4018, u'2010-05': 519, u'2012-01': 3, u'2010-10': 1871, u'2009-08': 149}}
+
+# BUFFY
+# [(u'2009-06', 1L), (u'2009-07', 69L), (u'2009-08', 149L), (u'2009-10', 109L), (u'2009-11', 281L), (u'2009-12', 243L), (u'2010-01', 37L), (u'2010-02', 307L), (u'2010-03', 528L), (u'2010-04', 433L), (u'2010-05', 519L), (u'2010-06', 221L), (u'2010-07', 262L), (u'2010-08', 902L), (u'2010-09', 962L), (u'2010-10', 318L), (u'2011-11', 4L), (u'2009-06', 5L), (u'2009-07', 10L), (u'2009-12', 1L), (u'2010-07', 1085L), (u'2010-08', 5193L), (u'2010-09', 4018L), (u'2010-10', 1871L), (u'2011-08', 1L), (u'2011-11', 1L), (u'2011-12', 3L), (u'2012-01', 3L)]
+
+    data_table = gviz_api.DataTable(description)
+
+    data = [
+        ["2011-01", 33, 44],
+        ["2011-02", 43, 24],
+        ["2011-03", 38, 34],
+    ]
+
+    dates = list(dates)
+    dates.sort()
+
+    data = []
+    for date in dates:
+        row = [date]
+        for t in atypes:
+            try:
+                row.append(things[t][date])
+            except:
+                row.append(0)
+        data.append(row)
+
+    data_table.LoadData(data)
+    #return HttpResponse(str(dates))
+    #return HttpResponse(str(data))
+    return HttpResponse(data_table.ToResponse(tqx=tqx))
+
+def sourcea(request):
+
+#   description = [
+#       ("year", "string", "year"),
+#       ("first", "number", "first"),
+#       ("second", "number", "second"),
+#   ]
+#   data_table = gviz_api.DataTable(description)
+#   data_table.LoadData([
+#       [2001, 1,3],
+#       [2002, 2,4],
+#       [2003, 3,5],
+#   ])
+#   return HttpResponse(data_table.ToResponse(columns_order=("year", "first", "second")))
+
+    tq = request.GET.get('tq',"")
+    tqx = request.GET.get('tqx',"")
+
+    description = {
+        "month": ("date", "Month"),
+        "type": ("string", "Type"),
+        "total": ("number", "Total Events"),
+    }
+    data_table = gviz_api.DataTable(description)
+
+    q = "SELECT date_format(created, '%%Y-%%m') as month, analysisType, COUNT(*) AS total FROM gracedb_event GROUP BY date_format(created, '%%Y-%%m'),analysisType order by created"
+
+    cursor = connection.cursor()
+    cursor.execute(q)
+
+    def blarg(d):
+        year, month = d.split('-')
+        return datetime(int(year), int(month), 1)
+
+#   for row in cursor.fetchall():
+#       data_table.addRow([blarg(row[0]), row[1], row[2]])
+    data = [
+        #{ "month": row[0], "total": row[1] } for row in cursor.fetchall()
+        { "month": blarg(row[0]), "type": row[1], "total": row[2] } for row in cursor.fetchall()
+    ]
+    data_table.LoadData(data)
+
+    return HttpResponse(data_table.ToResponse(columns_order=("month", "type", "total"), tqx=tqx))
+    return HttpResponse(data_table.ToResponse(tqx=tqx))
+
+def sourcex(request):
+
+    description = {"name": ("string", "Name"),
+                   "salary": ("number", "Salary"),
+                   "full_time": ("boolean", "Full Time Employee")}
+    data = [{"name": "Mike", "salary": (10000, "$10,000"), "full_time": True},
+            {"name": "Jim", "salary": (800, "$800"), "full_time": False},
+            {"name": "Alice", "salary": (12500, "$12,500"), "full_time": True},
+            {"name": "Bob", "salary": (7000, "$7,000"), "full_time": True}]
+
+    data_table = gviz_api.DataTable(description)
+    data_table.LoadData(data)
+    #print "Content-type: text/plain"
+    #print
+    #print data_table.ToJSonResponse(columns_order=("name", "salary", "full_time"),
+    #                                order_by="salary")
+    return HttpResponse(data_table.ToResponse(columns_order=("name", "salary", "full_time"), order_by="salary", tqx=tqx))
+
diff --git a/templates/gracedb/datas.html b/templates/gracedb/datas.html
new file mode 100644
index 000000000..a57962e7b
--- /dev/null
+++ b/templates/gracedb/datas.html
@@ -0,0 +1,108 @@
+{% extends "base.html" %}
+
+{% block jscript %}
+<script type="text/javascript" src="https://www.google.com/jsapi"></script>
+    <script type="text/javascript">
+    
+      // Load the Visualization API and the piechart package.
+      google.load('visualization', '1.0', {'packages':['corechart']});
+      
+      // Set a callback to run when the Google Visualization API is loaded.
+      //google.setOnLoadCallback(drawChart);
+      
+      // Callback that creates and populates a data table, 
+      // instantiates the pie chart, passes in the data and
+      // draws it.
+      function drawChart() {
+
+      // Create the data table.
+      var data = new google.visualization.DataTable();
+      data.addColumn('string', 'Topping');
+      data.addColumn('number', 'Slices');
+      data.addRows([
+        ['Mushrooms', 3],
+        ['Onions', 1],
+        ['Olives', 1], 
+        ['Zucchini', 1],
+        ['Pepperoni', 2]
+      ]);
+
+      // Set chart options
+      var options = {'title':'How Much Pizza I Ate Last Night',
+                     'width':400,
+                     'height':300};
+
+      // Instantiate and draw our chart, passing in some options.
+      var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
+      chart.draw(data, options);
+    }
+    </script>
+
+
+    <script type="text/javascript">
+      google.setOnLoadCallback(initialize);
+        function fakeData() {
+            var data = new google.visualization.DataTable();
+                    data.addColumn('string', 'Year');
+                    data.addColumn('number', 'Sales');
+                    data.addColumn('number', 'Expenses');
+                    data.addRows([
+                      ['2004', 1000, 400],
+                      ['2005', 1170, 460],
+                      ['2006', 660, 1120],
+                      ['2007', 1030, 540]
+                    ]);
+            return data;
+        }
+
+        function initialize() {
+          // Replace the data source URL on next line with your data source URL.
+          // Specify that we want to use the XmlHttpRequest object to make the query.
+          var opts = {sendMethod: 'xhr'};
+          var query = new google.visualization.Query('https://moe.phys.uwm.edu/gracedb/datas/source', opts);
+          
+          // Optional request to return only column C and the sum of column B, grouped by C members.
+          //query.setQuery('select C, sum(B) group by C');
+          
+          // Send the query with a callback function.
+          query.send(handleQueryResponse);
+        }
+        function handleQueryResponse(response) {
+
+          if (response.isError()) {
+            alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
+            return;
+          }
+
+
+          var data = response.getDataTable();
+          var chart = new google.visualization.ColumnChart(document.getElementById('chart_div2'));
+          var options = {
+            width: 800,
+            height: 240,
+            //is3D: true,
+            hAxis: { title: "year", strictFirstColumnType: true }
+          };
+          chart.draw(data, options);
+          //chart.draw(fakeData(), options);
+        }
+    </script>
+
+
+{% endblock %}
+
+{% block title %}&iexcl;&iexcl;DATAS!!{% endblock %}
+{% block heading %}&iexcl;&iexcl;DATAS!!{% endblock %}
+{% block pageid  %}datas{% endblock %}
+
+
+{% block content %}
+
+IMA dATAhATE-Ahhhhhhhhhhhh
+{{ thing }}
+<hr/>
+<div id="chart_div">ONEs</div>
+<hr/>
+<div id="chart_div2">Goobs</div>
+
+{% endblock %}
diff --git a/urls.py b/urls.py
index 9d2d04ede..aaaf7d3ab 100644
--- a/urls.py
+++ b/urls.py
@@ -31,6 +31,9 @@ urlpatterns = patterns('',
     (r'^reports/(?P<path>.+)$', 'django.views.static.serve',
             {'document_root': settings.LATENCY_REPORT_DEST_DIR}),
 
+    url(r'^datas/$', 'gracedb.gracedb.datas.index', name="datas"),
+    url(r'^datas/source$', 'gracedb.gracedb.datas.source', name="source"),
+
     # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
     # to INSTALLED_APPS to enable admin documentation:
     # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
-- 
GitLab