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