X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=html_generator.py;h=b944391ed2cd15745f57b1c29ac563d889b2893e;hb=88cc255b97357ff671194816186c88b6b42eaccf;hp=9b1b1147bb966012b97aeef4331aefb0899fa27a;hpb=2190ac00d55a00d00f141fc14f0e8a65a47a49dd;p=turbot-web diff --git a/html_generator.py b/html_generator.py index 9b1b114..b944391 100644 --- a/html_generator.py +++ b/html_generator.py @@ -14,20 +14,26 @@ that would be great Requires sorttable.js, which should be included """ -from turbot.channel import channel_url +import boto3 from boto3.dynamodb.conditions import Key +import re website = "https://halibut.cworth.org/" #change this if we're using AWS or some other subdomain instead -def find_hunt_for_hunt_id(turb, hunt_id): +def channel_url(channel_id): + """Given a channel ID, return the URL for that channel.""" + + return "https://halibutthatbass.slack.com/archives/{}".format(channel_id) + +def find_hunt_for_hunt_id(table, hunt_id): """Given a hunt ID find the database item for that hunt Returns None if hunt ID is not found, otherwise a dictionary with all fields from the hunt's row in the table, (channel_id, active, hunt_id, name, url, sheet_url, etc.). """ - response = turb.table.get_item( + response = table.get_item( Key={ 'hunt_id': hunt_id, 'SK': 'hunt-{}'.format(hunt_id) @@ -38,10 +44,10 @@ def find_hunt_for_hunt_id(turb, hunt_id): else: return None -def hunt_puzzles_for_hunt_id(turb, hunt_id): +def hunt_puzzles_for_hunt_id(table, hunt_id): """Return all puzzles that belong to the given hunt_id""" - response = turb.table.query( + response = table.query( KeyConditionExpression=( Key('hunt_id').eq(hunt_id) & Key('SK').begins_with('puzzle-') @@ -59,15 +65,17 @@ def link(lin, text): #internal links, doesn't open new tab return '{}'.format(lin, text) -def hunt_info(turb, hunt): +def hunt_info(table, hunt_id): """ Retrieves list of rounds, puzzles for the given hunt """ + + hunt = find_hunt_for_hunt_id(table, hunt_id) + name = hunt["name"] - hunt_id = hunt["hunt_id"] channel_id = hunt["channel_id"] - puzzles = hunt_puzzles_for_hunt_id(turb, hunt_id) + puzzles = hunt_puzzles_for_hunt_id(table, hunt_id) rounds = set() for puzzle in puzzles: @@ -238,22 +246,22 @@ def round_overview(rnd, puzzles): if puzzle['status'] == 'solved': puzzle_list += [ ' \n', ' {}\n'.format(elink(slack_url, puzzle['name']+meta)), - ' {}\n'.format(elink(puzzle['url'], 'Puzzle')), + ' {}\n'.format(elink(puzzle.get('url',''), 'Puzzle')), ' {}\n'.format(elink(puzzle['sheet_url'], 'Sheet')), ' {}\n'.format(link(website + "_".join(puzzle['name'].split()) + '.html', 'Overview')), ' {}\n'.format(puzzle['solution']), # ' \n', - ' {}\n'.format("".join(puzzle['tags'])), + ' {}\n'.format("".join(puzzle.get('tags',[]))), ' \n'] else: puzzle_list += [ ' \n', ' {}\n'.format(elink(slack_url, puzzle['name']+meta)), - ' {}\n'.format(elink(puzzle['url'], 'Puzzle')), + ' {}\n'.format(elink(puzzle.get('url',''), 'Puzzle')), ' {}\n'.format(elink(puzzle['sheet_url'], 'Sheet')), ' {}\n'.format(link(website + "_".join(puzzle['name'].split()) + '.html', 'Overview')), ' \n', # ' \n', - ' {}\n'.format(" ".join(puzzle['tags'])), + ' {}\n'.format(" ".join(puzzle.get('tags',[]))), ' \n'] end = [' \n', ' \n', @@ -277,7 +285,10 @@ def puzzle_overview(puzzle): else: meta = '' slack_url = channel_url(puzzle['channel_id']) - round_url = [link(website + "_".join(rnd.split()) + "_round.html", rnd) for rnd in puzzle['rounds']] + if 'rounds' in puzzle: + round_url = [link(website + "_".join(rnd.split()) + "_round.html", rnd) for rnd in puzzle['rounds']] + else: + round_url = '' if puzzle['status'] == 'solved': solution = puzzle['solution'] status = 'solved' @@ -300,7 +311,7 @@ def puzzle_overview(puzzle): ' \n', ' \n', ' \n'.format(elink(slack_url, 'Channel')), #slack channel - ' \n'.format(elink(puzzle['url'], 'Puzzle')), + ' \n'.format(elink(puzzle.get('url',''), 'Puzzle')), ' \n'.format(elink(puzzle['sheet_url'], 'Sheet')), ' \n', ' \n', @@ -308,7 +319,7 @@ def puzzle_overview(puzzle): '
{}{}{}{}Additional Resources
\n', ' \n', ' \n'.format(" ".join(round_url)), #round page on our site - ' \n'.format(" ".join(puzzle['tags'])), #add tags + ' \n'.format(" ".join(puzzle.get('tags',[]))), #add tags ' \n', ' \n', ' \n'.format(solution), @@ -319,7 +330,8 @@ def puzzle_overview(puzzle): '\n', '\n', '\n'] - underscored = "_".join(name.split()) + # Replace all spaces and slashes in the name with underscores + underscored = re.sub(r'[ /]', '_', name) file = "{}.html".format(underscored) f = open(file, "w") for line in html: @@ -369,17 +381,20 @@ def puzzle_lists(puzzles, filt): else: meta = '' slack_url = channel_url(puzzle['channel_id']) - round_url = link(website + "_".join(rnd.split()) + "_round.html", puzzle['rounds'][0]) + if 'rounds' in puzzle: + round_url = link(website + "_".join(rnd.split()) + "_round.html", puzzle['rounds'][0]) + else: + round_url = '' #assuming one round per puzzle for now solved_code += [' \n', ' \n'.format(elink(slack_url, puzzle['name']+meta)), - ' \n'.format(elink(puzzle['url'], 'Puzzle')), + ' \n'.format(elink(puzzle.get('url',''), 'Puzzle')), ' \n'.format(elink(puzzle['sheet_url'], 'Sheet')), ' \n'.format(link(website + "_".join(puzzle['name'].split()) + '.html', 'Overview')), ' \n'.format(puzzle['solution']), ' \n'.format(round_url), - ' \n'.format("".join(puzzle['tags'])), + ' \n'.format("".join(puzzle.get('tags',[]))), ' \n'] for puzzle in unsolved_puzzles: if puzzle['type'] == 'meta': @@ -387,17 +402,20 @@ def puzzle_lists(puzzles, filt): else: meta = '' slack_url = channel_url(puzzle['channel_id']) - round_url = link(website + "_".join(rnd.split()) + "_round.html", puzzle['rounds'][0]) + if 'rounds' in puzzle: + round_url = link(website + "_".join(rnd.split()) + "_round.html", puzzle['rounds'][0]) + else: + round_url = '' #assuming one round per puzzle for now unsolved_code += [' \n', ' \n'.format(elink(slack_url, puzzle['name']+meta)), - ' \n'.format(elink(puzzle['url'], 'Puzzle')), + ' \n'.format(elink(puzzle.get('url',''), 'Puzzle')), ' \n'.format(elink(puzzle['sheet_url'], 'Sheet')), ' \n'.format(link(website + "_".join(puzzle['name'].split()) + '.html', 'Overview')), ' \n', ' \n'.format(round_url), - ' \n'.format("".join(puzzle['tags'])), + ' \n'.format("".join(puzzle.get('tags',[]))), ' \n'] end = [' \n', '
Round(s): {}Tags: {}Tags: {}
Answer: {}
{}{}{}{}{}{}{}{}{}
{}{}{}{}{}{}{}{}
\n', @@ -424,10 +442,11 @@ def puzzle_lists(puzzles, filt): f.close() return None +# Initialize AWS resources to talk to database +db = boto3.resource('dynamodb') +table = db.Table("turbot") +puzzles, rounds = hunt_info(table, "mh2021") - -puzzles, rounds = hunt_info(turb, hunt) -#I am not sure where these come from overview(puzzles, rounds) for rnd in rounds: round_overview(rnd, puzzles)