From: Carl Worth Date: Sat, 9 Jan 2021 02:44:29 +0000 (-0800) Subject: Implement update of puzzle when edit_puzzle dialog is submitted X-Git-Url: https://git.cworth.org/git?p=turbot;a=commitdiff_plain;h=c6ce6535d35284aad823b9f325e54ddb67ea1f3e Implement update of puzzle when edit_puzzle dialog is submitted 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. --- diff --git a/turbot/blocks.py b/turbot/blocks.py index 4949420..cdce64a 100644 --- a/turbot/blocks.py +++ b/turbot/blocks.py @@ -33,6 +33,7 @@ def checkbox_block(label, text, name, checked=False): element = { "type": "checkboxes", + "action_id": name, "options": [ { "value": name, diff --git a/turbot/interaction.py b/turbot/interaction.py index d14c3d4..8ae4a53 100644 --- a/turbot/interaction.py +++ b/turbot/interaction.py @@ -138,7 +138,7 @@ def edit_puzzle(turb, payload): "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), ] @@ -161,6 +161,75 @@ def edit_puzzle_submission(turb, payload, metadata): 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):