-from flask import current_app
-import pickle
-import os.path
-import os
+PUZZLE_TEMPLATE_ID = "1drSoyrE4gM3JaGweDkOybwXWdKPIDTfUmB1gQCYS3Uw"
+PUZZLE_TEMPLATE_SHEETS = ["Text", "Grid"]
-from googleapiclient.discovery import build
+def sheets_create(turb, name):
+ """Create a new sheet with the given name.
-# If modifying these scopes, delete the file token.pickle.
-SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
+ Returns the dict with 'id' and 'url'of the spreadsheet.
+ """
-turbot_deploy_dir = os.environ.get('TURBOT_DEPLOY_DIR', '.')
-TOKEN_FILE = "{}/.gsheets-token.pickle".format(turbot_deploy_dir)
+ # Create a new spreadsheet
+ spreadsheet_body = {
+ 'properties': {
+ 'title': name
+ }
+ }
-creds = None
+ new_sheet = turb.sheets.create(body=spreadsheet_body).execute()
-def sheets_create(name):
- """Create a new sheet with the given name.
+ # Now that we've created a new sheet, we need to also allow anyone
+ # with the link to the sheet to be able to edit it.
+ turb.permissions.create(fileId=new_sheet["spreadsheetId"],
+ body={'type': 'anyone', 'role': 'writer'},
+ fields='id').execute()
- Returns the URL for the spreadsheet.
- """
- global creds
+ return {
+ 'id': new_sheet["spreadsheetId"],
+ 'url': new_sheet["spreadsheetUrl"]
+ }
+
+def sheets_create_for_puzzle(turb, name):
+ """Creates a new sheet for a puzzle of the given name
- # The file token.pickle stores token from last login/refresh
- if not creds:
- if os.path.exists(TOKEN_FILE):
- with open(TOKEN_FILE, 'rb') as token:
- creds = pickle.load(token)
+ Like sheets_create(), but also copies the puzzle template sheet."""
- # If there are no (valid) credentials available, give up
- if not creds or not creds.valid:
- current_app.logger.error("No token found in {}".format(TOKEN_FILE))
- current_app.logger.error("Try running ./gsheets-authenticate.py")
- return None
+ # First create the new sheet
+ new_sheet = sheets_create(turb, name)
- service = build('sheets', 'v4', credentials=creds)
+ # Copy some sheets from the Template spreadsheet
- # Create a new sheet
- spreadsheet_body = {}
+ response = turb.sheets.get(spreadsheetId=PUZZLE_TEMPLATE_ID).execute()
- request = service.spreadsheets().create(body=spreadsheet_body)
- response = request.execute()
+ for sheet in response["sheets"]:
+ if sheet["properties"]["title"] in PUZZLE_TEMPLATE_SHEETS:
+ turb.sheets.sheets().copyTo(spreadsheetId=PUZZLE_TEMPLATE_ID,
+ sheetId=sheet["properties"]["sheetId"],
+ body={
+ "destinationSpreadsheetId":
+ new_sheet['id']
+ }).execute()
- return response["spreadsheetUrl"]
+ return new_sheet