summaryrefslogtreecommitdiff
path: root/megapixels/app/utils/sheet_utils.py
blob: 85f979c6728e43400e73a899e3132af7836b418e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import os
import gspread
from oauth2client.service_account import ServiceAccountCredentials

from app.settings import app_cfg as cfg

def fetch_spreadsheet():
  """Open the Google Spreadsheet, which contains the individual worksheets"""
  scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
  path = os.path.dirname(os.path.abspath(__file__))
  credentials = ServiceAccountCredentials.from_json_keyfile_name(cfg.GOOGLE_ACCOUNT_CREDS_PATH, scope)
  docid = "1denb7TjYsN9igHyvYah7fQ0daABW32Z30lwV7QrDJQc"
  client = gspread.authorize(credentials)
  spreadsheet = client.open_by_key(docid)
  return spreadsheet

def fetch_worksheet(name):
  """Get a reference to a particular "worksheet" from the Google Spreadsheet"""
  spreadsheet = fetch_spreadsheet()
  return spreadsheet.worksheet(name)

def fetch_google_sheet(name):
  """Get all the values from a particular worksheet as a list of lists.
  Returns:
  :keys - the first row of the document
  :lines - a list of lists with the rest of the rows"""
  rows = fetch_worksheet(name).get_all_values()
  keys = rows[0]
  lines = rows[1:]
  return keys, lines

def fetch_google_sheet_objects(name):
  """Get all the values from a worksheet as a list of dictionaries"""
  keys, rows = fetch_google_sheet(name)
  recs = []
  for row in rows:
    rec = {}
    for index, key in enumerate(keys):
      rec[key] = row[index]
    recs.append(rec)
  return recs

def fetch_google_lookup(name, item_key='key'):
  """Get all the values from a worksheet as a dictionary of dictionaries.
  Specify which field you want to use as the dictionary key."""
  keys, rows = fetch_google_sheet(name)
  lookup = {}
  for row in rows:
    rec = {}
    for index, key in enumerate(keys):
      rec[key] = row[index]
    lookup[rec[item_key]] = rec
  return lookup

def fetch_verified_paper_lookup():
  """Fetch a lookup keyed by dataset, where each dataset points to a hash of valid or invalid papers..."""
  keys, rows = fetch_google_sheet('verifications')
  verified_lookup = {}
  for row in rows:
    rec = {}
    for index, key in enumerate(keys):
      rec[key] = row[index]
    if rec['dataset'] not in verified_lookup:
      verified_lookup[rec['dataset']] = {}
    if str(rec['uses_dataset']) == '1':
      verified_lookup[rec['dataset']][rec['paper_id']] = rec
  return verified_lookup

def update_or_append_worksheet(name, form):
  """Update a row if it exists, create it if it doesn't"""
  worksheet = fetch_worksheet(name)
  keys = worksheet.row_values(1)
  row = [ form[key] if key in form else '' for key in keys ]
  try:
    cell = worksheet.find(form['paper_id'])
  except:
    cell = None
  if cell:
    for i, item in enumerate(row):
      worksheet.update_cell(cell.row, i+1, item)
  else:
    worksheet.append_row(row)