Implementación inicial del sistema de automatización de redes sociales
- 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>
This commit is contained in:
66
app/models/content_calendar.py
Normal file
66
app/models/content_calendar.py
Normal file
@@ -0,0 +1,66 @@
|
||||
"""
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user