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