Implement adding race guesses

This commit is contained in:
2024-02-14 17:10:19 +01:00
parent 1dc995663e
commit a2ab82b092
4 changed files with 166 additions and 88 deletions

View File

@ -32,31 +32,62 @@ def save():
def race():
users = User.query.all()
raceresults = RaceResult.query.all()
drivers = Driver.query.all()
guesses = dict()
guesses = dict() # The guesses for which raceresults exist
nextguesses = dict() # The guesses that are still open for modification
for raceresult in raceresults:
guesses[raceresult.race_id] = dict()
for guess in RaceGuess.query.all():
guesses[guess.race_id][guess.user_id] = guess
if guess.race_id in guesses:
guesses[guess.race_id][guess.user_id] = guess
else:
nextguesses[guess.user_id] = guess
# TODO: Getting by ID might be stupid, get by date instead?
nextid = raceresults[-1].race_id + 1 if len(raceresults) > 0 else 1
nextrace = Race.query.filter_by(id=nextid).first()
return render_template("race.jinja",
users=users,
drivers=drivers,
raceresults=raceresults,
guesses=guesses)
guesses=guesses,
nextguesses=nextguesses,
nextrace=nextrace)
# @app.route("/teams", methods=["GET", "POST"])
# def teams():
# if request.method == "POST":
# new_team = Team(
# name = request.form["name"],
# country_code = request.form["country_code"]
# )
# print(new_team.name, new_team.country_code)
# db.session.add(new_team)
# db.session.commit()
#
# return render_template("teams.jinja", page="teams")
@app.route("/guessrace/<raceid>/<username>", methods=["POST"])
def guessrace(raceid, username):
pxx = request.form.get("pxxselect")
dnf = request.form.get("dnfselect")
if pxx is None or dnf is None:
return redirect("/race")
raceguess: RaceGuess | None = RaceGuess.query.filter_by(user_id=username, race_id=raceid).first()
if raceguess is not None:
raceguess.pxx_id = pxx
raceguess.dnf_id = dnf
else:
raceguess = RaceGuess()
raceguess.user_id = username
raceguess.race_id = raceid
raceguess.pxx_id = pxx
raceguess.dnf_id = dnf
db.session.add(raceguess)
db.session.commit()
return redirect("/race")
@app.route("/enterresult")
def enterresult():
return render_template("enterresult.jinja")
if __name__ == "__main__":

View File

@ -1,24 +1,24 @@
id,grandprix,number,date
1,Bahrain,1,2023-03-05
2,Saudi Arabia,2,2023-03-19
3,Melbourne,3,2023-04-02
4,Baku,4,2023-04-30
5,Miami,5,2023-05-07
6,Imola,6,2023-05-21
7,Monaco,7,2023-05-28
8,Barcelona,8,2023-06-04
9,Montreal,9,2023-06-18
10,Spielberg,10,2023-07-02
11,Silverstone,11,2023-07-09
12,Budapest,12,2023-07-23
13,Spa,13,2023-07-30
14,Zandvoort,14,2023-08-27
15,Monza,15,2023-09-03
16,Singapore,16,2023-09-17
17,Suzuka,17,2023-09-24
18,Qatar,18,2023-10-08
19,Austin,19,2023-10-22
20,Mexico,20,2023-10-29
21,Brazil,21,2023-11-05
22,Las Vegas,22,2023-11-18
23,Abu Dhabi,23,2023-11-26
id,grandprix,number,date,pxx
1,Bahrain,1,2023-03-05,3
2,Saudi Arabia,2,2023-03-19,17
3,Melbourne,3,2023-04-02,5
4,Baku,4,2023-04-30,6
5,Miami,5,2023-05-07,15
6,Imola,6,2023-05-21,8
7,Monaco,7,2023-05-28,9
8,Barcelona,8,2023-06-04,13
9,Montreal,9,2023-06-18,11
10,Spielberg,10,2023-07-02,12
11,Silverstone,11,2023-07-09,18
12,Budapest,12,2023-07-23,12
13,Spa,13,2023-07-30,13
14,Zandvoort,14,2023-08-27,3
15,Monza,15,2023-09-03,6
16,Singapore,16,2023-09-17,10
17,Suzuka,17,2023-09-24,11
18,Qatar,18,2023-10-08,3
19,Austin,19,2023-10-22,11
20,Mexico,20,2023-10-29,17
21,Brazil,21,2023-11-05,14
22,Las Vegas,22,2023-11-18,8
23,Abu Dhabi,23,2023-11-26,5
1 id grandprix number date pxx
2 1 Bahrain 1 2023-03-05 3
3 2 Saudi Arabia 2 2023-03-19 17
4 3 Melbourne 3 2023-04-02 5
5 4 Baku 4 2023-04-30 6
6 5 Miami 5 2023-05-07 15
7 6 Imola 6 2023-05-21 8
8 7 Monaco 7 2023-05-28 9
9 8 Barcelona 8 2023-06-04 13
10 9 Montreal 9 2023-06-18 11
11 10 Spielberg 10 2023-07-02 12
12 11 Silverstone 11 2023-07-09 18
13 12 Budapest 12 2023-07-23 12
14 13 Spa 13 2023-07-30 13
15 14 Zandvoort 14 2023-08-27 3
16 15 Monza 15 2023-09-03 6
17 16 Singapore 16 2023-09-17 10
18 17 Suzuka 17 2023-09-24 11
19 18 Qatar 18 2023-10-08 3
20 19 Austin 19 2023-10-22 11
21 20 Mexico 20 2023-10-29 17
22 21 Brazil 21 2023-11-05 14
23 22 Las Vegas 22 2023-11-18 8
24 23 Abu Dhabi 23 2023-11-26 5

View File

