94 lines
3.5 KiB
Python
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)"
|