else:
return None
-def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[]):
+def hunt_blocks(turb, hunt, puzzle_status='unsolved', search_terms=[],
+ limit_to_rounds=None):
"""Generate Slack blocks for a hunt
The hunt argument should be a dictionary as returned from the
database.
- Two optional arguments can be used to filter which puzzles to
+ Three optional arguments can be used to filter which puzzles to
include in the result:
puzzle_status: If either 'solved' or 'unsolved' only puzzles
state or solution string. Terms can include
regular expression syntax.
+ limit_to_rounds: A list of rounds. If provided only the given
+ rounds will be included in the output. Note:
+ an empty list means to display only puzzles
+ assigned to no rounds, while an argument of
+ None means to display all puzzles with no
+ limit on the rounds.
+
The return value can be used in a Slack command expecting blocks to
provide all the details of a hunt, (puzzles, their state,
solution, links to channels and sheets, etc.).
channel_url(channel_id),
name
)
+ if limit_to_rounds is not None:
+ hunt_text += " *in round{}: {}*".format(
+ "s" if len(limit_to_rounds) > 1 else "",
+ ", ".join(limit_to_rounds) if limit_to_rounds else "<no round>"
+ )
if search_terms:
quoted_terms = ['`{}`'.format(term) for term in search_terms]
hunt_text += " matching {}".format(" AND ".join(quoted_terms))
# Construct blocks for each round
for round in rounds:
- blocks += round_blocks(round, puzzles)
+ if limit_to_rounds is not None and round not in limit_to_rounds:
+ continue
+ # If we're only displaying one round the round header is redundant
+ if limit_to_rounds and len(limit_to_rounds) == 1:
+ blocks += round_blocks(round, puzzles, omit_header=True)
+ else:
+ blocks += round_blocks(round, puzzles)
# Also blocks for any puzzles not in any round
stray_puzzles = [puzzle for puzzle in puzzles if 'rounds' not in puzzle]
- if len(stray_puzzles):
+
+ # For this condition, either limit_to_rounds is None which
+ # means we definitely want to display these stray puzzles
+ # (since we are not limiting), _OR_ limit_to_rounds is not
+ # None but is a zero-length array, meaning we are limiting
+ # to rounds but specifically the round of unassigned puzzles
+ if len(stray_puzzles) and not limit_to_rounds:
stray_text = "*Puzzles with no assigned round*"
blocks.append(section_block(text_block(stray_text)))
for puzzle in stray_puzzles: