feat: Integración automática con Notion + análisis completo del código
- 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
This commit is contained in:
126
create_notion_database.py
Normal file
126
create_notion_database.py
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script para crear una nueva base de datos de Notion y compartirla automáticamente
|
||||
"""
|
||||
|
||||
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("🛠️ CREAR BASE DE DATOS DE NOTION PARA CBCFACIL")
|
||||
print("=" * 70 + "\n")
|
||||
|
||||
token = settings.NOTION_API_TOKEN
|
||||
if not token:
|
||||
print("❌ Token no configurado en .env")
|
||||
return
|
||||
|
||||
client = Client(auth=token)
|
||||
|
||||
# Primero, buscar una página donde crear la database
|
||||
print("🔍 Buscando páginas accesibles...\n")
|
||||
results = client.search(page_size=100)
|
||||
pages = [p for p in results.get("results", []) if p.get("object") == "page"]
|
||||
|
||||
if not pages:
|
||||
print("❌ No tienes páginas accesibles.")
|
||||
print("\n📋 SOLUCIÓN:")
|
||||
print("1. Ve a Notion y crea una nueva página")
|
||||
print("2. En esa página, click en 'Share'")
|
||||
print("3. Busca y agrega tu integración")
|
||||
print("4. Ejecuta este script nuevamente\n")
|
||||
return
|
||||
|
||||
# Mostrar páginas disponibles
|
||||
print(f"✅ Encontradas {len(pages)} página(s) accesibles:\n")
|
||||
for i, page in enumerate(pages[:10], 1):
|
||||
page_id = page.get("id")
|
||||
props = page.get("properties", {})
|
||||
|
||||
# Intentar obtener el título
|
||||
title = "Sin título"
|
||||
for prop_name, prop_data in props.items():
|
||||
if prop_data.get("type") == "title":
|
||||
title_list = prop_data.get("title", [])
|
||||
if title_list:
|
||||
title = title_list[0].get("plain_text", "Sin título")
|
||||
break
|
||||
|
||||
print(f"{i}. {title[:50]}")
|
||||
print(f" ID: {page_id}\n")
|
||||
|
||||
# Usar la primera página accesible
|
||||
parent_page = pages[0]
|
||||
parent_id = parent_page.get("id")
|
||||
|
||||
print("=" * 70)
|
||||
print(f"📄 Voy a crear la base de datos dentro de la primera página")
|
||||
print("=" * 70 + "\n")
|
||||
|
||||
try:
|
||||
# Crear la base de datos
|
||||
print("🚀 Creando base de datos 'CBCFacil - Documentos'...\n")
|
||||
|
||||
database = client.databases.create(
|
||||
parent={"page_id": parent_id},
|
||||
title=[
|
||||
{
|
||||
"type": "text",
|
||||
"text": {"content": "CBCFacil - Documentos Procesados"},
|
||||
}
|
||||
],
|
||||
properties={
|
||||
"Name": {"title": {}},
|
||||
"Status": {
|
||||
"select": {
|
||||
"options": [
|
||||
{"name": "Procesado", "color": "green"},
|
||||
{"name": "En Proceso", "color": "yellow"},
|
||||
{"name": "Error", "color": "red"},
|
||||
]
|
||||
}
|
||||
},
|
||||
"Tipo": {
|
||||
"select": {
|
||||
"options": [
|
||||
{"name": "AUDIO", "color": "purple"},
|
||||
{"name": "PDF", "color": "orange"},
|
||||
{"name": "TEXTO", "color": "gray"},
|
||||
]
|
||||
}
|
||||
},
|
||||
"Fecha": {"date": {}},
|
||||
},
|
||||
)
|
||||
|
||||
db_id = database["id"]
|
||||
|
||||
print("✅ ¡Base de datos creada exitosamente!")
|
||||
print("=" * 70)
|
||||
print(f"\n📊 Información de la base de datos:\n")
|
||||
print(f" Nombre: CBCFacil - Documentos Procesados")
|
||||
print(f" ID: {db_id}")
|
||||
print(f" URL: https://notion.so/{db_id.replace('-', '')}")
|
||||
print("\n=" * 70)
|
||||
print("\n🎯 SIGUIENTE PASO:")
|
||||
print("=" * 70)
|
||||
print(f"\nActualiza tu archivo .env con:\n")
|
||||
print(f"NOTION_DATABASE_ID={db_id}\n")
|
||||
print("Luego ejecuta:")
|
||||
print("python test_notion_integration.py\n")
|
||||
print("=" * 70 + "\n")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error creando base de datos: {e}")
|
||||
print("\nVerifica que la integración tenga permisos de escritura.\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user