X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=turbot%2Fpuzzle.py;h=037dd5e01b3599dc7cca0b329d18777c2c532eaf;hb=e62996312b2f0372a0ac6683affbddf1275fda4c;hp=8137de7f87399ab4d047c03aa9067335ececbd74;hpb=5a1bf7d220db5d91db52dce48bdf29485eae105b;p=turbot diff --git a/turbot/puzzle.py b/turbot/puzzle.py index 8137de7..037dd5e 100644 --- a/turbot/puzzle.py +++ b/turbot/puzzle.py @@ -6,7 +6,7 @@ from boto3.dynamodb.conditions import Key import turbot.sheets import re -def find_puzzle_for_puzzle_id(turb, hunt_id, puzzle_id): +def find_puzzle_for_sort_key(turb, hunt_id, sort_key): """Given a hunt_id and puzzle_id, return that puzzle Returns None if no puzzle with the given hunt_id and puzzle_id @@ -17,7 +17,7 @@ def find_puzzle_for_puzzle_id(turb, hunt_id, puzzle_id): response = turb.table.get_item( Key={ 'hunt_id': hunt_id, - 'SK': 'puzzle-{}'.format(puzzle_id) + 'SK': sort_key, }) if 'Item' in response: @@ -104,14 +104,14 @@ def puzzle_blocks(puzzle, include_rounds=False): ) # Combining hunt ID and puzzle ID together here is safe because - # both IDs are restricted to not contain a hyphen, (see + # hunt_id is restricted to not contain a hyphen, (see # valid_id_re in interaction.py) - hunt_and_puzzle = "{}-{}".format(puzzle['hunt_id'], puzzle['puzzle_id']) + hunt_and_sort_key = "{}-{}".format(puzzle['hunt_id'], puzzle['SK']) return [ accessory_block( section_block(text_block(puzzle_text)), - button_block("✏", "edit_puzzle", hunt_and_puzzle) + button_block("✏", "edit_puzzle", hunt_and_sort_key) ) ] @@ -167,6 +167,24 @@ def puzzle_matches_all(puzzle, patterns): def puzzle_id_from_name(name): return re.sub(r'[^a-zA-Z0-9_]', '', name).lower() +def puzzle_sort_key(puzzle): + """Return an appropriate sort key for a puzzle in the database + + The sort key must start with "puzzle-" to distinguish puzzle items + in the database from all non-puzzle items. After that, though, the + only requirements are that each puzzle have a unique key and they + give us the ordering we want. And for ordering, we want meta puzzles + before non-meta puzzles and then alphabetical order by name within + each of those groups. + + So puting a "-meta-" prefix in front of the puzzle ID does the trick. + """ + + return "puzzle-{}{}".format( + "-meta-" if puzzle['type'] == "meta" else "", + puzzle['puzzle_id'] + ) + def puzzle_channel_topic(puzzle): """Compute the channel topic for a puzzle"""