File size: 4,435 Bytes
aec8fff 007b0fc 23cf709 aec8fff 007b0fc 23cf709 aec8fff 23cf709 aec8fff 23cf709 aec8fff bc24113 23cf709 aec8fff bc24113 23cf709 0e1fc28 23cf709 007b0fc aec8fff 23cf709 aec8fff 23cf709 aec8fff 23cf709 aec8fff 23cf709 aec8fff 23cf709 | 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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | import uuid
import streamlit as st
from config import AppConfig
from utils.data_loading import DataManager
def init_session_state(config: AppConfig) -> None:
"""Initialize session state with better separation of concerns"""
# First initialize config-based states
if "config_initialized" not in st.session_state:
st.session_state.update(
{
"DEBUG": config.DEBUG,
"ENABLE_TIMING": config.ENABLE_TIMING,
"ENABLE_ALTAIR": config.ENABLE_ALTAIR,
"reporting_month": config.DEFAULT_REPORTING_MONTH,
}
)
st.session_state.config_initialized = True
# Initialize analytics state
if "analytics_initialized" not in st.session_state:
st.session_state.update(
{
"logged_visit": False,
"visitor_id": str(uuid.uuid4()),
}
)
st.session_state.analytics_initialized = True
# Initialize admin state
if "admin_initialized" not in st.session_state:
st.session_state.update(
{
"admin_authenticated": False,
}
)
st.session_state.admin_initialized = True
# Initialize exclusion settings
if "exclusions_initialized" not in st.session_state:
# Start with default exclusions from config
st.session_state.update(
{
"persistent_excluded_sectors": config.DEFAULT_EXCLUDED_SECTORS,
"persistent_excluded_stations": config.DEFAULT_EXCLUDED_STATIONS,
"exclusions_initialized": True,
}
)
# Initialize data manager if not already initialized
if "data_manager" not in st.session_state:
st.session_state.data_manager = DataManager(config)
# Ensure excluded values are valid using complete lists from data manager
if "data_manager" in st.session_state:
# Get valid options from data manager
valid_sectors = set(st.session_state.data_manager.all_sectors)
valid_stations = set(st.session_state.data_manager.all_stations)
# Filter out invalid values
if "persistent_excluded_sectors" in st.session_state:
st.session_state.persistent_excluded_sectors = [
sector
for sector in st.session_state.persistent_excluded_sectors
if sector in valid_sectors
]
if "persistent_excluded_stations" in st.session_state:
st.session_state.persistent_excluded_stations = [
station
for station in st.session_state.persistent_excluded_stations
if station in valid_stations
]
# Initialize data and date-related variables
if "data" not in st.session_state:
metadata = st.session_state.data_manager.metadata
st.session_state.update(
{
"data": st.session_state.data_manager.load_data() if metadata else None,
"start_date": config.DEFAULT_START_DATE,
"end_date": config.DEFAULT_END_DATE,
"reporting_month": config.DEFAULT_REPORTING_MONTH,
}
)
def ensure_session_initialized(config=None):
"""Ensures session state is properly initialized with all critical variables."""
if "session_initialized" in st.session_state:
return
# If no config provided, try to load it
if config is None:
try:
from config import AppConfig
config = AppConfig.from_env()
except Exception as e:
st.error(f"Failed to load configuration: {str(e)}")
st.stop()
try:
init_session_state(config)
st.session_state.session_initialized = True
if config.DEBUG:
st.info(f"Session initialized with config: {config}")
except Exception as e:
st.error(f"Failed to initialize session state: {str(e)}")
if config.DEBUG:
st.exception(e)
st.stop()
# Verify critical session state variables are set
critical_vars = [
"data_manager",
"config_initialized",
"analytics_initialized",
"admin_initialized",
]
missing_vars = [var for var in critical_vars if var not in st.session_state]
if missing_vars:
st.error(f"Critical session state variables missing: {missing_vars}")
st.stop()
|