fix: apply break-even threshold on player stat profile (2.5.2)
build_leaderboard, player_session_series, and session_breakdown_series in the player detail and players routes were all called without league.break_even_cents, so win/loss/even classification always used the $1.00 default regardless of per-league settings.
This commit is contained in:
1 parent
882726e5e9
commit
51bb8f03f6
3 files changed
+11
-11
No files matched your search
@@ -31,8 +31,8 @@ def color_for_name(name: str, names: list[str]) -> str:
|
|||||||
return PLAYER_PALETTE[index % len(PLAYER_PALETTE)]
|
return PLAYER_PALETTE[index % len(PLAYER_PALETTE)]
|
||||||
|
|
||||||
|
|
||||||
def net_tone(value_cents: int) -> str:
|
def net_tone(value_cents: int, break_even_cents: int = 100) -> str:
|
||||||
bucket = net_result_bucket(value_cents)
|
bucket = net_result_bucket(value_cents, break_even_cents)
|
||||||
|
|
||||||
if bucket == "win":
|
if bucket == "win":
|
||||||
return "#6fc093" # --pos
|
return "#6fc093" # --pos
|
||||||
@@ -96,7 +96,7 @@ def cumulative_profit_series(sessions: list[SessionSummary]) -> dict[str, object
|
|||||||
|
|
||||||
|
|
||||||
def player_session_series(
|
def player_session_series(
|
||||||
sessions: list[SessionSummary], player_name: str
|
sessions: list[SessionSummary], player_name: str, break_even_cents: int = 100
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
ordered_sessions = sorted(sessions, key=session_sort_key)
|
ordered_sessions = sorted(sessions, key=session_sort_key)
|
||||||
labels: list[str] = []
|
labels: list[str] = []
|
||||||
@@ -130,12 +130,12 @@ def player_session_series(
|
|||||||
"labels": labels,
|
"labels": labels,
|
||||||
"color": color_for_name(player_name, all_player_names),
|
"color": color_for_name(player_name, all_player_names),
|
||||||
"net_values": net_values,
|
"net_values": net_values,
|
||||||
"net_colors": [net_tone(round(value * 100)) for value in net_values],
|
"net_colors": [net_tone(round(value * 100), break_even_cents) for value in net_values],
|
||||||
"cumulative_values": cumulative_values,
|
"cumulative_values": cumulative_values,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def session_breakdown_series(session: SessionSummary) -> dict[str, Any]:
|
def session_breakdown_series(session: SessionSummary, break_even_cents: int = 100) -> dict[str, Any]:
|
||||||
ordered_entries = sorted(
|
ordered_entries = sorted(
|
||||||
session.entries,
|
session.entries,
|
||||||
key=lambda entry: (entry.net_cents, entry.player_name.casefold()),
|
key=lambda entry: (entry.net_cents, entry.player_name.casefold()),
|
||||||
@@ -145,5 +145,5 @@ def session_breakdown_series(session: SessionSummary) -> dict[str, Any]:
|
|||||||
return {
|
return {
|
||||||
"labels": [entry.player_name for entry in ordered_entries],
|
"labels": [entry.player_name for entry in ordered_entries],
|
||||||
"net_values": [round(entry.net_cents / 100, 2) for entry in ordered_entries],
|
"net_values": [round(entry.net_cents / 100, 2) for entry in ordered_entries],
|
||||||
"net_colors": [net_tone(entry.net_cents) for entry in ordered_entries],
|
"net_colors": [net_tone(entry.net_cents, break_even_cents) for entry in ordered_entries],
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@ DATA_PATH = BASE_DIR / "data" / "entries.csv"
|
|||||||
DEFAULT_DATABASE_URL = f"sqlite:///{BASE_DIR / 'data' / 'boker-dev.sqlite3'}"
|
DEFAULT_DATABASE_URL = f"sqlite:///{BASE_DIR / 'data' / 'boker-dev.sqlite3'}"
|
||||||
|
|
||||||
ELIGIBLE_MIN_SESSIONS = 3
|
ELIGIBLE_MIN_SESSIONS = 3
|
||||||
APP_VERSION = "2.5.1"
|
APP_VERSION = "2.5.2"
|
||||||
|
|
||||||
|
|
||||||
def load_local_env(env_path: Path) -> None:
|
def load_local_env(env_path: Path) -> None:
|
||||||
|
|||||||
+4
-4
@@ -589,7 +589,7 @@ def player_detail(league_ref: str, player_id: str):
|
|||||||
abort(404)
|
abort(404)
|
||||||
|
|
||||||
all_sessions = build_session_summaries(list_event_rows_for_league(league.id))
|
all_sessions = build_session_summaries(list_event_rows_for_league(league.id))
|
||||||
board = build_leaderboard(all_sessions)
|
board = build_leaderboard(all_sessions, league.break_even_cents)
|
||||||
player_stats = next(
|
player_stats = next(
|
||||||
(player for player in board if player.player_name == player_record.display_name),
|
(player for player in board if player.player_name == player_record.display_name),
|
||||||
None,
|
None,
|
||||||
@@ -619,7 +619,7 @@ def player_detail(league_ref: str, player_id: str):
|
|||||||
player_record=player_record,
|
player_record=player_record,
|
||||||
player=player_stats,
|
player=player_stats,
|
||||||
player_rank=player_rank,
|
player_rank=player_rank,
|
||||||
chart_data=player_session_series(all_sessions, player_record.display_name),
|
chart_data=player_session_series(all_sessions, player_record.display_name, league.break_even_cents),
|
||||||
player_sessions=player_sessions,
|
player_sessions=player_sessions,
|
||||||
session_label=session_label,
|
session_label=session_label,
|
||||||
session_ids=session_ref_map(league.id),
|
session_ids=session_ref_map(league.id),
|
||||||
@@ -676,7 +676,7 @@ def players(league_ref: str):
|
|||||||
from ledger_repositories import list_event_rows_for_league
|
from ledger_repositories import list_event_rows_for_league
|
||||||
|
|
||||||
all_sessions = build_session_summaries(list_event_rows_for_league(league.id))
|
all_sessions = build_session_summaries(list_event_rows_for_league(league.id))
|
||||||
board = build_leaderboard(all_sessions)
|
board = build_leaderboard(all_sessions, league.break_even_cents)
|
||||||
stats_by_name = {p.player_name: p for p in board}
|
stats_by_name = {p.player_name: p for p in board}
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
@@ -1083,7 +1083,7 @@ def session_public_view(league_ref: str, session_id: str):
|
|||||||
session=summary,
|
session=summary,
|
||||||
session_number=session_number,
|
session_number=session_number,
|
||||||
raw_events=session_events(rows, summary.session_id),
|
raw_events=session_events(rows, summary.session_id),
|
||||||
chart_data=session_breakdown_series(summary),
|
chart_data=session_breakdown_series(summary, league.break_even_cents),
|
||||||
session_label=session_label,
|
session_label=session_label,
|
||||||
prev_session_id=ref_to_db_id.get(prev_summary.session_id) if prev_summary else None,
|
prev_session_id=ref_to_db_id.get(prev_summary.session_id) if prev_summary else None,
|
||||||
next_session_id=ref_to_db_id.get(next_summary.session_id) if next_summary else None,
|
next_session_id=ref_to_db_id.get(next_summary.session_id) if next_summary else None,
|
||||||
|
|||||||
Reference in new issue
Block a user