excel-planner/config.py

94 lines
3.5 KiB
Python

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