|
import pandas as pd |
|
import streamlit as st |
|
|
|
from config import DEFAULT_ICON |
|
from shared_page import common_page_config |
|
|
|
from data_storage import get_all_users, get_all_rosters |
|
from domain.playoffs import CURRENT_PLAYOFF_WEEK, PLAYOFF_WEEK_TO_NAME |
|
from load_options import get_map_week_player_id_option, PlayerOption |
|
|
|
|
|
POSITION_LABELS = [ |
|
"QB-1", |
|
"RB-1", |
|
"RB-2", |
|
"WR-1", |
|
"WR-2", |
|
"TE-1", |
|
"K-1", |
|
"DEF-1", |
|
] |
|
|
|
|
|
def get_users_df(): |
|
columns = ["user_id", "name"] |
|
all_users = pd.DataFrame(get_all_users(columns_included=columns), columns=columns) |
|
return all_users |
|
|
|
|
|
@st.cache_data(ttl=60 * 60) |
|
def load_masked_rosters() -> dict[int, dict[str, PlayerOption]]: |
|
options_map = get_map_week_player_id_option() |
|
roster_user_position_map: dict[int, dict[str, PlayerOption]] = {} |
|
for user_id, position_id, player_id in get_all_rosters(): |
|
if user_id not in roster_user_position_map: |
|
roster_user_position_map[user_id] = {} |
|
week = int(position_id[0]) |
|
|
|
player = PlayerOption.empty_player(week=week) |
|
if selected_player := options_map[week].get(player_id): |
|
if selected_player.is_locked(): |
|
player = selected_player |
|
else: |
|
player = PlayerOption.hidden_player(week=week, position=selected_player.position) |
|
roster_user_position_map[user_id][position_id] = player |
|
|
|
return roster_user_position_map |
|
|
|
|
|
def get_roster_html_str(week: int, user_map: dict[str, PlayerOption]) -> str: |
|
players_str = "" |
|
for pos_label in POSITION_LABELS: |
|
week_pos_label = f"{week}-{pos_label}" |
|
player = user_map.get(week_pos_label, PlayerOption.empty_player(week=week)) |
|
players_str += get_player_html_str(player) |
|
roster_str = f"""<ul className='user__roster'> |
|
{players_str} |
|
</ul>""" |
|
return roster_str |
|
|
|
|
|
def get_player_html_str(player_opt: PlayerOption) -> str: |
|
|
|
multiplier = 1 |
|
game_status = " " |
|
score = 0 |
|
game_score = " " |
|
stats: list = [] |
|
player_stats = get_player_stats_html_str(stats) |
|
|
|
player_classes = "player" |
|
if player_opt.team: |
|
player_classes += f" player--{player_opt.team.upper()}" |
|
|
|
image_classes = "player__image" |
|
multiplier_classes = "player__multiplier" |
|
if multiplier > 1: |
|
image_classes += f" player__image--{multiplier}" |
|
multiplier_classes += f" player__multiplier--{multiplier}" |
|
|
|
if not (player_image_url := player_opt.headshot_url): |
|
player_image_url = "https://static.www.nfl.com/w_200,h_200,c_fill/league/suxzfdslsj5vpwbin5t8" |
|
|
|
player_str = f"""<li className='{player_classes}'> |
|
<div className="player__position">{player_opt.position}</div> |
|
<div className={image_classes}> |
|
<img className="player__img" src={player_image_url} alt='{player_opt.full_name}' /> |
|
</div> |
|
<div className="player__name">{player_opt.full_name}</div> |
|
<div className="player__team">{player_opt.team}</div> |
|
<span className="player__score">{score}</span> |
|
<span className='{multiplier_classes}'>{multiplier}X</span> |
|
<span className="player__game-status">{game_status}</span> |
|
<span className="player__game-score">{game_score}</span> |
|
{player_stats} |
|
</li>""" |
|
|
|
return player_str |
|
|
|
|
|
def get_stat_list_item_html_str(stat) -> str: |
|
|
|
stat_key = "TODO" |
|
stat_value = "TODO" |
|
|
|
return f"""<li className="stat"> |
|
<div className="stat__key">{stat_key}</div> |
|
<div className="stat__value">{stat_value}</div> |
|
</li>""" |
|
|
|
|
|
def get_player_stats_html_str(stats_list: list) -> str: |
|
stat_items_str = "\n".join([get_stat_list_item_html_str(s) for s in stats_list]) |
|
stats_str = f"""<ul className="player-stats">{stat_items_str}</ul>""" |
|
return stats_str |
|
|
|
|
|
def get_user_html_str(week: int, user_name: str, user_map: dict[str, PlayerOption]) -> str: |
|
user_str = "" |
|
|
|
|
|
place = 1 |
|
score_type = "Score" |
|
week_score = 0 |
|
roster_html_str = get_roster_html_str(week, user_map) |
|
user_str += f""" |
|
<li className="user"> |
|
<span className="user__place">{place}</span> |
|
<span className="user__username">{user_name}</span> |
|
<span className="user__username">{user_name}</span> |
|
<span className="user__score-type">{score_type}</span> |
|
<span className="user__score-number">{week_score}</span> |
|
{roster_html_str} |
|
</li>""" |
|
return user_str |
|
|
|
|
|
def display_masked_rosters(week: int): |
|
rosters = load_masked_rosters() |
|
users = get_users_df() |
|
|
|
scoreboard_str = "" |
|
|
|
scoreboard_str += """<ol className="scoreboard">""" |
|
for row in users.itertuples(): |
|
user_roster_map = rosters.get(row.user_id, {}) |
|
scoreboard_str += get_user_html_str(week, row.name, user_roster_map) |
|
|
|
scoreboard_str += """</ol>""" |
|
|
|
st.markdown(scoreboard_str, unsafe_allow_html=True) |
|
|
|
|
|
def display_rosters(): |
|
st.markdown("<h2>Rosters</h2>", unsafe_allow_html=True) |
|
options = list(PLAYOFF_WEEK_TO_NAME.keys()) |
|
default_selection = options.index(CURRENT_PLAYOFF_WEEK) |
|
week_selected = st.selectbox( |
|
"Week", |
|
options=options, |
|
index=default_selection, |
|
key="roster_week_select", |
|
format_func=lambda x: PLAYOFF_WEEK_TO_NAME[x], |
|
) |
|
|
|
display_masked_rosters(week_selected) |
|
|
|
|
|
def get_page(): |
|
page_title = "Pool Scoreboard" |
|
st.set_page_config(page_title=page_title, page_icon=DEFAULT_ICON, layout="wide") |
|
common_page_config() |
|
|
|
st.title(page_title) |
|
display_rosters() |
|
|
|
|
|
if __name__ == "__main__": |
|
get_page() |
|
|