+def find_puzzle_for_puzzle_id(turb, hunt_id, puzzle_id):
+ """Given a hunt_id and puzzle_id, return that puzzle
+
+ Returns None if no puzzle with the given hunt_id and puzzle_id
+ exists in the database, otherwise a dictionary with all fields
+ from the puzzle's row in the database.
+
+ Note: The sort_key is a modified version of the puzzle_id, (used
+ to make metapuzzles appear in the ordering before non-metapuzzles).
+ If you've been handed a sort_key, then looking up a puzzle by
+ sort_key is the right thing to do. But if you instead have just
+ a puzzle_id, see find_puzzle_for_puzzle_id rather than trying
+ to convert the puzzle_id into a sort_key to use this function.
+ """
+
+ response = turb.table.query(
+ IndexName='puzzle_id_index',
+ KeyConditionExpression=(
+ Key('hunt_id').eq(hunt_id) &
+ Key('puzzle_id').eq(puzzle_id)
+ )
+ )
+
+ if response['Count'] == 0:
+ return None
+
+ return response['Items'][0]
+