From 84463950bbc2b4b10a2cc84d82285336254d4282 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Sat, 8 Jan 2022 02:12:44 -0800 Subject: [PATCH] Add tags field to the new_puzzle and edit_puzzle forms This completes the puzzle edit form so that all state that can be manipulated with slash commands can also be directly edited with the interactive dialog form. --- turbot/interaction.py | 47 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/turbot/interaction.py b/turbot/interaction.py index d7e8da6..c84afbc 100644 --- a/turbot/interaction.py +++ b/turbot/interaction.py @@ -216,6 +216,10 @@ def edit_puzzle(turb, puzzle, trigger_id): "New round(s) this puzzle belongs to " + "(comma separated)", optional=True), + input_block("Tag(s)", "tags", + "Tags for this puzzle (comma separated)", + initial_value=", ".join(puzzle.get("tags", [])), + optional=True), input_block("State", "state", "State of this puzzle (partial progress, next steps)", initial_value=puzzle.get("state", None), @@ -273,6 +277,7 @@ def edit_puzzle_submission(turb, payload, metadata): if rounds: puzzle['rounds'] = rounds new_rounds = state['new_rounds']['new_rounds']['value'] + tags = state['tags']['tags']['value'] puzzle_state = state['state']['state']['value'] if puzzle_state: puzzle['state'] = puzzle_state @@ -315,6 +320,24 @@ def edit_puzzle_submission(turb, payload, metadata): } ) + # Process any tags + puzzle['tags'] = [] + if tags: + for tag in tags.split(','): + # Drop any leading/trailing spaces from the tag + tag = tag.strip().upper() + # Ignore any empty string + if not len(tag): + continue + # Reject a tag that is not alphabetic or underscore A-Z_ + if not re.match(r'^[A-Z0-9_]*$', tag): + return submission_error( + "tags", + "Error: Tags can only contain letters, numbers, " + + "and the underscore character." + ) + puzzle['tags'].append(tag) + # Get old puzzle from the database (to determine what's changed) old_puzzle = find_puzzle_for_sort_key(turb, puzzle['hunt_id'], @@ -965,7 +988,10 @@ def new_puzzle(turb, body): input_block("New round(s)", "new_rounds", "New round(s) this puzzle belongs to " + "(comma separated)", - optional=True) + optional=True), + input_block("Tag(s)", "tags", + "Tags for this puzzle (comma separated)", + optional=True), ] } @@ -1007,6 +1033,7 @@ def new_puzzle_submission(turb, payload, metadata): else: rounds = [] new_rounds = state['new_rounds']['new_rounds']['value'] + tags = state['tags']['tags']['value'] # Create a Slack-channel-safe puzzle_id puzzle['puzzle_id'] = puzzle_id_from_name(puzzle['name']) @@ -1042,6 +1069,24 @@ def new_puzzle_submission(turb, payload, metadata): } ) + # Process any tags + puzzle['tags'] = [] + if tags: + for tag in tags.split(','): + # Drop any leading/trailing spaces from the tag + tag = tag.strip().upper() + # Ignore any empty string + if not len(tag): + continue + # Reject a tag that is not alphabetic or underscore A-Z_ + if not re.match(r'^[A-Z0-9_]*$', tag): + return submission_error( + "tags", + "Error: Tags can only contain letters, numbers, " + + "and the underscore character." + ) + puzzle['tags'].append(tag) + if rounds: puzzle['rounds'] = rounds -- 2.43.0