Implement adding race guesses
This commit is contained in:
59
formula10.py
59
formula10.py
@ -32,31 +32,62 @@ def save():
|
|||||||
def race():
|
def race():
|
||||||
users = User.query.all()
|
users = User.query.all()
|
||||||
raceresults = RaceResult.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:
|
for raceresult in raceresults:
|
||||||
guesses[raceresult.race_id] = dict()
|
guesses[raceresult.race_id] = dict()
|
||||||
for guess in RaceGuess.query.all():
|
for guess in RaceGuess.query.all():
|
||||||
|
if guess.race_id in guesses:
|
||||||
guesses[guess.race_id][guess.user_id] = guess
|
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",
|
return render_template("race.jinja",
|
||||||
users=users,
|
users=users,
|
||||||
|
drivers=drivers,
|
||||||
raceresults=raceresults,
|
raceresults=raceresults,
|
||||||
guesses=guesses)
|
guesses=guesses,
|
||||||
|
nextguesses=nextguesses,
|
||||||
|
nextrace=nextrace)
|
||||||
|
|
||||||
|
|
||||||
# @app.route("/teams", methods=["GET", "POST"])
|
@app.route("/guessrace/<raceid>/<username>", methods=["POST"])
|
||||||
# def teams():
|
def guessrace(raceid, username):
|
||||||
# if request.method == "POST":
|
pxx = request.form.get("pxxselect")
|
||||||
# new_team = Team(
|
dnf = request.form.get("dnfselect")
|
||||||
# name = request.form["name"],
|
|
||||||
# country_code = request.form["country_code"]
|
if pxx is None or dnf is None:
|
||||||
# )
|
return redirect("/race")
|
||||||
# print(new_team.name, new_team.country_code)
|
|
||||||
# db.session.add(new_team)
|
raceguess: RaceGuess | None = RaceGuess.query.filter_by(user_id=username, race_id=raceid).first()
|
||||||
# db.session.commit()
|
|
||||||
#
|
if raceguess is not None:
|
||||||
# return render_template("teams.jinja", page="teams")
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@ -1,24 +1,24 @@
|
|||||||
id,grandprix,number,date
|
id,grandprix,number,date,pxx
|
||||||
1,Bahrain,1,2023-03-05
|
1,Bahrain,1,2023-03-05,3
|
||||||
2,Saudi Arabia,2,2023-03-19
|
2,Saudi Arabia,2,2023-03-19,17
|
||||||
3,Melbourne,3,2023-04-02
|
3,Melbourne,3,2023-04-02,5
|
||||||
4,Baku,4,2023-04-30
|
4,Baku,4,2023-04-30,6
|
||||||
5,Miami,5,2023-05-07
|
5,Miami,5,2023-05-07,15
|
||||||
6,Imola,6,2023-05-21
|
6,Imola,6,2023-05-21,8
|
||||||
7,Monaco,7,2023-05-28
|
7,Monaco,7,2023-05-28,9
|
||||||
8,Barcelona,8,2023-06-04
|
8,Barcelona,8,2023-06-04,13
|
||||||
9,Montreal,9,2023-06-18
|
9,Montreal,9,2023-06-18,11
|
||||||
10,Spielberg,10,2023-07-02
|
10,Spielberg,10,2023-07-02,12
|
||||||
11,Silverstone,11,2023-07-09
|
11,Silverstone,11,2023-07-09,18
|
||||||
12,Budapest,12,2023-07-23
|
12,Budapest,12,2023-07-23,12
|
||||||
13,Spa,13,2023-07-30
|
13,Spa,13,2023-07-30,13
|
||||||
14,Zandvoort,14,2023-08-27
|
14,Zandvoort,14,2023-08-27,3
|
||||||
15,Monza,15,2023-09-03
|
15,Monza,15,2023-09-03,6
|
||||||
16,Singapore,16,2023-09-17
|
16,Singapore,16,2023-09-17,10
|
||||||
17,Suzuka,17,2023-09-24
|
17,Suzuka,17,2023-09-24,11
|
||||||
18,Qatar,18,2023-10-08
|
18,Qatar,18,2023-10-08,3
|
||||||
19,Austin,19,2023-10-22
|
19,Austin,19,2023-10-22,11
|
||||||
20,Mexico,20,2023-10-29
|
20,Mexico,20,2023-10-29,17
|
||||||
21,Brazil,21,2023-11-05
|
21,Brazil,21,2023-11-05,14
|
||||||
22,Las Vegas,22,2023-11-18
|
22,Las Vegas,22,2023-11-18,8
|
||||||
23,Abu Dhabi,23,2023-11-26
|
23,Abu Dhabi,23,2023-11-26,5
|
||||||
|
9
model.py
9
model.py
@ -24,12 +24,14 @@ class Race(db.Model):
|
|||||||
self.grandprix = str(row[1])
|
self.grandprix = str(row[1])
|
||||||
self.number = int(row[2])
|
self.number = int(row[2])
|
||||||
self.date = datetime.strptime(row[3], "%Y-%m-%d")
|
self.date = datetime.strptime(row[3], "%Y-%m-%d")
|
||||||
|
self.pxx = int(row[4])
|
||||||
return self
|
return self
|
||||||
|
|
||||||
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
id: Mapped[int] = mapped_column(Integer, primary_key=True)
|
||||||
grandprix: Mapped[str] = mapped_column(String(32))
|
grandprix: Mapped[str] = mapped_column(String(32))
|
||||||
number: Mapped[int] = mapped_column(Integer)
|
number: Mapped[int] = mapped_column(Integer)
|
||||||
date: Mapped[datetime] = mapped_column(DateTime)
|
date: Mapped[datetime] = mapped_column(DateTime)
|
||||||
|
pxx: Mapped[int] = mapped_column(Integer)
|
||||||
|
|
||||||
|
|
||||||
class Team(db.Model):
|
class Team(db.Model):
|
||||||
@ -303,7 +305,7 @@ class RaceGuess(db.Model):
|
|||||||
self.dnf_id = str(row[4])
|
self.dnf_id = str(row[4])
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def to_csv(self, writer):
|
def to_csv(self):
|
||||||
return [
|
return [
|
||||||
self.id,
|
self.id,
|
||||||
self.user_id,
|
self.user_id,
|
||||||
@ -330,9 +332,12 @@ class SeasonGuess(db.Model):
|
|||||||
__csv_header__ = ["id", "user_id", "hot_take"]
|
__csv_header__ = ["id", "user_id", "hot_take"]
|
||||||
|
|
||||||
def from_csv(self, row):
|
def from_csv(self, row):
|
||||||
|
self.id = int(row[0])
|
||||||
|
self.user_id = str(row[1])
|
||||||
|
self.hot_take = str(row[2])
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def to_csv(self, writer):
|
def to_csv(self):
|
||||||
return [
|
return [
|
||||||
self.id,
|
self.id,
|
||||||
self.user_id,
|
self.user_id,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{% extends 'base.jinja' %}
|
{% extends 'base.jinja' %}
|
||||||
|
|
||||||
{% set active_page = "raceguessresults" %}
|
{% set active_page = "race" %}
|
||||||
|
|
||||||
{% block title %}Formula 10{% endblock title %}
|
{% block title %}Formula 10{% endblock title %}
|
||||||
|
|
||||||
@ -9,35 +9,23 @@
|
|||||||
<table class="table table-bordered">
|
<table class="table table-bordered">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col" rowspan="3" class="text-center">Race</th>
|
<th scope="col" rowspan="2" class="text-center">Race</th>
|
||||||
<th scope="col" colspan="{{ users | length * 2 }}" class="text-center">Call</th>
|
<th scope="col" colspan="{{ users | length }}" class="text-center">Call</th>
|
||||||
<th scope="col" rowspan="2" colspan="2" class="text-center">Result</th>
|
<th scope="col" rowspan="2" class="text-center">Result</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
||||||
{# Users List #}
|
{# Users List #}
|
||||||
<tr>
|
<tr>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
|
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<td colspan="2" class="text-center">{{ user.name }}</td>
|
<td class="text-center">{{ user.name }}</td>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
<td colspan="2"> </td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
{# P10/DNF Header #}
|
|
||||||
<tr>
|
|
||||||
<td> </td>
|
<td> </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>
|
</tr>
|
||||||
|
|
||||||
{# Race Results #}
|
{# Race Results #}
|
||||||
@ -46,16 +34,70 @@
|
|||||||
<td>{{ raceresult.race.grandprix }}</td>
|
<td>{{ raceresult.race.grandprix }}</td>
|
||||||
|
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
{% set p10 = guesses.get(raceresult.race_id).get(user.name).p10.abbr %}
|
{% 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 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>
|
||||||
<td class="{% if dnf == raceresult.dnf.abbr %}text-success fw-bold{% endif %}">{{ dnf }}</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 %}
|
{% endfor %}
|
||||||
|
|
||||||
<td>{{ raceresult.p10.abbr }}</td>
|
|
||||||
<td class="{% if raceresult.dnf.abbr == 'NON' %}text-muted{% endif %}">{{ raceresult.dnf.abbr }}</td>
|
<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>
|
</tr>
|
||||||
{% endfor %}
|
{% 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> </td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user