Add a command-line tool for creating google spreadsheets, and appending values
authorStephen Soltesz <soltesz@cs.princeton.edu>
Sun, 22 May 2011 20:34:51 +0000 (20:34 +0000)
committerroot <root@monitor.planet-lab.org>
Sun, 22 May 2011 20:35:26 +0000 (20:35 +0000)
statistics/add-google-record.py [new file with mode: 0755]

diff --git a/statistics/add-google-record.py b/statistics/add-google-record.py
new file mode 100755 (executable)
index 0000000..ae0d313
--- /dev/null
@@ -0,0 +1,151 @@
+#!/usr/bin/python
+
+import gdata.spreadsheet.text_db
+import gdata.spreadsheet.service
+import simplejson
+import time
+import sys
+
+def get_key_for_dbname(gd_client, dbname):
+    feed = gd_client.GetSpreadsheetsFeed()
+    for i, entry in enumerate(feed.entry):
+        if entry.title.text == dbname:
+            # get key for this db.
+            return feed.entry[i].id.text.rsplit('/', 1)[1]
+    return None
+
+def get_worksheet_for_key(gd_client, key, sheetname):
+    feed = gd_client.GetWorksheetsFeed(key)
+    for i, entry in enumerate(feed.entry):
+        if entry.title.text == sheetname:
+            # get id for worksheet
+            return feed.entry[i].id.text.rsplit('/', 1)[1]
+    return None
+
+
+def get_row_for_update(gd_client, key, wksht_id, date):
+    feed = gd_client.GetListFeed(key, wksht_id)
+    for i, entry in enumerate(feed.entry):
+        #print entry.custom['date'].text
+        if date in entry.custom['date'].text:
+            e = {}
+            for k in entry.custom: e[k] = entry.custom[k].text
+            return (i, e)
+    return (0, {})
+
+
+def update_row(gd_client, key, wksht_id, index, row_data):
+    feed = gd_client.GetListFeed(key, wksht_id)
+    entry = gd_client.UpdateRow( feed.entry[index], row_data)
+    if isinstance(entry, gdata.spreadsheet.SpreadsheetsList):
+        print 'Updated!'
+
+        
+def get_db(client, name):
+    db_list = client.GetDatabases(name=name)
+    if len(db_list) == 0:
+        db = client.CreateDatabase(name)
+    else:
+        db = db_list[0]
+    return db
+
+def get_table(db, table_name, type_list=None):
+    try:
+        table_list = db.GetTables(name=table_name)
+    except:
+        table_list = []
+
+    if len(table_list) == 0:
+        table = db.CreateTable(table_name, type_list)
+    else:
+        table = table_list[0]
+    return table
+
+
+def add_record(table, data):
+    row = table.AddRecord(data)
+    return row
+
+def main():
+    from optparse import OptionParser
+    parser = OptionParser()
+    
+    parser.set_defaults(database="MonitorStats",
+                        sheet="",
+                        labels="date,good,offline,down,online,disabled,failboot,safeboot",
+                        values=None,
+                        valuelist=None,
+                        update=None,
+                                               email=None,
+                                               password=None,
+                                               prefix="",
+                        create=False)
+    parser.add_option("", "--email", dest="email", help="")
+    parser.add_option("", "--password", dest="password", help="")
+    parser.add_option("", "--database", dest="database", help="")
+    parser.add_option("", "--create", dest="create", action="store_true", help="")
+    parser.add_option("", "--sheet",  dest="sheet", help="")
+    parser.add_option("", "--labels", dest="labels", help="")
+    parser.add_option("", "--values", dest="values", help="")
+    parser.add_option("", "--valuelist", dest="valuelist", help="")
+    parser.add_option("", "--update", dest="update", help="")
+    parser.add_option("", "--prefix", dest="prefix", help="add a prefix to numeric headers")
+
+    (config, args) = parser.parse_args()
+    #if len(sys.argv) == 1:
+    #    parser.print_help()
+    #    sys.exit(1)
+
+    email = config.email
+    password = config.password
+    client = gdata.spreadsheet.text_db.DatabaseClient(email, password)
+    gd_client = gdata.spreadsheet.service.SpreadsheetsService() # text_db.DatabaseClient(email, password)
+    gd_client.email = email
+    gd_client.password = password
+    gd_client.source = "add-record-1"
+    gd_client.ProgrammaticLogin()
+
+    if config.labels:
+        config.labels = config.labels.split(',')
+       config.labels = [config.labels[0] ] + [ config.prefix + l for l in config.labels[1:] ]
+
+    data_list = []
+    if config.values:
+        config.values = config.values.split(',')
+        data_list = [dict(zip(config.labels, config.values))]
+        print data_list
+
+    elif config.valuelist:
+        vl_file = open(config.valuelist, 'r')
+        for line in vl_file:
+            line = line.strip()
+            values = line.split(',')
+            data_list.append(dict(zip(config.labels, values)))
+
+    if config.update:
+        key = get_key_for_dbname(gd_client, config.database)
+        wksht_id = get_worksheet_for_key(gd_client, key, config.sheet)
+        (index, row_data) = get_row_for_update(gd_client, key, wksht_id, config.update)
+        if index == 0 : print "failed to find row!"; sys.exit(1)
+        # update values from command-line over existing values from row
+        row_data.update( dict(zip(config.labels, config.values)) )
+        update_row(gd_client, key, wksht_id, index, row_data)
+
+    else:
+        db = get_db(client, config.database)
+        table = get_table(db, config.sheet, config.labels)
+        for data in data_list:
+            print "Adding data: %s" % data
+            add_record(table, data)
+    #else:
+    #    obj = simplejson.load(sys.stdin)
+    #    print obj
+    #    for o in obj:
+    #        sheet = o['sheet']
+    #        del o['sheet']
+    #        data = dict(zip(config.labels.split(','), config.values.split(',')))
+    #        add_record(table, data)
+    #        #add_record(config, o, sheet)
+
+if __name__ == '__main__':
+    main()