Refactor direction backend -> frontend
Some checks failed
Build Formula10 Docker Image / build-docker (push) Failing after 24s
Some checks failed
Build Formula10 Docker Image / build-docker (push) Failing after 24s
This commit is contained in:
@ -2,10 +2,16 @@
|
||||
<html lang="en">
|
||||
|
||||
{# Simple driver dropdown. Requires list of drivers. #}
|
||||
{% macro driver_select(name='', label='') %}
|
||||
{% macro driver_select(name='', label='', include_none=true) %}
|
||||
<div class="form-floating">
|
||||
<select name="{{ name }}" class="form-select" aria-label="{{ name }}">
|
||||
<option value="" selected disabled hidden></option>
|
||||
{% if include_none == true %}
|
||||
{% set drivers = model.all_drivers() %}
|
||||
{% else %}
|
||||
{% set drivers = model.all_drivers_except_none() %}
|
||||
{% endif %}
|
||||
|
||||
{% for driver in drivers %}
|
||||
<option value="{{ driver.name }}">{{ driver.abbr }}</option>
|
||||
{% endfor %}
|
||||
@ -15,12 +21,18 @@
|
||||
{% endmacro %}
|
||||
|
||||
{# Driver dropdown where a value might be preselected. Requires list of drivers. #}
|
||||
{% macro driver_select_with_preselect(match='', name='', label='') %}
|
||||
{% macro driver_select_with_preselect(match='', name='', label='', include_none=true) %}
|
||||
<div class="form-floating">
|
||||
<select name="{{ name }}" class="form-select" aria-label="{{ name }}">
|
||||
{# Use namespace wrapper to persist scope between loop iterations #}
|
||||
{% set user_has_chosen = namespace(driverpre="false") %}
|
||||
|
||||
{% if include_none == true %}
|
||||
{% set drivers = model.all_drivers() %}
|
||||
{% else %}
|
||||
{% set drivers = model.all_drivers_except_none() %}
|
||||
{% endif %}
|
||||
|
||||
{% for driver in drivers %}
|
||||
{% if match == driver.abbr %}
|
||||
{% set user_has_chosen.driverpre = "true" %}
|
||||
@ -44,7 +56,7 @@
|
||||
<div class="form-floating">
|
||||
<select name="{{ name }}" class="form-select" aria-label="{{ name }}">
|
||||
<option value="" selected disabled hidden></option>
|
||||
{% for team in teams %}
|
||||
{% for team in model.all_teams() %}
|
||||
<option value="{{ team.name }}">{{ team.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
@ -59,7 +71,7 @@
|
||||
{# Use namespace wrapper to persist scope between loop iterations #}
|
||||
{% set user_has_chosen = namespace(teampre="false") %}
|
||||
|
||||
{% for team in teams %}
|
||||
{% for team in model.all_teams() %}
|
||||
{% if match == team.name %}
|
||||
{% set user_has_chosen.teampre = "true" %}
|
||||
<option selected="selected" value="{{ team.name }}">{{ team.name }}</option>
|
||||
@ -80,6 +92,7 @@
|
||||
{# Easy nav-bar entries. When a page sets the active_page variable, the current entry will be underlined #}
|
||||
{% macro nav_selector(page='', text='') %}
|
||||
<a class="nav-link text-nowrap" href="{{ page }}">{% if active_page == page %}<u>{% endif %} {{ text }}
|
||||
{# NOTE: This should be set at the top of each template #}
|
||||
{% if active_page == page %}</u>{% endif %}</a>
|
||||
{% endmacro %}
|
||||
|
||||
@ -98,7 +111,7 @@
|
||||
{% block head_extra %}{% endblock head_extra %}
|
||||
|
||||
{# <script defer> #}
|
||||
{# {# Initialize Bootstrap Tooltips #} #}
|
||||
{# {# Initialize Bootstrap Tooltips #}
|
||||
{# console.log("Initializing Tooltips...") #}
|
||||
{# const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') #}
|
||||
{# const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) #}
|
||||
@ -121,8 +134,8 @@
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbarCollapse">
|
||||
<div class="navbar-nav me-2">
|
||||
{{ nav_selector("/race/" ~ active_user.name | default("Everyone"), "Race Picks") }}
|
||||
{{ nav_selector("/season/" ~ active_user.name | default("Everyone"), "Season Picks") }}
|
||||
{{ nav_selector("/race", "Race Picks") }}
|
||||
{{ nav_selector("/season", "Season Picks") }}
|
||||
{{ nav_selector("/graphs", "Statistics") }}
|
||||
{{ nav_selector("/rules", "Rules") }}
|
||||
</div>
|
||||
@ -131,14 +144,14 @@
|
||||
<div class="flex-grow-1"></div>
|
||||
|
||||
<div class="navbar-nav">
|
||||
{{ nav_selector("/enter", "Enter Race Result") }}
|
||||
{{ nav_selector("/users", "Manage Users") }}
|
||||
{{ nav_selector("/result", "Enter Race Result") }}
|
||||
{{ nav_selector("/user", "Manage Users") }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="px-2 pt-2" style="margin-top: 32px;">
|
||||
<div class="px-2 pt-2" style="margin-top: 55px !important;">
|
||||
{% block body %}{% endblock body %}
|
||||
</div>
|
||||
|
||||
|
||||
@ -1,77 +1,70 @@
|
||||
{% extends 'base.jinja' %}
|
||||
|
||||
{% set active_page = "/enter" %}
|
||||
{% set active_user = none %}
|
||||
|
||||
{% block title %}Formula 10 - Race Result{% endblock title %}
|
||||
|
||||
{% set active_page = "/result" %}
|
||||
|
||||
{% block head_extra %}
|
||||
<link href="../static/style/draggable.css" rel="stylesheet">
|
||||
<script src="../static/script/draggable.js" defer></script>
|
||||
{% endblock head_extra %}
|
||||
|
||||
{% set current_race = model.first_race_without_result() %}
|
||||
|
||||
{% block navbar_center %}
|
||||
{% if results | length > 0 %}
|
||||
|
||||
{% if model.all_race_results() | length > 0 %}
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-outline-danger dropdown-toggle" type="button" data-bs-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
{% if activeresult is not none %}{{ activeresult.race.grandprix }}{% else %}
|
||||
{{ race.grandprix }}{% endif %}
|
||||
{% if active_result is not none %}
|
||||
{{ active_result.race.name }}
|
||||
{% else %}
|
||||
{{ current_race.name }}
|
||||
{% endif %}
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" href="/enter/Current">{{ race.grandprix }}</a></li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="/result/{{ current_race.name }}">{{ current_race.name }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
{% for result in results %}
|
||||
<li><a class="dropdown-item"
|
||||
href="/enter/{{ result.race.grandprix }}">{{ result.race.grandprix }}</a>
|
||||
|
||||
{% for result in model.all_race_results() %}
|
||||
<li>
|
||||
<a class="dropdown-item"
|
||||
href="/result/{{ result.race.name }}">{{ result.race.name }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% endblock navbar_center %}
|
||||
|
||||
{% block body %}
|
||||
|
||||
<div class="card shadow-sm" style="width: 450px;">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{% if activeresult is not none %}{{ activeresult.race.grandprix }}{% else %}
|
||||
{{ race.grandprix }}{% endif %}</h5>
|
||||
<div class="grid" style="grid-template-columns: repeat(auto-fit, minmax(450px, 1fr));">
|
||||
|
||||
<form action="/enterresult/
|
||||
{% if activeresult is not none %}{{ activeresult.race.id }}{% else %}{{ race.id }}{% endif %}"
|
||||
method="post">
|
||||
<ul id="columns" class="list-group list-group-flush">
|
||||
{% if activeresult is not none %}
|
||||
{% for driver in activeresult.pxxs.values() %}
|
||||
<li class="list-group-item column p-1" draggable="true">
|
||||
{{ driver.name }}
|
||||
<div class="card shadow-sm" style="width: 450px;">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="d-inline-block float-end">
|
||||
{# Driver DNFed #}
|
||||
<div class="form-check form-check-reverse d-inline-block">
|
||||
<input type="checkbox" class="form-check-input" value="{{ driver.name }}"
|
||||
id="dnf-{{ driver.name }}" name="dnf-drivers"
|
||||
{% if driver in activeresult.dnfs.values() %}checked{% endif %}>
|
||||
<label for="dnf-{{ driver.name }}"
|
||||
class="form-check-label text-muted">DNF</label>
|
||||
</div>
|
||||
<h5 class="card-title">{% if active_result is not none %}{{ active_result.race.name }}{% else %}
|
||||
{{ current_race.name }}{% endif %}</h5>
|
||||
|
||||
{# Driver Excluded #}
|
||||
<div class="form-check form-check-reverse d-inline-block mx-2">
|
||||
<input type="checkbox" class="form-check-input" value="{{ driver.name }}"
|
||||
id="exclude-{{ driver.name }}" name="exclude-drivers"
|
||||
{% if driver in activeresult.excludes %}checked{% endif %}>
|
||||
<label for="exclude-{{ driver.name }}" class="form-check-label text-muted">Exclude</label>
|
||||
</div>
|
||||
</div>
|
||||
<form action="/result-enter/
|
||||
|
||||
{%- if active_result is not none %}{{ active_result.race.name }}{% else %}{{ current_race.name }}{% endif %}"
|
||||
method="post">
|
||||
<ul id="columns" class="list-group list-group-flush">
|
||||
|
||||
{% if active_result is not none %}
|
||||
{% set drivers = active_result.pxx_drivers_values %}
|
||||
{% else %}
|
||||
{% set drivers = model.all_drivers_except_none() %}
|
||||
{% endif %}
|
||||
|
||||
{# Standing order #}
|
||||
<input type="hidden" name="pxxdrivers" value="{{ driver.name }}"></li>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for driver in drivers %}
|
||||
<li class="list-group-item column p-1" draggable="true">
|
||||
{{ driver.name }}
|
||||
@ -80,7 +73,8 @@
|
||||
{# Driver DNFed #}
|
||||
<div class="form-check form-check-reverse d-inline-block">
|
||||
<input type="checkbox" class="form-check-input" value="{{ driver.name }}"
|
||||
id="dnf-{{ driver.name }}" name="dnf-drivers">
|
||||
id="dnf-{{ driver.name }}" name="dnf-drivers"
|
||||
{% if (active_result is not none) and (driver in active_result.dnf_drivers.values()) %}checked{% endif %}>
|
||||
<label for="dnf-{{ driver.name }}"
|
||||
class="form-check-label text-muted">DNF</label>
|
||||
</div>
|
||||
@ -88,20 +82,22 @@
|
||||
{# Driver Excluded #}
|
||||
<div class="form-check form-check-reverse d-inline-block mx-2">
|
||||
<input type="checkbox" class="form-check-input" value="{{ driver.name }}"
|
||||
id="exclude-{{ driver.name }}" name="exclude-drivers">
|
||||
<label for="exclude-{{ driver.name }}" class="form-check-label text-muted">Exclude</label>
|
||||
id="exclude-{{ driver.name }}" name="exclude-drivers"
|
||||
{% if (active_result is not none) and (driver in active_result.excluded_drivers) %}checked{% endif %}>
|
||||
<label for="exclude-{{ driver.name }}"
|
||||
class="form-check-label text-muted">Exclude</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Standing order #}
|
||||
<input type="hidden" name="pxxdrivers" value="{{ driver.name }}"></li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
<input type="submit" class="btn btn-danger mt-2" value="Save">
|
||||
</form>
|
||||
<input type="submit" class="btn btn-danger mt-2 w-100" value="Save">
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -1,26 +1,32 @@
|
||||
{% extends 'base.jinja' %}
|
||||
|
||||
{% set active_page = "/race/" ~ activeuser.name | default("Everyone") %}
|
||||
{% set active_user = activeuser %}
|
||||
|
||||
{% block title %}Formula 10 - Race{% endblock title %}
|
||||
|
||||
{% set active_page = "/race" %}
|
||||
|
||||
{% block navbar_center %}
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-outline-danger dropdown-toggle" type="button" data-bs-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
{% if activeuser is not none %}{{ activeuser.name }}{% else %}Everyone{% endif %}
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" href="/race/Everyone">Everyone</a></li>
|
||||
<li>
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
{% for user in users %}
|
||||
<li><a class="dropdown-item" href="/race/{{ user.name }}">{{ user.name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% if model.all_users() | length > 1 %}
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-outline-danger dropdown-toggle" type="button" data-bs-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
{% if active_user is none %}
|
||||
Everyone
|
||||
{% else %}
|
||||
{{ active_user.name }}
|
||||
{% endif %}
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" href="/race/Everyone">Everyone</a></li>
|
||||
<li>
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
|
||||
{% for user in model.all_users() %}
|
||||
<li><a class="dropdown-item" href="/race/{{ user.name }}">{{ user.name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock navbar_center %}
|
||||
|
||||
{% block body %}
|
||||
@ -30,11 +36,9 @@
|
||||
<tr>
|
||||
<th scope="col" rowspan="2" class="text-center" style="width: 200px;">Race</th>
|
||||
|
||||
{% if activeuser is none %}
|
||||
<th scope="col" colspan="{{ users | length }}" class="text-center">Call</th>
|
||||
{% else %}
|
||||
<th scope="col" class="text-center">Call</th>
|
||||
{% endif %}
|
||||
<th scope="col" {% if active_user is none %}colspan="{{ model.all_users() | length }}"{% endif %}
|
||||
class="text-center">Call
|
||||
</th>
|
||||
|
||||
<th scope="col" rowspan="2" class="text-center" style="width: 200px;">Result</th>
|
||||
</tr>
|
||||
@ -46,35 +50,43 @@
|
||||
<tr>
|
||||
<td> </td>
|
||||
|
||||
{% if activeuser is none %}
|
||||
{% for user in users %}
|
||||
<td class="text-center text-nowrap" style="min-width: 100px;"><a href="/race/{{ user.name }}" class="link-dark">{{ user.name }}</a></td>
|
||||
{% if active_user is none %}
|
||||
{% for user in model.all_users() %}
|
||||
<td class="text-center text-nowrap" style="min-width: 100px;">
|
||||
<a href="/race/{{ user.name }}" class="link-dark">{{ user.name }}</a>
|
||||
</td>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<td class="text-center text-nowrap" style="min-width: 100px;">{{ activeuser.name }}</td>
|
||||
<td class="text-center text-nowrap" style="min-width: 100px;">{{ active_user.name }}</td>
|
||||
{% endif %}
|
||||
|
||||
<td> </td>
|
||||
</tr>
|
||||
|
||||
{% set current_race = model.first_race_without_result() %}
|
||||
|
||||
{# Current Result, only displayed for all users overview #}
|
||||
{% if activeuser is none %}
|
||||
{% if active_user is none %}
|
||||
|
||||
<tr class="table-danger">
|
||||
<td class="text-nowrap">
|
||||
<span class="fw-bold">{{ currentrace.id }}:</span> {{ currentrace.grandprix }}<br>
|
||||
<small><span class="fw-bold">Guess:</span> P{{ currentrace.pxx }}</small>
|
||||
<span class="fw-bold">{{ current_race.number }}:</span> <a href="/result" class="link-dark">{{ current_race.name }}</a><br>
|
||||
<small><span class="fw-bold">Guess:</span> P{{ current_race.pxx }}</small>
|
||||
</td>
|
||||
|
||||
{% for user in users %}
|
||||
<td class="text-center text-nowrap">
|
||||
{% if (currentrace.id in guesses) and (user.name in guesses.get(currentrace.id)) %}
|
||||
{% set pxx = guesses.get(currentrace.id).get(user.name).pxx.abbr %}
|
||||
{% set dnf = guesses.get(currentrace.id).get(user.name).dnf.abbr %}
|
||||
{% for user in model.all_users() %}
|
||||
{% set user_guess = model.race_guesses_by(user_name=user.name, race_name=current_race.name) %}
|
||||
|
||||
<td class="text-center text-nowrap">
|
||||
{% if user_guess is not none %}
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item" style="background-color: inherit;">P{{ currentrace.pxx }}: {{ pxx }}</li>
|
||||
<li class="list-group-item" style="background-color: inherit;">DNF: {{ dnf }}</li>
|
||||
<li class="list-group-item" style="background-color: inherit;">
|
||||
P{{ current_race.pxx }}: {{ user_guess.pxx.abbr }}</li>
|
||||
<li class="list-group-item" style="background-color: inherit;">
|
||||
DNF: {{ user_guess.dnf.abbr }}</li>
|
||||
</ul>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
@ -84,24 +96,24 @@
|
||||
{% endif %}
|
||||
|
||||
{# Enter Guess, only displayed for single user focused view #}
|
||||
{% if activeuser is not none %}
|
||||
{% if active_user is not none %}
|
||||
<tr class="table-danger">
|
||||
<td class="text-nowrap">
|
||||
<span class="fw-bold">{{ currentrace.id }}:</span> {{ currentrace.grandprix }}<br>
|
||||
<small><span class="fw-bold">Guess:</span> P{{ currentrace.pxx }}</small>
|
||||
<span class="fw-bold">{{ current_race.number }}:</span> {{ current_race.name }}<br>
|
||||
<small><span class="fw-bold">Guess:</span> P{{ current_race.pxx }}</small>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<form action="/guessrace/{{ currentrace.id }}/{{ activeuser.name }}" method="post">
|
||||
<form action="/race-guess/{{ current_race.name }}/{{ active_user.name }}" method="post">
|
||||
{% set user_guess = model.race_guesses_by(user_name=active_user.name, race_name=current_race.name) %}
|
||||
|
||||
{# Driver PXX Select #}
|
||||
{{ driver_select_with_preselect(guesses.get(currentrace.id).get(activeuser.name).pxx.abbr if (currentrace.id in guesses and activeuser.name in guesses.get(currentrace.id)) else "",
|
||||
"pxxselect", "P" ~ currentrace.pxx ~ ":") }}
|
||||
{{ driver_select_with_preselect(user_guess.pxx.abbr if user_guess is not none else "", "pxxselect", "P" ~ current_race.pxx ~ ":") }}
|
||||
|
||||
<div class="mt-2"></div>
|
||||
|
||||
{# Driver DNF Select #}
|
||||
<div class="mt-2">
|
||||
{{ driver_select_with_preselect(guesses.get(currentrace.id).get(activeuser.name).dnf.abbr if (currentrace.id in guesses and activeuser.name in guesses.get(currentrace.id)) else "",
|
||||
"dnfselect", "DNF:") }}
|
||||
</div>
|
||||
{{ driver_select_with_preselect(user_guess.dnf.abbr if user_guess is not none else "", "dnfselect", "DNF:") }}
|
||||
|
||||
<input type="submit" class="btn btn-danger mt-2 w-100" value="Save">
|
||||
</form>
|
||||
@ -112,35 +124,40 @@
|
||||
{% endif %}
|
||||
|
||||
{# Past Race Results #}
|
||||
{% for raceresult in raceresults %}
|
||||
{% for past_result in model.all_race_results() %}
|
||||
<tr>
|
||||
<td class="text-nowrap">
|
||||
<span class="fw-bold">{{ raceresult.race.id }}:</span> {{ raceresult.race.grandprix }}<br>
|
||||
<small><span class="fw-bold">Guessed:</span> P{{ raceresult.race.pxx }}</small>
|
||||
<span class="fw-bold">{{ past_result.race.number }}:</span> <a href="/result/{{ past_result.race.name }}" class="link-dark">{{ past_result.race.name }}</a><br>
|
||||
<small><span class="fw-bold">Guessed:</span> P{{ past_result.race.pxx }}</small>
|
||||
</td>
|
||||
|
||||
{% if activeuser is not none %}{% set users = [activeuser] %}{% endif %}
|
||||
{% if active_user is none %}
|
||||
{% set users = model.all_users() %}
|
||||
{% else %}
|
||||
{% set users = [active_user] %}
|
||||
{% endif %}
|
||||
{% for user in users %}
|
||||
<td class="text-center text-nowrap">
|
||||
{% if (raceresult.race_id in guesses) and (user.name in guesses.get(raceresult.race_id)) %}
|
||||
{% set pxx = guesses.get(raceresult.race_id).get(user.name).pxx.abbr %}
|
||||
{% set dnf = guesses.get(raceresult.race_id).get(user.name).dnf.abbr %}
|
||||
{% set user_guess = model.race_guesses_by(user_name=user.name, race_name=past_result.race.name) %}
|
||||
|
||||
{% if user_guess is not none %}
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item {% if pxx == raceresult.pxx.abbr %}text-success fw-bold{% endif %}">
|
||||
P{{ raceresult.race.pxx }}: {{ pxx }}</li>
|
||||
<li class="list-group-item {% if dnf == raceresult.dnf.abbr %}text-success fw-bold{% endif %}">
|
||||
DNF: {{ dnf }}</li>
|
||||
<li class="list-group-item {% if user_guess.pxx.abbr == past_result.pxx.abbr %}text-success fw-bold{% endif %}">
|
||||
P{{ past_result.race.pxx }}: {{ user_guess.pxx.abbr }}</li>
|
||||
<li class="list-group-item {% if user_guess.dnf.abbr == past_result.dnf.abbr %}text-success fw-bold{% endif %}">
|
||||
DNF: {{ user_guess.dnf.abbr }}</li>
|
||||
</ul>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
|
||||
<td class="text-center text-nowrap">
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item">P{{ raceresult.race.pxx }}: {{ raceresult.pxx.abbr }}</li>
|
||||
<li class="list-group-item {% if raceresult.dnf.abbr == 'NON' %}text-muted{% endif %}">
|
||||
DNF: {{ raceresult.dnf.abbr }}</li>
|
||||
<li class="list-group-item">P{{ past_result.race.pxx }}: {{ past_result.pxx.abbr }}</li>
|
||||
<li class="list-group-item {% if past_result.dnf.abbr == 'NON' %}text-muted{% endif %}">
|
||||
DNF: {{ past_result.dnf.abbr }}</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@ -1,82 +1,100 @@
|
||||
{% extends 'base.jinja' %}
|
||||
|
||||
{% set active_page = "/season/" ~ activeuser.name | default("Everyone") %}
|
||||
{% set active_user = activeuser %}
|
||||
|
||||
{% block title %}Formula 10 - Season{% endblock title %}
|
||||
|
||||
{% set active_page = "/season" %}
|
||||
|
||||
{% block navbar_center %}
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-outline-danger dropdown-toggle" type="button" data-bs-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
{% if activeuser is not none %}{{ activeuser.name }}{% else %}Everyone{% endif %}
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" href="/season/Everyone">Everyone</a></li>
|
||||
<li>
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
{% for user in users %}
|
||||
<li><a class="dropdown-item" href="/season/{{ user.name }}">{{ user.name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% if model.all_users() | length > 1 %}
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-outline-danger dropdown-toggle" type="button" data-bs-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
{% if active_user is none %}
|
||||
Everyone
|
||||
{% else %}
|
||||
{{ active_user.name }}
|
||||
{% endif %}
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" href="/season/Everyone">Everyone</a></li>
|
||||
<li>
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
|
||||
{% for user in model.all_users() %}
|
||||
<li><a class="dropdown-item" href="/season/{{ user.name }}">{{ user.name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock navbar_center %}
|
||||
|
||||
{% block body %}
|
||||
|
||||
|
||||
<div class="grid" style="grid-template-columns: repeat(auto-fit, minmax(450px, 1fr));">
|
||||
|
||||
{% if activeuser is not none %}{% set users = [activeuser] %}{% endif %}
|
||||
{% if active_user is none %}
|
||||
{% set users = model.all_users() %}
|
||||
{% else %}
|
||||
{% set users = [active_user] %}
|
||||
{% endif %}
|
||||
{% for user in users %}
|
||||
|
||||
<div class="card mb-2 shadow-sm" style="width: 450px;">
|
||||
<div class="card-body">
|
||||
{% if activeuser is not none %}
|
||||
<h5 class="card-title">{{ user.name }}</h5>
|
||||
{% if active_user is none %}
|
||||
<a href="/season/{{ user.name }}" class="link-dark">
|
||||
<h5 class="card-title">{{ user.name }}</h5>
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/season/{{ user.name }}" class="link-dark"><h5 class="card-title">{{ user.name }}</h5></a>
|
||||
<h5 class="card-title">{{ user.name }}</h5>
|
||||
{% endif %}
|
||||
|
||||
<form action="/guessseason/{{ user.name }}" method="post">
|
||||
{% set user_guess = model.season_guesses_by(user_name=user.name) %}
|
||||
|
||||
<form action="/season-guess/{{ user.name }}" method="post">
|
||||
|
||||
{# Hot Take #}
|
||||
<div class="form-floating">
|
||||
{% if user_guess is not none %}
|
||||
<textarea class="form-control" id="hot-take-input-{{ user.name }}" name="hottakeselect"
|
||||
style="height: 50px">{%- if (user.name in guesses) -%}
|
||||
{{- guesses.get(user.name).hot_take -}}{%- endif -%}</textarea>
|
||||
style="height: 50px">{{ user_guess.hot_take }}</textarea>
|
||||
{% else %}
|
||||
<textarea class="form-control" id="hot-take-input-{{ user.name }}" name="hottakeselect"
|
||||
style="height: 50px"></textarea>
|
||||
{% endif %}
|
||||
|
||||
<label for="hot-take-input-{{ user.name }}" class="text-primary">Hot Take:</label>
|
||||
</div>
|
||||
|
||||
{# P2 Constructor #}
|
||||
<div class="mt-2">
|
||||
{{ team_select_with_preselect(guesses.get(user.name).p2_constructor.name if user.name in guesses else "",
|
||||
{{ team_select_with_preselect(user_guess.p2_team.name if user_guess is not none else "",
|
||||
"p2select", "P2 in WCC:") }}
|
||||
</div>
|
||||
|
||||
{# Most Overtakes + DNFs #}
|
||||
<div class="input-group mt-2">
|
||||
{{ driver_select_with_preselect(guesses.get(user.name).most_overtakes.abbr if user.name in guesses else "",
|
||||
"overtakeselect", "Most overtakes:") }}
|
||||
{{ driver_select_with_preselect(guesses.get(user.name).most_dnfs.abbr if user.name in guesses else "",
|
||||
"dnfselect", "Most DNFs:") }}
|
||||
{{ driver_select_with_preselect(user_guess.overtake_driver.abbr if user_guess is not none else "",
|
||||
"overtakeselect", "Most overtakes:", false) }}
|
||||
{{ driver_select_with_preselect(user_guess.dnf_driver.abbr if user_guess is not none else "",
|
||||
"dnfselect", "Most DNFs:", false) }}
|
||||
</div>
|
||||
|
||||
{# Most Gained + Lost #}
|
||||
<div class="input-group mt-2">
|
||||
{{ driver_select_with_preselect(guesses.get(user.name).most_gained.abbr if user.name in guesses else "",
|
||||
"gainedselect", "Most WDC places gained:") }}
|
||||
{{ driver_select_with_preselect(guesses.get(user.name).most_lost.abbr if user.name in guesses else "",
|
||||
"lostselect", "Most WDC places lost:") }}
|
||||
{{ driver_select_with_preselect(user_guess.gained_driver.abbr if user_guess is not none else "",
|
||||
"gainedselect", "Most WDC places gained:", false) }}
|
||||
{{ driver_select_with_preselect(user_guess.gained_driver.abbr if user_guess is not none else "",
|
||||
"lostselect", "Most WDC places lost:", false) }}
|
||||
</div>
|
||||
|
||||
{# Team-internal Winners #}
|
||||
<h6 class="card-subtitle mt-2">Teammate battle winners:</h6>
|
||||
<div class="grid mt-2" style="width: 450px; row-gap: 0;">
|
||||
{% for team in teams %}
|
||||
{% set driver_a_name = driverpairs.get(team.name)[0].name %}
|
||||
{% set driver_b_name = driverpairs.get(team.name)[1].name %}
|
||||
{% for team in model.all_teams() %}
|
||||
{% set driver_a_name = model.drivers_by(team_name=team.name)[0].name %}
|
||||
{% set driver_b_name = model.drivers_by(team_name=team.name)[1].name %}
|
||||
|
||||
<div class="g-col-6">
|
||||
<div class="form-check form-check-inline">
|
||||
@ -84,7 +102,7 @@
|
||||
name="teamwinner-{{ team.name }}"
|
||||
id="teamwinner-{{ team.name }}-1-{{ user.name }}"
|
||||
value="{{ driver_a_name }}"
|
||||
{% if (user.name in guesses) and (driver_a_name in guesses.get(user.name).team_winners.winner_ids) %}checked="checked"{% endif %}>
|
||||
{% if (user_guess is not none) and (driver_a_name in user_guess.team_winners.teamwinner_driver_names) %}checked="checked"{% endif %}>
|
||||
<label class="form-check-label"
|
||||
for="teamwinner-{{ team.name }}-1-{{ user.name }}">{{ driver_a_name }}</label>
|
||||
</div>
|
||||
@ -96,7 +114,7 @@
|
||||
name="teamwinner-{{ team.name }}"
|
||||
id="teamwinner-{{ team.name }}-2-{{ user.name }}"
|
||||
value="{{ driver_b_name }}"
|
||||
{% if (user.name in guesses) and (driver_b_name in guesses.get(user.name).team_winners.winner_ids) %}checked="checked"{% endif %}>
|
||||
{% if (user_guess is not none) and (driver_b_name in user_guess.team_winners.teamwinner_driver_names) %}checked="checked"{% endif %}>
|
||||
<label class="form-check-label"
|
||||
for="teamwinner-{{ team.name }}-2-{{ user.name }}">{{ driver_b_name }}</label>
|
||||
</div>
|
||||
@ -107,9 +125,9 @@
|
||||
{# Drivers with Podiums #}
|
||||
<h6 class="card-subtitle mt-2">Drivers with podium(s):</h6>
|
||||
<div class="grid mt-2" style="width: 450px; row-gap: 0;">
|
||||
{% for team in teams %}
|
||||
{% set driver_a_name = driverpairs.get(team.name)[0].name %}
|
||||
{% set driver_b_name = driverpairs.get(team.name)[1].name %}
|
||||
{% for team in model.all_teams() %}
|
||||
{% set driver_a_name = model.drivers_by(team_name=team.name)[0].name %}
|
||||
{% set driver_b_name = model.drivers_by(team_name=team.name)[1].name %}
|
||||
|
||||
<div class="g-col-6">
|
||||
<div class="form-check form-check-inline">
|
||||
@ -117,7 +135,7 @@
|
||||
name="podiumdrivers"
|
||||
id="podium-{{ driver_a_name }}-{{ user.name }}"
|
||||
value="{{ driver_a_name }}"
|
||||
{% if (user.name in guesses) and (driver_a_name in guesses.get(user.name).podium_drivers.podium_ids) %}checked="checked"{% endif %}>
|
||||
{% if (user_guess is not none) and (driver_a_name in user_guess.podium_drivers.podium_driver_names) %}checked="checked"{% endif %}>
|
||||
<label class="form-check-label"
|
||||
for="podium-{{ driver_a_name }}-{{ user.name }}">{{ driver_a_name }}</label>
|
||||
</div>
|
||||
@ -129,7 +147,7 @@
|
||||
name="podiumdrivers"
|
||||
id="podium-{{ driver_b_name }}-{{ user.name }}"
|
||||
value="{{ driver_b_name }}"
|
||||
{% if (user.name in guesses) and (driver_b_name in guesses.get(user.name).podium_drivers.podium_ids) %}checked="checked"{% endif %}>
|
||||
{% if (user_guess is not none) and (driver_b_name in user_guess.podium_drivers.podium_driver_names) %}checked="checked"{% endif %}>
|
||||
<label class="form-check-label"
|
||||
for="podium-{{ driver_b_name }}-{{ user.name }}">{{ driver_b_name }}</label>
|
||||
</div>
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
{% extends 'base.jinja' %}
|
||||
|
||||
{% set active_page = "/users" %}
|
||||
{% set active_user = none %}
|
||||
|
||||
{% block title %}Formula 10 - Users{% endblock title %}
|
||||
|
||||
@ -11,7 +10,7 @@
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Add User</h5>
|
||||
|
||||
<form action="/adduser" method="post">
|
||||
<form action="/user-add" method="post">
|
||||
<div class="input-group">
|
||||
<div class="form-floating">
|
||||
<input type="text" class="form-control" id="select-add-user" name="select-add-user"
|
||||
@ -42,7 +41,7 @@
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Delete user</h5>
|
||||
|
||||
<form action="/deleteuser" method="post">
|
||||
<form action="/user-delete" method="post">
|
||||
<div class="input-group">
|
||||
<select class="form-control form-select" aria-label="select-delete-user"
|
||||
name="select-delete-user">
|
||||
@ -73,10 +72,10 @@
|
||||
<h5 class="card-title">Functions that should not be public</h5>
|
||||
<h6 class="card-subtitle mb-2">(Fuck you if you click this without knowing what it does)</h6>
|
||||
|
||||
<a class="btn btn-outline-danger" href="/saveall">Save all data</a>
|
||||
<a class="btn btn-outline-danger" href="/loadall">Load all data</a>
|
||||
<a class="btn btn-outline-danger" href="/loadstatic">Load static data</a>
|
||||
<a class="btn btn-outline-danger" href="/loaddynamic">Load dynamic data</a>
|
||||
<a class="btn btn-outline-danger" href="/save/all">Save all data</a>
|
||||
<a class="btn btn-outline-danger" href="/load/all">Load all data</a>
|
||||
<a class="btn btn-outline-danger" href="/load/static">Load static data</a>
|
||||
<a class="btn btn-outline-danger" href="/load/dynamic">Load dynamic data</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user