- Instalado notion-client SDK oficial para integración robusta - Refactorizado services/notion_service.py con SDK oficial de Notion - Rate limiting con retry y exponential backoff - Parser Markdown → Notion blocks (headings, bullets, paragraphs) - Soporte para pages y databases - Manejo robusto de errores - Integración automática en document/generators.py - PDFs se suben automáticamente a Notion después de generarse - Contenido completo del resumen formateado con bloques - Metadata rica (tipo de archivo, path, fecha) - Configuración de Notion en main.py - Inicialización automática al arrancar el servicio - Validación de credenciales - Actualizado config/settings.py - Agregado load_dotenv() para cargar variables de .env - Configuración de Notion (NOTION_API, NOTION_DATABASE_ID) - Scripts de utilidad creados: - test_notion_integration.py: Test de subida a Notion - test_pipeline_notion.py: Test del pipeline completo - verify_notion_permissions.py: Verificación de permisos - list_notion_pages.py: Listar páginas accesibles - diagnose_notion.py: Diagnóstico completo - create_notion_database.py: Crear database automáticamente - restart_service.sh: Script de reinicio del servicio - Documentación completa en opus.md: - Análisis exhaustivo del codebase (42 archivos Python) - Bugs críticos identificados y soluciones - Mejoras de seguridad (autenticación, rate limiting, CORS, CSP) - Optimizaciones de rendimiento (Celery, Redis, PostgreSQL, WebSockets) - Plan de testing (estructura, ejemplos, 80% coverage goal) - Roadmap de implementación (6 sprints detallados) - Integración avanzada con Notion documentada Estado: Notion funcionando correctamente, PDFs se suben automáticamente
117 lines
4.6 KiB
Python
117 lines
4.6 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Script para diagnosticar la integración de Notion
|
|
"""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from config import settings
|
|
from notion_client import Client
|
|
|
|
|
|
def main():
|
|
print("\n" + "=" * 70)
|
|
print("🔍 DIAGNÓSTICO COMPLETO DE NOTION")
|
|
print("=" * 70 + "\n")
|
|
|
|
token = settings.NOTION_API_TOKEN
|
|
database_id = settings.NOTION_DATABASE_ID
|
|
|
|
print(f"Token: {token[:30]}..." if token else "❌ Token no configurado")
|
|
print(f"Database ID: {database_id}\n")
|
|
|
|
if not token:
|
|
print("❌ Configura NOTION_API en .env\n")
|
|
return
|
|
|
|
client = Client(auth=token)
|
|
|
|
# Test 1: Verificar que el token sea válido
|
|
print("📝 Test 1: Verificando token...")
|
|
try:
|
|
# Intentar buscar páginas (cualquiera)
|
|
results = client.search(query="", page_size=1)
|
|
print("✅ Token válido - la integración está activa\n")
|
|
|
|
# Ver si tiene acceso a alguna página
|
|
pages = results.get("results", [])
|
|
if pages:
|
|
print(f"✅ La integración tiene acceso a {len(pages)} página(s)")
|
|
for page in pages[:3]:
|
|
page_id = page.get("id", "N/A")
|
|
page_type = page.get("object", "N/A")
|
|
print(f" - {page_type}: {page_id}")
|
|
else:
|
|
print("⚠️ La integración NO tiene acceso a ninguna página aún")
|
|
print(" Esto es normal si acabas de crear la integración.\n")
|
|
|
|
except Exception as e:
|
|
print(f"❌ Error con el token: {e}\n")
|
|
return
|
|
|
|
# Test 2: Verificar acceso a la base de datos específica
|
|
print("\n📊 Test 2: Verificando acceso a la base de datos CBC...")
|
|
try:
|
|
database = client.databases.retrieve(database_id=database_id)
|
|
print("✅ ¡ÉXITO! La integración puede acceder a la base de datos\n")
|
|
|
|
title = database.get("title", [{}])[0].get("plain_text", "Sin título")
|
|
print(f" Título: {title}")
|
|
print(f" ID: {database['id']}")
|
|
print(f"\n Propiedades:")
|
|
for prop_name in database.get("properties", {}).keys():
|
|
print(f" ✓ {prop_name}")
|
|
|
|
print("\n" + "=" * 70)
|
|
print("✅ TODO CONFIGURADO CORRECTAMENTE")
|
|
print("=" * 70)
|
|
print("\n🚀 Ejecuta: python test_notion_integration.py\n")
|
|
|
|
except Exception as e:
|
|
error_msg = str(e)
|
|
print(f"❌ No se puede acceder a la base de datos")
|
|
print(f" Error: {error_msg}\n")
|
|
|
|
if "Could not find database" in error_msg:
|
|
print("=" * 70)
|
|
print("⚠️ ACCIÓN REQUERIDA: Compartir la base de datos")
|
|
print("=" * 70)
|
|
print("\n📋 PASOS DETALLADOS:\n")
|
|
print("1. Abre Notion en tu navegador")
|
|
print("\n2. Ve a tu base de datos 'CBC'")
|
|
print(f" Opción A: Usa este link directo:")
|
|
print(f" → https://www.notion.so/{database_id.replace('-', '')}")
|
|
print(f"\n Opción B: Busca 'CBC' en tu workspace")
|
|
print("\n3. En la página de la base de datos, busca el botón '...' ")
|
|
print(" (tres puntos) en la esquina SUPERIOR DERECHA")
|
|
print("\n4. En el menú que se abre, busca:")
|
|
print(" • 'Connections' (en inglés)")
|
|
print(" • 'Conexiones' (en español)")
|
|
print(" • 'Connect to' (puede variar)")
|
|
print("\n5. Haz click y verás un menú de integraciones")
|
|
print("\n6. Busca tu integración en la lista")
|
|
print(" (Debería tener el nombre que le pusiste al crearla)")
|
|
print("\n7. Haz click en tu integración para activarla")
|
|
print("\n8. Confirma los permisos cuando te lo pida")
|
|
print("\n9. Deberías ver un mensaje confirmando la conexión")
|
|
print("\n10. ¡Listo! Vuelve a ejecutar:")
|
|
print(" python verify_notion_permissions.py\n")
|
|
print("=" * 70)
|
|
|
|
# Crear una página de prueba simple para verificar
|
|
print("\n💡 ALTERNATIVA: Crear una nueva página de prueba\n")
|
|
print("Si no encuentras la opción de conexiones en tu base de datos,")
|
|
print("puedes crear una página nueva y compartirla con la integración:\n")
|
|
print("1. Crea una nueva página en Notion")
|
|
print("2. En esa página, click en 'Share' (Compartir)")
|
|
print("3. Busca tu integración y agrégala")
|
|
print("4. Luego convierte esa página en una base de datos")
|
|
print("5. Usa el ID de esa nueva base de datos\n")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|