import os from pathlib import Path from dotenv import load_dotenv load_dotenv() BASE_DIR = Path(__file__).resolve().parent OUTPUT_DIR = BASE_DIR / "output" # Fuente de datos: # powerautomate = puente HTTP de Power Automate (sin Azure) # graph = Microsoft Graph API directa (requiere Azure) DATA_SOURCE = os.getenv("DATA_SOURCE", "powerautomate").lower() # --- Power Automate --- POWER_AUTOMATE_URL = os.getenv("POWER_AUTOMATE_URL", "") POWER_AUTOMATE_TIMEOUT = int(os.getenv("POWER_AUTOMATE_TIMEOUT", "300")) # --- Microsoft Graph (solo si DATA_SOURCE=graph) --- AUTH_MODE = os.getenv("AUTH_MODE", "delegated").lower() AZURE_TENANT_ID = os.getenv("AZURE_TENANT_ID", "") AZURE_CLIENT_ID = os.getenv("AZURE_CLIENT_ID", "") AZURE_CLIENT_SECRET = os.getenv("AZURE_CLIENT_SECRET", "") GRAPH_API_VERSION = os.getenv("GRAPH_API_VERSION", "v1.0") GRAPH_BASE_URL = f"https://graph.microsoft.com/{GRAPH_API_VERSION}" DELEGATED_SCOPES = [ "Tasks.Read", "User.Read", "Team.ReadBasic.All", "offline_access", ] APPLICATION_SCOPES = ["https://graph.microsoft.com/.default"] # --- Tablero HTML v7 (servidor local) --- # 0.0.0.0 = accesible en la red local (Chrome en otros PCs). 127.0.0.1 = solo esta PC. DASHBOARD_HOST = os.getenv("DASHBOARD_HOST", "0.0.0.0") DASHBOARD_PORT = int(os.getenv("DASHBOARD_PORT", "8765")) DASHBOARD_CACHE_SECONDS = int(os.getenv("DASHBOARD_CACHE_SECONDS", "8")) DASHBOARD_USE_EVENTS = os.getenv("DASHBOARD_USE_EVENTS", "true").lower() in { "1", "true", "yes", "si", } # Intervalo de actualizacion del tablero (segundos). 0 = solo al abrir/recargar. _refresh = os.getenv("DASHBOARD_REFRESH_SECONDS") or os.getenv("DASHBOARD_FALLBACK_POLL_SECONDS", "8") DASHBOARD_REFRESH_SECONDS = int(_refresh) # Minimo entre llamadas en background a Power Automate (evita saturar el flujo). DASHBOARD_MIN_BACKGROUND_SECONDS = int(os.getenv("DASHBOARD_MIN_BACKGROUND_SECONDS", "5")) DASHBOARD_WEBHOOK_SECRET = os.getenv("DASHBOARD_WEBHOOK_SECRET", "") DASHBOARD_WEBHOOK_DEBOUNCE_SECONDS = float(os.getenv("DASHBOARD_WEBHOOK_DEBOUNCE_SECONDS", "1")) DASHBOARD_VERBOSE = os.getenv("DASHBOARD_VERBOSE", "false").lower() in {"1", "true", "yes", "si"} # Avisos de campos faltantes (fechas/responsables) en consola del servidor. DASHBOARD_WARN_PA_FIELDS = os.getenv("DASHBOARD_WARN_PA_FIELDS", "false").lower() in { "1", "true", "yes", "si", } DASHBOARD_OPEN_BROWSER = os.getenv("DASHBOARD_OPEN_BROWSER", "true").lower() in { "1", "true", "yes", "si", } # --- Tablero HTML v7 (Google Sheets TSV, opcional) --- # ID de la hoja (desde la URL /d/XXXXXXXX/edit, no el ID de publicacion /d/e/...) GOOGLE_SPREADSHEET_ID = os.getenv("GOOGLE_SPREADSHEET_ID", "") GOOGLE_SHEET_NAME = os.getenv("GOOGLE_SHEET_NAME", "Hoja 1") GOOGLE_CREDENTIALS_PATH = os.getenv("GOOGLE_CREDENTIALS_PATH", "") def validate_config() -> list[str]: """Devuelve lista de variables faltantes segun la fuente de datos.""" missing = [] if DATA_SOURCE == "powerautomate": if not POWER_AUTOMATE_URL: missing.append("POWER_AUTOMATE_URL") return missing if not AZURE_TENANT_ID: missing.append("AZURE_TENANT_ID") if not AZURE_CLIENT_ID: missing.append("AZURE_CLIENT_ID") if AUTH_MODE == "application" and not AZURE_CLIENT_SECRET: missing.append("AZURE_CLIENT_SECRET") return missing def data_source_label() -> str: if DATA_SOURCE == "powerautomate": return "Power Automate" if AUTH_MODE == "delegated": return "Microsoft Graph (tu cuenta)" return "Microsoft Graph (organizacion)"