Spaces:
Build error
Build error
| # app.py | |
| import streamlit as st | |
| from utils.metrics import get_login_attempts_counter | |
| from views import show_login_page, show_dashboard, show_add_account_page, show_heir_management_page, show_security_settings_page | |
| from models import initialize_database | |
| from creator import Creator | |
| import sqlite3 | |
| import os | |
| from prometheus_client import REGISTRY | |
| import logging | |
| from config import init_app | |
| import re | |
| from typing import Tuple # Add this import at the top | |
| from utils.security import log_security_event | |
| from views import ( | |
| show_login_page, | |
| show_dashboard, | |
| show_add_account_page, | |
| show_heir_management_page, | |
| show_security_settings_page | |
| ) | |
| from models import initialize_database | |
| from dashboard_components import apply_custom_css | |
| # Configure logging | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| CREATOR_INFO = { | |
| "name": "MUHAMMAD SHAHEER", | |
| "version": "1.0.0", | |
| "description": "Advanced Digital Asset Management & Inheritance" | |
| } | |
| if 'login_attempts_counter' not in st.session_state: | |
| st.session_state['login_attempts_counter'] = get_login_attempts_counter() | |
| def initialize_app(): | |
| """Initialize the application.""" | |
| # Clear any existing metrics from previous sessions | |
| try: | |
| REGISTRY.unregister(REGISTRY._names_to_collectors['login_attempts_total']) | |
| except KeyError: | |
| pass | |
| def initialize_session_state(): | |
| """Initialize all required session state variables""" | |
| if 'initialized' not in st.session_state: | |
| try: | |
| # Clear any existing metrics first | |
| if 'login_attempts_counter' in st.session_state: | |
| del st.session_state['login_attempts_counter'] | |
| # Initialize basic session state variables | |
| st.session_state.initialized = False | |
| st.session_state.page = 'login' | |
| st.session_state.user = None | |
| st.session_state.login_attempts = {} | |
| # Initialize database connection | |
| if 'db' not in st.session_state: | |
| st.session_state.db = sqlite3.connect('digital_heir.db', check_same_thread=False) | |
| # Initialize metrics | |
| from utils.metrics import get_login_attempts_counter | |
| st.session_state.login_attempts_counter = get_login_attempts_counter() | |
| # Initialize database tables | |
| initialize_database() | |
| st.session_state.initialized = True | |
| return True | |
| except Exception as e: | |
| logger.error(f"Initialization error: {str(e)}") | |
| st.error(f"Failed to initialize: {str(e)}") | |
| return False | |
| return True | |
| def validate_inputs(data: dict) -> Tuple[bool, str]: | |
| """Validate user inputs""" | |
| if not all(data.values()): | |
| return False, "All fields are required" | |
| if 'email' in data and not re.match(r"[^@]+@[^@]+\.[^@]+", data['email']): | |
| return False, "Invalid email format" | |
| if 'username' in data and len(data['username']) < 3: | |
| return False, "Username must be at least 3 characters" | |
| return True, "Validation successful" | |
| def handle_database_error(e: Exception, operation: str): | |
| """Handle database errors""" | |
| error_msg = f"Database error during {operation}: {str(e)}" | |
| logging.error(error_msg) | |
| st.error(error_msg) | |
| return False | |
| def main(): | |
| """Main application entry point""" | |
| # Initialize session state first | |
| init_success = initialize_session_state() | |
| if not init_success: | |
| st.error("Failed to initialize application. Please try again.") | |
| return | |
| # Check if user is logged in | |
| if 'user' not in st.session_state or st.session_state.user is None: | |
| show_login_page() | |
| else: | |
| # Define available pages | |
| pages = { | |
| 'dashboard': show_dashboard, | |
| 'add_account': show_add_account_page, | |
| 'manage_heirs': show_heir_management_page, | |
| 'security': show_security_settings_page | |
| } | |
| # Get current page from session state, default to dashboard | |
| current_page = st.session_state.get('page', 'dashboard') | |
| # Show the current page | |
| pages.get(current_page, show_dashboard)() | |
| if __name__ == "__main__": | |
| st.set_page_config( | |
| page_title="Digital Inheritance System", | |
| page_icon="🔐", | |
| layout="wide" | |
| ) | |
| if 'db' not in st.session_state: | |
| st.session_state.db = sqlite3.connect('digital_heir.db', check_same_thread=False) | |
| main() |