- 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>
67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
"""
|
|
Modelo de ContentCalendar - Calendario de publicación.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from sqlalchemy import Column, Integer, String, Time, Boolean, DateTime
|
|
from sqlalchemy.dialects.postgresql import ARRAY
|
|
|
|
from app.core.database import Base
|
|
|
|
|
|
class ContentCalendar(Base):
|
|
"""Modelo para el calendario de contenido."""
|
|
|
|
__tablename__ = "content_calendar"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
|
|
# Programación
|
|
day_of_week = Column(Integer, nullable=False) # 0=Lunes, 6=Domingo
|
|
time = Column(Time, nullable=False) # Hora de publicación
|
|
|
|
# Tipo de contenido
|
|
content_type = Column(String(50), nullable=False)
|
|
# Tipos: tip_tech, dato_curioso, producto, servicio, etc.
|
|
|
|
# Plataformas
|
|
platforms = Column(ARRAY(String), nullable=False)
|
|
# Ejemplo: ["x", "threads", "instagram"]
|
|
|
|
# Configuración
|
|
is_active = Column(Boolean, default=True)
|
|
requires_approval = Column(Boolean, default=False)
|
|
|
|
# Restricciones opcionales
|
|
category_filter = Column(String(100), nullable=True) # Solo tips de esta categoría
|
|
priority = Column(Integer, default=0) # Mayor = más prioritario
|
|
|
|
# Descripción
|
|
description = Column(String(255), nullable=True)
|
|
# Ejemplo: "Tip tech diario matutino"
|
|
|
|
# Timestamps
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
def __repr__(self):
|
|
return f"<ContentCalendar {self.day_of_week} {self.time} - {self.content_type}>"
|
|
|
|
def to_dict(self):
|
|
"""Convertir a diccionario."""
|
|
days = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]
|
|
return {
|
|
"id": self.id,
|
|
"day_of_week": self.day_of_week,
|
|
"day_name": days[self.day_of_week] if 0 <= self.day_of_week <= 6 else "Desconocido",
|
|
"time": self.time.strftime("%H:%M") if self.time else None,
|
|
"content_type": self.content_type,
|
|
"platforms": self.platforms,
|
|
"is_active": self.is_active,
|
|
"requires_approval": self.requires_approval,
|
|
"category_filter": self.category_filter,
|
|
"priority": self.priority,
|
|
"description": self.description,
|
|
"created_at": self.created_at.isoformat() if self.created_at else None
|
|
}
|