From: Carl Worth Date: Sun, 10 Jan 2021 17:52:27 +0000 (-0800) Subject: Use the Google drive API to create a hunt's sheet within a folder X-Git-Url: https://git.cworth.org/git?p=turbot;a=commitdiff_plain;h=c267061f2ba8826b35bb3f0a467b7585838fccf0 Use the Google drive API to create a hunt's sheet within a folder When a hunt is created, we create a folder in Google drive named after the hunt_id and the create the hunt's sheet in that folder. In future commits, we'll change the puzzle sheets to also be created in this hunt's folder. This way, with all resources in one folder, that folder can be shared out to members of the hunt, (this could be used as an alternate access to hunt resources if Slack is not available for any reason). --- diff --git a/turbot/events.py b/turbot/events.py index cae4ccf..8f9f12c 100644 --- a/turbot/events.py +++ b/turbot/events.py @@ -2,7 +2,9 @@ from turbot.blocks import ( section_block, text_block, button_block, actions_block, divider_block ) from turbot.hunt import hunt_blocks, find_hunt_for_hunt_id -from turbot.sheets import sheets_create, sheets_create_for_puzzle +from turbot.sheets import ( + sheets_create, sheets_create_for_puzzle, sheets_create_folder +) from turbot.slack import slack_send_message, slack_channel_members from turbot.channel import channel_url from boto3.dynamodb.conditions import Key @@ -123,19 +125,21 @@ def hunt_channel_created(turb, channel_name, channel_id): "Welcome to the channel for the {} hunt! ".format(hunt['name']) + "Please wait a minute or two while I create some backend resources.") - # Create a sheet for the hunt - sheet = sheets_create(turb, hunt['name']) + # Create a new folder within Google drive for the hunt + hunt['folder_id'] = sheets_create_folder(turb, hunt['hunt_id']) - # Update the database with the URL of the sheet + # Create a sheet for the hunt + sheet = sheets_create(turb, hunt['name'], hunt['folder_id']) hunt['sheet_url'] = sheet['url'] - turb.table.put_item(Item=hunt) # Message the channel with the URL of the sheet slack_send_message(turb.slack_client, channel_id, "Sheet created for this hunt: {}".format(sheet['url'])) - # Mark the hunt as active in the database + # Mark the hunt as active now hunt['active'] = True + + # Update the database with all the changes we have made to the hunt turb.table.put_item(Item=hunt) # Message the hunt channel that the database is ready diff --git a/turbot/sheets.py b/turbot/sheets.py index df2e4e9..831998d 100644 --- a/turbot/sheets.py +++ b/turbot/sheets.py @@ -2,17 +2,50 @@ PUZZLE_TEMPLATE_ID = "1drSoyrE4gM3JaGweDkOybwXWdKPIDTfUmB1gQCYS3Uw" PUZZLE_TEMPLATE_SHEETS = ["Text", "Square grid", "Hex Grid", "Formula reference: indexing"] -def sheets_create(turb, name): +def sheets_create_folder(turb, folder_name): + """Create a new folder within Google Drive + + Returns the id of the created folder.""" + + body = { + "name": folder_name, + "mimeType": "application/vnd.google-apps.folder" + } + + folder = turb.files.create(body=body, fields='id').execute() + + return folder.get('id') + +def sheets_create(turb, name, folder_id): """Create a new spreadsheet with the given name. Returns a dict with 'id' and 'url' of the spreadsheet """ - spreadsheet = create_spreadsheet(turb, name) + body = { + "name": name, + "parents": [folder_id], + "mimeType": "application/vnd.google-apps.spreadsheet" + } + + spreadsheet = turb.files.create(body=body, fields='id').execute() + id = spreadsheet['id'] + + # The files.create call gives us the ID for our new sheet, but we + # need the URL for it as well. So we get that with the sheets API. + spreadsheet = turb.sheets.get(spreadsheetId=id, + fields='spreadsheetUrl').execute() + url = spreadsheet['spreadsheetUrl'] + + # Finally, we want to also allow anyone with the link to the sheet + # to be able to edit it. + turb.permissions.create(fileId=id, + body={'type': 'anyone', 'role': 'writer'}, + fields='').execute() return { - 'id': spreadsheet['spreadsheetId'], - 'url': spreadsheet['spreadsheetUrl'] + 'id': id, + 'url': url } def create_spreadsheet(turb, name): diff --git a/turbot_lambda/turbot_lambda.py b/turbot_lambda/turbot_lambda.py index 7622d82..1aa428f 100644 --- a/turbot_lambda/turbot_lambda.py +++ b/turbot_lambda/turbot_lambda.py @@ -59,6 +59,7 @@ service = build('drive', 'v3', credentials=gsheets_creds, cache_discovery=False) +files = service.files() permissions = service.permissions() db = boto3.resource('dynamodb') @@ -68,6 +69,7 @@ turb.slack_client = slack_client turb.db = db turb.table = db.Table("turbot") turb.sheets = sheets +turb.files = files turb.permissions = permissions def error(message):