]> git.cworth.org Git - turbot/commitdiff
Implement update of puzzle when edit_puzzle dialog is submitted
authorCarl Worth <cworth@cworth.org>
Sat, 9 Jan 2021 02:44:29 +0000 (18:44 -0800)
committerCarl Worth <cworth@cworth.org>
Sat, 9 Jan 2021 06:14:00 +0000 (22:14 -0800)
Processing all user input and updating the database with the changes.

This isn't _quite_ updating everything in the channel and the sheet
that should be changed. To do that we simply need to refactor the code
that's currently doing that in various places to do it all in one
place.

turbot/blocks.py
turbot/interaction.py

index 4949420ec5210a4b60d634db1733db6b6f62f254..cdce64a2f99aa3b83aa230418e0338f4589e9211 100644 (file)
@@ -33,6 +33,7 @@ def checkbox_block(label, text, name, checked=False):
 
     element = {
         "type": "checkboxes",
 
     element = {
         "type": "checkboxes",
+        "action_id": name,
         "options": [
             {
                 "value": name,
         "options": [
             {
                 "value": name,
index d14c3d4ad07195aeefc916b9e0649ca664b9e98b..8ae4a53556d45542ec19dca22471e46b89f8f702 100644 (file)
@@ -138,7 +138,7 @@ def edit_puzzle(turb, payload):
                 "Puzzle status", "Solved", "solved",
                 checked=(puzzle.get('status', 'unsolved') == 'solved')),
             input_block("Solution", "solution",
                 "Puzzle status", "Solved", "solved",
                 checked=(puzzle.get('status', 'unsolved') == 'solved')),
             input_block("Solution", "solution",
-                        "Solutions (comma-separated if multiple",
+                        "Solution(s) (comma-separated if multiple)",
                         initial_value=solution_str,
                         optional=True),
         ]
                         initial_value=solution_str,
                         optional=True),
         ]
@@ -161,6 +161,75 @@ def edit_puzzle_submission(turb, payload, metadata):
     function above.
     """
 
     function above.
     """
 
+    puzzle={}
+
+    # First, read all the various data from the request
+    meta = json.loads(metadata)
+    puzzle['hunt_id'] = meta['hunt_id']
+    puzzle['SK'] = meta['SK']
+    puzzle['puzzle_id'] = meta['puzzle_id']
+    puzzle['channel_id'] = meta['channel_id']
+    puzzle['channel_url'] = meta['channel_url']
+    puzzle['sheet_url'] = meta['sheet_url']
+
+    state = payload['view']['state']['values']
+
+    puzzle['name'] = state['name']['name']['value']
+    url = state['url']['url']['value']
+    if url:
+        puzzle['url'] = url
+    rounds = [option['value'] for option in
+              state['rounds']['rounds']['selected_options']]
+    if rounds:
+        puzzle['rounds'] = rounds
+    new_rounds = state['new_rounds']['new_rounds']['value']
+    puzzle_state = state['state']['state']['value']
+    if puzzle_state:
+        puzzle['state'] = puzzle_state
+    if state['solved']['solved']['selected_options']:
+        puzzle['status'] = 'solved'
+    else:
+        puzzle['status'] = 'unsolved'
+    puzzle['solution'] = []
+    solution = state['solution']['solution']['value']
+    if solution:
+        puzzle['solution'] = [
+            sol.strip() for sol in solution.split(',')
+        ]
+
+    # Add any new rounds to the database
+    if new_rounds:
+        if 'rounds' not in puzzle:
+            puzzle['rounds'] = []
+        for round in new_rounds.split(','):
+            # Drop any leading/trailing spaces from the round name
+            round = round.strip()
+            # Ignore any empty string
+            if not len(round):
+                continue
+            puzzle['rounds'].append(round)
+            turb.table.put_item(
+                Item={
+                    'hunt_id': puzzle['hunt_id'],
+                    'SK': 'round-' + round
+                }
+            )
+
+    # Update the puzzle in the database
+    turb.table.put_item(Item=puzzle)
+
+    # We need to set the channel topic if any of puzzle name, url,
+    # state, status, or solution, has changed. Let's just do that
+    # unconditionally here.
+
+    # XXX: What we really want here is a single function that sets the
+    # channel name, the channel topic, and the sheet name. That single
+    # function should be called anywhere there is code changing any of
+    # these things. This function could then also accept an optional
+    # "old_puzzle" argument and avoid changing any of those things
+    # that are unnecessary.
+    set_channel_topic(turb, puzzle)
+
     return lambda_ok
 
 def new_hunt(turb, payload):
     return lambda_ok
 
 def new_hunt(turb, payload):