clean up tables and add stats
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
import collections
|
import collections
|
||||||
|
import functools
|
||||||
|
import time
|
||||||
|
|
||||||
import dash
|
import dash
|
||||||
|
|
||||||
@@ -8,6 +10,19 @@ import wordlinator.utils
|
|||||||
app = dash.Dash(name="WordleGolf")
|
app = dash.Dash(name="WordleGolf")
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache()
|
||||||
|
def _scores_from_db(ttl_hash=None):
|
||||||
|
return db.WordleDb().get_scores(wordlinator.utils.WORDLE_TODAY.golf_hole.game_no)
|
||||||
|
|
||||||
|
|
||||||
|
def get_ttl_hash(seconds=600):
|
||||||
|
return round(time.time() / seconds)
|
||||||
|
|
||||||
|
|
||||||
|
def scores_from_db():
|
||||||
|
return _scores_from_db(get_ttl_hash())
|
||||||
|
|
||||||
|
|
||||||
def _golf_score(score_list):
|
def _golf_score(score_list):
|
||||||
scores = [s.score for s in score_list]
|
scores = [s.score for s in score_list]
|
||||||
score_count = len(scores)
|
score_count = len(scores)
|
||||||
@@ -51,11 +66,18 @@ def _column_formats(col):
|
|||||||
},
|
},
|
||||||
"backgroundColor": "green",
|
"backgroundColor": "green",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"column_id": col["id"],
|
||||||
|
"filter_query": _format_string(col, "is nil"),
|
||||||
|
},
|
||||||
|
"backgroundColor": "white",
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def get_scores():
|
def get_scores():
|
||||||
score_list = db.WordleDb().get_scores(2)
|
score_list = scores_from_db()
|
||||||
scores_by_user = collections.defaultdict(list)
|
scores_by_user = collections.defaultdict(list)
|
||||||
for score in score_list:
|
for score in score_list:
|
||||||
scores_by_user[score.user_id.username].append(score)
|
scores_by_user[score.user_id.username].append(score)
|
||||||
@@ -75,17 +97,115 @@ def get_scores():
|
|||||||
*hole_columns,
|
*hole_columns,
|
||||||
]
|
]
|
||||||
|
|
||||||
formatting = [
|
color_formatting = [
|
||||||
format_entry
|
format_entry
|
||||||
for column_formats in [_column_formats(col) for col in hole_columns]
|
for column_formats in [_column_formats(col) for col in hole_columns]
|
||||||
for format_entry in column_formats
|
for format_entry in column_formats
|
||||||
]
|
]
|
||||||
|
formatting = [
|
||||||
|
{"if": {"column_id": "Name"}, "textAlign": "center"},
|
||||||
|
*color_formatting,
|
||||||
|
]
|
||||||
return dash.dash_table.DataTable(
|
return dash.dash_table.DataTable(
|
||||||
table_rows, columns, style_data_conditional=formatting, sort_action="native"
|
table_rows,
|
||||||
|
columns,
|
||||||
|
style_table={"width": "80%", "margin": "auto"},
|
||||||
|
style_cell={"textAlign": "center"},
|
||||||
|
style_data={"width": "10%"},
|
||||||
|
style_as_list_view=True,
|
||||||
|
style_data_conditional=formatting,
|
||||||
|
sort_action="native",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
app.layout = dash.html.Div(children=[dash.html.H1("#WordleGolf"), get_scores()])
|
SCORE_NAME_MAP = {
|
||||||
|
1: "Hole-in-1",
|
||||||
|
2: "Eagle",
|
||||||
|
3: "Birdie",
|
||||||
|
4: "Par",
|
||||||
|
5: "Bogey",
|
||||||
|
6: "Double Bogey",
|
||||||
|
7: "Fail",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _get_score_breakdown(score, holes):
|
||||||
|
score_row = {"Score": SCORE_NAME_MAP[score]}
|
||||||
|
days = sorted(set(holes))
|
||||||
|
for day in days:
|
||||||
|
score_row[day] = holes.count(day)
|
||||||
|
return score_row
|
||||||
|
|
||||||
|
|
||||||
|
def _get_summary_rows(score_list):
|
||||||
|
days = list(sorted(set((score.hole_id.hole for score in score_list))))
|
||||||
|
day_dict = {
|
||||||
|
day: [score.score for score in score_list if score.hole_id.hole == day]
|
||||||
|
for day in days
|
||||||
|
}
|
||||||
|
totals = {
|
||||||
|
"Score": "Total",
|
||||||
|
**{day: len(scores) for day, scores in day_dict.items()},
|
||||||
|
}
|
||||||
|
|
||||||
|
averages = {
|
||||||
|
"Score": "Daily Average",
|
||||||
|
**{
|
||||||
|
day: round(sum(scores) / len(scores), 2) for day, scores in day_dict.items()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return [totals, averages]
|
||||||
|
|
||||||
|
|
||||||
|
def get_daily_stats():
|
||||||
|
score_list = scores_from_db()
|
||||||
|
scores_by_value = collections.defaultdict(list)
|
||||||
|
for score in score_list:
|
||||||
|
scores_by_value[score.score].append(score.hole_id.hole)
|
||||||
|
|
||||||
|
table_rows = []
|
||||||
|
for score in sorted(scores_by_value.keys()):
|
||||||
|
table_rows.append(_get_score_breakdown(score, scores_by_value[score]))
|
||||||
|
|
||||||
|
table_rows.extend(_get_summary_rows(score_list))
|
||||||
|
|
||||||
|
columns = [
|
||||||
|
{"name": n, "id": n}
|
||||||
|
for n in (
|
||||||
|
"Score",
|
||||||
|
*[
|
||||||
|
f"{i}"
|
||||||
|
for i in range(1, wordlinator.utils.WORDLE_TODAY.golf_hole.hole_no + 1)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
]
|
||||||
|
return dash.dash_table.DataTable(
|
||||||
|
table_rows,
|
||||||
|
columns=columns,
|
||||||
|
style_as_list_view=True,
|
||||||
|
style_data_conditional=[
|
||||||
|
{"if": {"filter_query": "{Score} = 'Total'"}, "fontWeight": "bold"},
|
||||||
|
{"if": {"filter_query": "{Score} = 'Daily Average'"}, "fontWeight": "bold"},
|
||||||
|
],
|
||||||
|
style_table={"width": "80%", "margin": "auto"},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
app.layout = dash.html.Div(
|
||||||
|
children=[
|
||||||
|
dash.html.H1("#WordleGolf", style={"textAlign": "center"}),
|
||||||
|
dash.html.Div(
|
||||||
|
[dash.html.H2("User Scores", style={"textAlign": "center"}), get_scores()]
|
||||||
|
),
|
||||||
|
dash.html.Div(
|
||||||
|
[
|
||||||
|
dash.html.H2("Daily Stats", style={"textAlign": "center"}),
|
||||||
|
get_daily_stats(),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
server = app.server
|
server = app.server
|
||||||
|
|||||||
Reference in New Issue
Block a user