@ -24,12 +24,14 @@ class Race(db.Model):
self.grandprix = str(row[1])
self.number = int(row[2])
self.date = datetime.strptime(row[3], "%Y-%m-%d")
self.pxx = int(row[4])
return self
id: Mapped[int] = mapped_column(Integer, primary_key=True)
grandprix: Mapped[str] = mapped_column(String(32))
number: Mapped[int] = mapped_column(Integer)
date: Mapped[datetime] = mapped_column(DateTime)
pxx: Mapped[int] = mapped_column(Integer)
class Team(db.Model):
@ -303,7 +305,7 @@ class RaceGuess(db.Model):
self.dnf_id = str(row[4])
return self
def to_csv(self, writer):
def to_csv(self):
return [
self.id,
self.user_id,
@ -330,9 +332,12 @@ class SeasonGuess(db.Model):
__csv_header__ = ["id", "user_id", "hot_take"]
def from_csv(self, row):
self.id = int(row[0])
self.user_id = str(row[1])
self.hot_take = str(row[2])
return self
def to_csv(self, writer):
def to_csv(self):
return [
self.id,
self.user_id,

View File

@ -1,62 +1,104 @@
{% extends 'base.jinja' %}
{% set active_page = "raceguessresults" %}
{% set active_page = "race" %}
{% block title %}Formula 10{% endblock title %}
{% block body %}
<table class="table table-bordered">
<thead>
<tr>
<th scope="col" rowspan="3" class="text-center">Race</th>
<th scope="col" colspan="{{ users | length * 2 }}" class="text-center">Call</th>
<th scope="col" rowspan="2" colspan="2" class="text-center">Result</th>
</tr>
</thead>
<tbody>
{# Users List #}
<tr>
<td>&nbsp;</td>
{% for user in users %}
<td colspan="2" class="text-center">{{ user.name }}</td>
{% endfor %}
<td colspan="2">&nbsp;</td>
</tr>
{# P10/DNF Header #}
<tr>
<td>&nbsp;</td>
{% for user in users %}
<td class="text-center">P10</td>
<td class="text-center">DNF</td>
{% endfor %}
<td class="text-center">P10</td>
<td class="text-center">DNF</td>
</tr>
{# Race Results #}
{% for raceresult in raceresults %}
<table class="table table-bordered">
<thead>
<tr>
<td>{{ raceresult.race.grandprix }}</td>
<th scope="col" rowspan="2" class="text-center">Race</th>
<th scope="col" colspan="{{ users | length }}" class="text-center">Call</th>
<th scope="col" rowspan="2" class="text-center">Result</th>
</tr>
</thead>
<tbody>
{# Users List #}
<tr>
<td>&nbsp;</td>
{% for user in users %}
{% set p10 = guesses.get(raceresult.race_id).get(user.name).p10.abbr %}
{% set dnf = guesses.get(raceresult.race_id).get(user.name).dnf.abbr %}
<td class="{% if p10 == raceresult.p10.abbr %}text-success fw-bold{% endif %}">{{ p10 }}</td>
<td class="{% if dnf == raceresult.dnf.abbr %}text-success fw-bold{% endif %}">{{ dnf }}</td>
<td class="text-center">{{ user.name }}</td>
{% endfor %}
<td>{{ raceresult.p10.abbr }}</td>
<td class="{% if raceresult.dnf.abbr == 'NON' %}text-muted{% endif %}">{{ raceresult.dnf.abbr }}</td>
<td>&nbsp;</td>
</tr>
{% endfor %}
</tbody>
</table>
{# Race Results #}
{% for raceresult in raceresults %}
<tr>
<td>{{ raceresult.race.grandprix }}</td>
{% for user in users %}
{% set pxx = guesses.get(raceresult.race_id).get(user.name).pxx.abbr %}
{% set dnf = guesses.get(raceresult.race_id).get(user.name).dnf.abbr %}
<td>
<ul class="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>
</ul>
</td>
{% endfor %}
<td>
<ul class="list-group-flush">
<li class="list-group-item">PXX: {{ pxx }}</li>
<li class="list-group-item {% if raceresult.dnf.abbr == 'NON' %}text-muted{% endif %}">
DNF: {{ raceresult.dnf.abbr }}</li>
</ul>
</td>
</tr>
{% endfor %}
{# Next Race Guess #}
{% if nextrace is not none %}
<tr>
<td>{{ nextrace.grandprix }}</td>
{% for user in users %}
<td>
<form action="/guessrace/{{ nextrace.id }}/{{ user.name }}" method="post">
{# Driver PXX Select #}
<div class="form-floating">
<select name="pxxselect" class="form-select" aria-label="Select PXX">
<option value="" selected disabled hidden></option>
{% for driver in drivers %}
<option {% if (user.name in nextguesses) and (nextguesses.get(user.name).pxx.abbr == driver.abbr) %}selected{% endif %}
value="{{ driver.name }}">{{ driver.abbr }}</option>
{% endfor %}
</select>
<label for="pxxselect" class="text-primary">P{{ nextrace.pxx }}:</label>
</div>
{# Driver DNF Select #}
<div class="form-floating mt-2">
<select name="dnfselect" class="form-select" aria-label="Select DNF">
<option value="" selected disabled hidden></option>
{% for driver in drivers %}
<option {% if (user.name in nextguesses) and (nextguesses.get(user.name).dnf.abbr == driver.abbr) %}selected{% endif %}
value="{{ driver.name }}">{{ driver.abbr }}</option>
{% endfor %}
</select>
<label for="dnfselect" class="text-primary">DNF:</label>
</div>
<input type="submit" class="btn btn-primary mt-2 w-100" value="Save">
</form>
</td>
{% endfor %}
<td>&nbsp;</td>
</tr>
{% endif %}
</tbody>
</table>
{% endblock body %}