]> git.cworth.org Git - turbot/commitdiff
Use the Google drive API to create a hunt's sheet within a folder
authorCarl Worth <cworth@cworth.org>
Sun, 10 Jan 2021 17:52:27 +0000 (09:52 -0800)
committerCarl Worth <cworth@cworth.org>
Sun, 10 Jan 2021 21:14:08 +0000 (13:14 -0800)
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).

turbot/events.py
turbot/sheets.py
turbot_lambda/turbot_lambda.py

index cae4ccfbb86b98bc07a4264b209b2e62974c73c6..8f9f12c4d4d130c45ed57f9dafa19b258587cf82 100644 (file)
@@ -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
index df2e4e9b10828068048f752b1b57bf3ed9912c63..831998d6f52c581c71b21d3b3daf67c475003d78 100644 (file)
@@ -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):
index 7622d82e46168cde94a539d42850d220d3866616..1aa428fa95c0740d05c8aa3368877479a07f66ea 100644 (file)
@@ -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):