File size: 2,895 Bytes
9db9dc4
 
 
 
 
 
4bfd7b8
9d8e6a4
4bfd7b8
 
 
 
 
 
 
 
 
 
 
 
 
9db9dc4
 
9d8e6a4
 
 
 
 
 
4bfd7b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bfd954e
4bfd7b8
 
 
 
 
 
 
 
 
 
9d8e6a4
 
 
 
 
 
 
 
 
 
 
 
 
 
4bfd7b8
9db9dc4
 
 
 
 
 
 
 
9d8e6a4
9db9dc4
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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, display_player


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)
        roster_user_position_map[user_id][position_id] = player

    return roster_user_position_map


def display_user_row(week: int, user_name: str, user_map: dict[str, PlayerOption]):
    selection_cols = st.columns(1 + len(POSITION_LABELS))
    # first col is name
    with selection_cols[0]:
        st.write(user_name)
    for pos_label, st_col in zip(POSITION_LABELS, selection_cols[1:]):
        week_pos_label = f"{week}-{pos_label}"
        with st_col:
            st.write(pos_label.split("-")[0])
            player = user_map.get(week_pos_label, PlayerOption.empty_player(week=week))
            display_player(player)


def display_masked_rosters(week: int):
    rosters = load_masked_rosters()
    users = get_users_df()
    for row in users.itertuples():
        user_roster_map = rosters.get(row.user_id, {})
        display_user_row(week, row.name, user_roster_map)


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()