diff --git a/competition_page.py b/competition_page.py index 28de93fe823dd99c8bd8cc95faafc77b569d8a49..845173f6b4c7c895f3808790942d99164a04290b 100644 --- a/competition_page.py +++ b/competition_page.py @@ -25,6 +25,17 @@ def get_competition_page_html(self, competition_id): color: #333; animation: fadeInUp 0.5s ease-out forwards; }} + h2 {{ + margin-top: 40px; + margin-bottom: 20px; + }} + h3 {{ + color: #555; + font-weight: normal; + font-size: 16px; + margin: 0; + animation: fadeInUp 0.5s ease-out forwards; + }} table {{ border-collapse: collapse; width: 100%; @@ -212,13 +223,13 @@ def get_competition_page_html(self, competition_id): <div style="margin-bottom: 12px; margin-top: 16px; text-align: center">sponsored by:</div> <div class="sponsoring-flex"> <div class="sponsor"> - <a href="https://murtfeldt.de" target="_blank"><img src="../murtfeldt.png" alt="Logo of Murtfeldt Kunststoffe"></a> + <a href="https://murtfeldt.de" target="_blank"><img src="../../murtfeldt.png" alt="Logo of Murtfeldt Kunststoffe"></a> </div> <div class="sponsor"> - <a href="https://www.kordel.de" target="_blank"><img src="../kordel.png" alt="Logo of Kordel"></a> + <a href="https://www.kordel.de" target="_blank"><img src="../../kordel.png" alt="Logo of Kordel"></a> </div> <div class="sponsor"> - <a href="https://www.vulcanus-stahl.de/" target="_blank"><img src="../vulcanus.png" alt="Logo of Vulcanus Stahl"></a> + <a href="https://www.vulcanus-stahl.de/" target="_blank"><img src="../../vulcanus.png" alt="Logo of Vulcanus Stahl"></a> </div> </div> </div> diff --git a/main.py b/main.py index 684ae6aae0fcb89ad13ef690a86ee54f9b7cba96..9d7f04ab9ed01dfcdac05d042cb071740450f27b 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,7 @@ import csv import math import multiprocessing as mp import os -from datetime import datetime +from datetime import datetime, timedelta import matplotlib.patches as patches import matplotlib.pyplot as plt @@ -242,14 +242,12 @@ class EloSystem: """Generate static HTML website with Elo ratings and visualizations""" # If num_processes not specified, use number of CPU cores - num_processes = int(mp.cpu_count()) + num_processes = int(mp.cpu_count() / 2) print(f"staring computation on {num_processes} cores") pool = mp.Pool(processes=num_processes) - self.create_world_ranking() - - #for competition in self.competition_history: - # self.create_competition_page(competition) + self.create_world_ranking(True) + self.create_world_ranking(False) pool.map(self.create_competition_page, self.competition_history) @@ -261,14 +259,22 @@ class EloSystem: print(f"Website generated in {self.output_directory}") - def create_world_ranking(self): + def create_world_ranking(self, include_legacy): """Create the index.html page for the vehicle type""" # Sort teams by Elo rating sorted_teams = sorted(self.teams.items(), key=lambda x: x[1]['elo'], reverse=True) - html_content = get_world_ranking_html(self, sorted_teams) + if not include_legacy: + sorted_teams_active = [] + for index, team in enumerate(sorted_teams): + date_last_comp = datetime.strptime(team[1]['history'][-1]['date'], "%Y-%m-%d") + if date_last_comp > datetime.now() - timedelta(days=3*365): + sorted_teams_active.append(team) + sorted_teams = sorted_teams_active + html_content = get_world_ranking_html(self, sorted_teams, include_legacy) # Write the HTML file - with open(os.path.join(self.output_directory, 'index.html'), 'w', encoding='utf-8') as f: + filename = 'index.html' if not include_legacy else 'legacy.html' + with open(os.path.join(self.output_directory, filename), 'w', encoding='utf-8') as f: f.write(html_content) def create_team_page(self, team_name): diff --git a/public/active_combustion.svg b/public/active_combustion.svg new file mode 100644 index 0000000000000000000000000000000000000000..cca045bf4cc7fe4be5f88df595f8512c4a805c5e --- /dev/null +++ b/public/active_combustion.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="74.407852mm" + height="41.717289mm" + viewBox="0 0 74.407852 41.717289" + version="1.1" + id="svg1" + xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs1"><linearGradient + id="linearGradient11"><stop + style="stop-color:#ff8c00;stop-opacity:1;" + offset="0" + id="stop11" /><stop + style="stop-color:#ff4500;stop-opacity:1;" + offset="1" + id="stop12" /></linearGradient><linearGradient + xlink:href="#linearGradient11" + id="linearGradient12" + x1="235.32404" + y1="248.5153" + x2="182.70973" + y2="301.12961" + gradientUnits="userSpaceOnUse" /></defs><g + id="layer1" + transform="translate(-171.81296,-253.96382)"><path + id="path7" + style="fill:url(#linearGradient12);stroke:none;stroke-width:0.853556" + d="m 193.53566,253.96382 v 0.002 a 21.749203,20.858521 0 0 0 -21.7227,20.85616 21.749203,20.858521 0 0 0 21.7227,20.85713 v 0.002 h 30.89889 v -0.003 a 21.749203,20.858521 0 0 0 0.0372,0.003 21.749203,20.858521 0 0 0 21.74906,-20.85868 21.749203,20.858521 0 0 0 -21.74906,-20.85816 21.749203,20.858521 0 0 0 -0.0372,0.003 v -0.003 z" /><ellipse + style="fill:#ffffff;stroke:none;stroke-width:0.651177" + id="ellipse8" + cx="224.4718" + cy="274.82217" + rx="16.592436" + ry="15.912936" /></g></svg> diff --git a/public/active_electric.svg b/public/active_electric.svg new file mode 100644 index 0000000000000000000000000000000000000000..a6d436172600ab05b53aeec7fe4d494d3e8fb516 --- /dev/null +++ b/public/active_electric.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="74.407852mm" + height="41.717289mm" + viewBox="0 0 74.407852 41.717289" + version="1.1" + id="svg1" + xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs1"><linearGradient + id="linearGradient9"><stop + style="stop-color:#ffc400;stop-opacity:1;" + offset="0" + id="stop9" /><stop + style="stop-color:#ffff1e;stop-opacity:1;" + offset="1" + id="stop10" /></linearGradient><linearGradient + xlink:href="#linearGradient9" + id="linearGradient10" + x1="235.32405" + y1="242.92863" + x2="182.7097" + y2="190.31429" + gradientUnits="userSpaceOnUse" /></defs><g + id="layer1" + transform="translate(-171.81296,-195.76281)"><path + id="path5" + style="fill:url(#linearGradient10);stroke:none;stroke-width:0.854;stroke-dasharray:none" + d="m 193.53566,195.76281 v 0.002 a 21.749203,20.858521 0 0 0 -21.7227,20.85616 21.749203,20.858521 0 0 0 21.7227,20.85713 v 0.002 h 30.89889 v -0.003 a 21.749203,20.858521 0 0 0 0.0372,0.003 21.749203,20.858521 0 0 0 21.74906,-20.85868 21.749203,20.858521 0 0 0 -21.74906,-20.85816 21.749203,20.858521 0 0 0 -0.0372,0.003 v -0.003 z" /><ellipse + style="fill:#ffffff;stroke:none;stroke-width:0.651177" + id="ellipse6" + cx="224.4718" + cy="216.62117" + rx="16.592436" + ry="15.912936" /></g></svg> diff --git a/public/inactive.svg b/public/inactive.svg new file mode 100644 index 0000000000000000000000000000000000000000..2c6b9fdd40d9e9dd3af8bd15045ba90c64e5b673 --- /dev/null +++ b/public/inactive.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="74.407852mm" + height="41.717289mm" + viewBox="0 0 74.407852 41.717289" + version="1.1" + id="svg1" + xml:space="preserve" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs1" /><g + id="layer1" + transform="translate(-62.654839,-195.76281)"><path + id="path4" + style="fill:#777777;fill-opacity:1;stroke:none;stroke-width:0.853556" + d="m 84.377545,195.76281 v 0.002 A 21.749203,20.858521 0 0 0 62.65484,216.62097 21.749203,20.858521 0 0 0 84.377545,237.4781 v 0.002 h 30.898885 v -0.003 a 21.749203,20.858521 0 0 0 0.0372,0.003 21.749203,20.858521 0 0 0 21.74906,-20.85868 21.749203,20.858521 0 0 0 -21.74906,-20.85816 21.749203,20.858521 0 0 0 -0.0372,0.003 v -0.003 z" /><ellipse + style="fill:#ffffff;stroke:none;stroke-width:0.651177" + id="ellipse5" + cx="84.403786" + cy="216.62117" + rx="16.592436" + ry="15.912936" /></g></svg> diff --git a/team_page.py b/team_page.py index 34b51571b679e43806e31834be789d4d87d42a5f..e476ddb87e01893768b0c2bb137de214d7dfcce5 100644 --- a/team_page.py +++ b/team_page.py @@ -172,6 +172,7 @@ def get_team_page_html(self, team_name, team_data, team_competitions): </div> <h2>Competition History</h2> + <p>Rank includes legacy teams</p> <div style="overflow-x: scroll;"> <table> <tr> diff --git a/toggle_buttons.svg b/toggle_buttons.svg new file mode 100644 index 0000000000000000000000000000000000000000..a3da600a0ef7097849c2577561396644ed1278ae --- /dev/null +++ b/toggle_buttons.svg @@ -0,0 +1,145 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="74.407852mm" + height="41.717289mm" + viewBox="0 0 74.407852 41.717289" + version="1.1" + id="svg1" + xml:space="preserve" + inkscape:version="1.4 (86a8ad7, 2024-10-11)" + sodipodi:docname="toggle_buttons.svg" + inkscape:export-filename="inactive.svg" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + inkscape:zoom="1.0592242" + inkscape:cx="-270.48098" + inkscape:cy="-100.54529" + inkscape:window-width="2560" + inkscape:window-height="1369" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="layer1" + inkscape:export-bgcolor="#ffffff00"><inkscape:page + x="0" + y="0" + width="74.407852" + height="41.717289" + id="page12" + margin="0" + bleed="0" /><inkscape:page + x="-109.15812" + y="-58.201008" + width="74.407852" + height="41.717289" + id="page13" + margin="0" + bleed="0" + inkscape:export-filename="Seite 3.svg" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" /><inkscape:page + x="0" + y="-58.201008" + width="74.407852" + height="41.717289" + id="page14" + margin="0" + bleed="0" + inkscape:export-filename="public\active_electric.svg" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" /></sodipodi:namedview><defs + id="defs1"><linearGradient + id="linearGradient11" + inkscape:collect="always"><stop + style="stop-color:#ff8c00;stop-opacity:1;" + offset="0" + id="stop11" /><stop + style="stop-color:#ff4500;stop-opacity:1;" + offset="1" + id="stop12" /></linearGradient><linearGradient + id="linearGradient9" + inkscape:collect="always"><stop + style="stop-color:#ffc400;stop-opacity:1;" + offset="0" + id="stop9" /><stop + style="stop-color:#ffff1e;stop-opacity:1;" + offset="1" + id="stop10" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient9" + id="linearGradient10" + x1="235.32405" + y1="242.92863" + x2="182.7097" + y2="190.31429" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient11" + id="linearGradient12" + x1="235.32404" + y1="248.5153" + x2="182.70973" + y2="301.12961" + gradientUnits="userSpaceOnUse" /></defs><g + inkscape:label="Ebene 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-171.81296,-253.96382)"><path + id="ellipse3" + style="fill:#00ff00;stroke:none;stroke-width:0.853556" + d="m 86.320453,121.22579 v 0.002 a 21.749203,20.858521 0 0 0 -21.722705,20.85661 21.749203,20.858521 0 0 0 21.722705,20.85713 v 0.002 h 30.898887 v -0.003 a 21.749203,20.858521 0 0 0 0.0372,0.003 21.749203,20.858521 0 0 0 21.74906,-20.85868 21.749203,20.858521 0 0 0 -21.74906,-20.85816 21.749203,20.858521 0 0 0 -0.0372,0.003 v -0.003 z" /><ellipse + style="fill:#ff0000;stroke:none;stroke-width:0.651177" + id="ellipse1" + cx="117.2566" + cy="142.08415" + rx="16.592436" + ry="15.912936" /><ellipse + style="fill:#ff0000;stroke:none;stroke-width:0.651177" + id="ellipse2" + cx="86.346695" + cy="142.08415" + rx="16.592436" + ry="15.912936" /><path + id="path4" + style="fill:#777777;fill-opacity:1;stroke:none;stroke-width:0.853556" + d="m 84.377545,195.76281 v 0.002 A 21.749203,20.858521 0 0 0 62.65484,216.62097 21.749203,20.858521 0 0 0 84.377545,237.4781 v 0.002 h 30.898885 v -0.003 a 21.749203,20.858521 0 0 0 0.0372,0.003 21.749203,20.858521 0 0 0 21.74906,-20.85868 21.749203,20.858521 0 0 0 -21.74906,-20.85816 21.749203,20.858521 0 0 0 -0.0372,0.003 v -0.003 z" /><ellipse + style="fill:#ffffff;stroke:none;stroke-width:0.651177" + id="ellipse5" + cx="84.403786" + cy="216.62117" + rx="16.592436" + ry="15.912936" /><path + id="path5" + style="fill:url(#linearGradient10);stroke:none;stroke-width:0.854;stroke-dasharray:none" + d="m 193.53566,195.76281 v 0.002 a 21.749203,20.858521 0 0 0 -21.7227,20.85616 21.749203,20.858521 0 0 0 21.7227,20.85713 v 0.002 h 30.89889 v -0.003 a 21.749203,20.858521 0 0 0 0.0372,0.003 21.749203,20.858521 0 0 0 21.74906,-20.85868 21.749203,20.858521 0 0 0 -21.74906,-20.85816 21.749203,20.858521 0 0 0 -0.0372,0.003 v -0.003 z" /><ellipse + style="fill:#ffffff;stroke:none;stroke-width:0.651177" + id="ellipse6" + cx="224.4718" + cy="216.62117" + rx="16.592436" + ry="15.912936" /><path + id="path7" + style="fill:url(#linearGradient12);stroke:none;stroke-width:0.853556" + d="m 193.53566,253.96382 v 0.002 a 21.749203,20.858521 0 0 0 -21.7227,20.85616 21.749203,20.858521 0 0 0 21.7227,20.85713 v 0.002 h 30.89889 v -0.003 a 21.749203,20.858521 0 0 0 0.0372,0.003 21.749203,20.858521 0 0 0 21.74906,-20.85868 21.749203,20.858521 0 0 0 -21.74906,-20.85816 21.749203,20.858521 0 0 0 -0.0372,0.003 v -0.003 z" /><ellipse + style="fill:#ffffff;stroke:none;stroke-width:0.651177" + id="ellipse8" + cx="224.4718" + cy="274.82217" + rx="16.592436" + ry="15.912936" /></g></svg> diff --git a/world_ranking_list.py b/world_ranking_list.py index 624fb81cbdbd0de5ce11de3b6fc1ffed76dd1a22..f46695bab336d2092d8fe16f42c81fe66cdf940e 100644 --- a/world_ranking_list.py +++ b/world_ranking_list.py @@ -1,7 +1,7 @@ from datetime import datetime from tools import clean_filename -def get_world_ranking_html(self, sorted_teams): +def get_world_ranking_html(self, sorted_teams, is_legacy): html_content = f"""<!DOCTYPE html> <html lang="en"> <head> @@ -238,6 +238,49 @@ def get_world_ranking_html(self, sorted_teams): .nav-button:hover::before {{ left: 100%; }} + + .team-header {{ + display: flex; + justify-content: space-between; + align-items: center; + }} + + .align-horizontally {{ + display: inline-grid; + grid-template-columns: auto auto; + place-items: center; + gap: 10px + }} + + .tooltip {{ + position: relative; + display: inline-block; + cursor: pointer; + }} + + .tooltip .tooltiptext {{ + visibility: hidden; + width: 200px; + background-color: black; + color: #fff; + text-align: center; + border-radius: 5px; + padding: 5px; + position: absolute; + z-index: 1; + top: 125%; /* Position the tooltip above the text */ + left: 20%; + margin-left: -60px; + opacity: 0; + transition: opacity 0.3s; + }} + + .tooltip:hover .tooltiptext {{ + visibility: visible; + opacity: 1; + text-transform: none; + font-weight: normal; + }} @keyframes fadeInUp {{ from {{ @@ -257,7 +300,7 @@ def get_world_ranking_html(self, sorted_teams): <p>Rankings based on {len(self.competition_history)} competitions.</p> <div class="sponsoring-container"> - <div style="margin-bottom: 12px; margin-top: 16px; text-align: center">sponsored by:</div> + <div style="margin-bottom: 12px; margin-top: 16px; text-align: center; color: #555">sponsored by:</div> <div class="sponsoring-flex"> <div class="sponsor"> <a href="https://murtfeldt.de" target="_blank"><img src="../murtfeldt.png" alt="Logo of Murtfeldt Kunststoffe"></a> @@ -276,7 +319,17 @@ def get_world_ranking_html(self, sorted_teams): <table> <tr> <th></th> - <th>Team</th> + <th><div class="team-header"> + <div>Team</div> + <div class="tooltip"> + <a href={"index.html" if is_legacy else "legacy.html"} style="cursor: pointer;"> + <div class="align-horizontally" style="text-transform: none; font-weight: normal;"> + hide legacy teams <img src="../{"inactive" if is_legacy else "active_" + self.competition_type}.svg" height="20px" alt="toggle switch"> + </div> + </a> + <span class="tooltiptext">legacy teams are those who haven't competed in 3 years</span> + </div> + </div></th> <th>Elo Rating</th> <th>Competitions</th> </tr>