- Estructura completa del proyecto con FastAPI - Modelos de base de datos (productos, servicios, posts, calendario, interacciones) - Publishers para X, Threads, Instagram, Facebook - Generador de contenido con DeepSeek API - Worker de Celery con tareas programadas - Dashboard básico con templates HTML - Docker Compose para despliegue - Documentación completa Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
181 lines
7.2 KiB
Python
181 lines
7.2 KiB
Python
"""
|
|
Script para poblar la base de datos con datos iniciales.
|
|
"""
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
from datetime import time
|
|
|
|
# Agregar el directorio raíz al path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from app.core.database import SessionLocal, engine
|
|
from app.models import Base, TipTemplate, ContentCalendar, Service
|
|
|
|
|
|
def seed_tips():
|
|
"""Cargar tips iniciales."""
|
|
db = SessionLocal()
|
|
|
|
try:
|
|
# Cargar JSON de tips
|
|
tips_file = Path(__file__).parent.parent / "data" / "tips_iniciales.json"
|
|
with open(tips_file, "r", encoding="utf-8") as f:
|
|
tips_data = json.load(f)
|
|
|
|
for tip in tips_data:
|
|
existing = db.query(TipTemplate).filter(
|
|
TipTemplate.title == tip["title"]
|
|
).first()
|
|
|
|
if not existing:
|
|
new_tip = TipTemplate(
|
|
category=tip["category"],
|
|
title=tip["title"],
|
|
template=tip["template"],
|
|
difficulty=tip.get("difficulty", "basico"),
|
|
is_active=True,
|
|
is_evergreen=True
|
|
)
|
|
db.add(new_tip)
|
|
|
|
db.commit()
|
|
print(f"✅ {len(tips_data)} tips cargados")
|
|
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
def seed_calendar():
|
|
"""Crear calendario inicial."""
|
|
db = SessionLocal()
|
|
|
|
try:
|
|
# Calendario de ejemplo
|
|
calendar_entries = [
|
|
# Tips diarios - mañana
|
|
{"day": 0, "time": "09:00", "type": "tip_tech", "platforms": ["x", "threads", "instagram"]},
|
|
{"day": 1, "time": "09:00", "type": "tip_tech", "platforms": ["x", "threads", "instagram"]},
|
|
{"day": 2, "time": "09:00", "type": "tip_tech", "platforms": ["x", "threads", "instagram"]},
|
|
{"day": 3, "time": "09:00", "type": "tip_tech", "platforms": ["x", "threads", "instagram"]},
|
|
{"day": 4, "time": "09:00", "type": "tip_tech", "platforms": ["x", "threads", "instagram"]},
|
|
|
|
# Tips diarios - tarde
|
|
{"day": 0, "time": "15:00", "type": "dato_curioso", "platforms": ["x", "threads"]},
|
|
{"day": 1, "time": "15:00", "type": "dato_curioso", "platforms": ["x", "threads"]},
|
|
{"day": 2, "time": "15:00", "type": "dato_curioso", "platforms": ["x", "threads"]},
|
|
{"day": 3, "time": "15:00", "type": "dato_curioso", "platforms": ["x", "threads"]},
|
|
{"day": 4, "time": "15:00", "type": "dato_curioso", "platforms": ["x", "threads"]},
|
|
|
|
# Productos - Lunes, Miércoles, Viernes
|
|
{"day": 0, "time": "12:00", "type": "producto", "platforms": ["facebook", "instagram"], "approval": True},
|
|
{"day": 2, "time": "12:00", "type": "producto", "platforms": ["facebook", "instagram"], "approval": True},
|
|
{"day": 4, "time": "12:00", "type": "producto", "platforms": ["facebook", "instagram"], "approval": True},
|
|
|
|
# Servicios - Martes, Jueves
|
|
{"day": 1, "time": "11:00", "type": "servicio", "platforms": ["x", "facebook", "instagram"], "approval": True},
|
|
{"day": 3, "time": "11:00", "type": "servicio", "platforms": ["x", "facebook", "instagram"], "approval": True},
|
|
|
|
# Frases motivacionales - Lunes, Miércoles, Viernes
|
|
{"day": 0, "time": "07:00", "type": "frase_motivacional", "platforms": ["instagram", "facebook"]},
|
|
{"day": 2, "time": "07:00", "type": "frase_motivacional", "platforms": ["instagram", "facebook"]},
|
|
{"day": 4, "time": "07:00", "type": "frase_motivacional", "platforms": ["instagram", "facebook"]},
|
|
]
|
|
|
|
for entry in calendar_entries:
|
|
hour, minute = map(int, entry["time"].split(":"))
|
|
|
|
new_entry = ContentCalendar(
|
|
day_of_week=entry["day"],
|
|
time=time(hour=hour, minute=minute),
|
|
content_type=entry["type"],
|
|
platforms=entry["platforms"],
|
|
requires_approval=entry.get("approval", False),
|
|
is_active=True
|
|
)
|
|
db.add(new_entry)
|
|
|
|
db.commit()
|
|
print(f"✅ {len(calendar_entries)} entradas de calendario creadas")
|
|
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
def seed_services():
|
|
"""Crear servicios iniciales."""
|
|
db = SessionLocal()
|
|
|
|
try:
|
|
services = [
|
|
{
|
|
"name": "Chatbots Inteligentes",
|
|
"description": "Implementamos chatbots con IA para WhatsApp e Instagram que atienden a tus clientes 24/7.",
|
|
"short_description": "Chatbots IA para WhatsApp e Instagram",
|
|
"category": "automatizacion",
|
|
"target_sectors": ["retail", "servicios", "hoteles"],
|
|
"benefits": ["Atención 24/7", "Respuestas instantáneas", "Integración con CRM", "Escalamiento a humanos"],
|
|
"call_to_action": "Agenda una demo gratuita"
|
|
},
|
|
{
|
|
"name": "Sistemas para Hoteles",
|
|
"description": "Software completo para gestión hotelera: reservas, nómina, inventario y dashboards financieros.",
|
|
"short_description": "Gestión hotelera integral",
|
|
"category": "desarrollo",
|
|
"target_sectors": ["hoteles", "turismo"],
|
|
"benefits": ["Control de reservas", "Gestión de nómina", "Inventario automatizado", "Reportes en tiempo real"],
|
|
"call_to_action": "Solicita una cotización"
|
|
},
|
|
{
|
|
"name": "Automatización de Procesos",
|
|
"description": "Automatizamos tareas repetitivas con bots y flujos de trabajo inteligentes.",
|
|
"short_description": "Automatiza tareas repetitivas",
|
|
"category": "automatizacion",
|
|
"target_sectors": ["empresas", "pymes", "corporativos"],
|
|
"benefits": ["Ahorro de tiempo", "Reducción de errores", "Mayor productividad", "ROI medible"],
|
|
"call_to_action": "Cuéntanos tu proceso"
|
|
},
|
|
{
|
|
"name": "Integración de IA",
|
|
"description": "Integramos inteligencia artificial en tus procesos de negocio para tomar mejores decisiones.",
|
|
"short_description": "IA para tu negocio",
|
|
"category": "ia",
|
|
"target_sectors": ["empresas", "pymes", "corporativos"],
|
|
"benefits": ["Análisis predictivo", "Automatización inteligente", "Insights de datos", "Ventaja competitiva"],
|
|
"call_to_action": "Descubre cómo la IA puede ayudarte"
|
|
}
|
|
]
|
|
|
|
for service in services:
|
|
existing = db.query(Service).filter(Service.name == service["name"]).first()
|
|
|
|
if not existing:
|
|
new_service = Service(**service, is_active=True)
|
|
db.add(new_service)
|
|
|
|
db.commit()
|
|
print(f"✅ {len(services)} servicios creados")
|
|
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
def main():
|
|
"""Ejecutar todos los seeds."""
|
|
print("🌱 Iniciando seed de base de datos...\n")
|
|
|
|
# Crear tablas
|
|
Base.metadata.create_all(bind=engine)
|
|
print("✅ Tablas creadas\n")
|
|
|
|
seed_tips()
|
|
seed_calendar()
|
|
seed_services()
|
|
|
|
print("\n✅ Seed completado!")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|