""" Modelo de Mensaje para comunicación con conductores. """ from datetime import datetime from sqlalchemy import ( Boolean, DateTime, ForeignKey, Index, String, Text, ) from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.database import Base from app.models.base import TimestampMixin class Mensaje(Base, TimestampMixin): """Modelo para mensajes entre administradores y conductores.""" __tablename__ = "mensajes" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) # Conductor asociado conductor_id: Mapped[int] = mapped_column( ForeignKey("conductores.id", ondelete="CASCADE"), nullable=False, index=True, ) # Dirección del mensaje de_admin: Mapped[bool] = mapped_column(Boolean, nullable=False) # True = admin->conductor, False = conductor->admin # Usuario admin que envió/recibió (si aplica) usuario_id: Mapped[int | None] = mapped_column( ForeignKey("usuarios.id", ondelete="SET NULL"), nullable=True, ) # Contenido asunto: Mapped[str | None] = mapped_column(String(200), nullable=True) contenido: Mapped[str] = mapped_column(Text, nullable=False) # Tipo de mensaje tipo: Mapped[str] = mapped_column( String(20), default="texto", nullable=False, ) # texto, alerta, instruccion, emergencia # Prioridad prioridad: Mapped[str] = mapped_column( String(20), default="normal", nullable=False, ) # baja, normal, alta, urgente # Estado de lectura leido: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) leido_en: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) # Archivos adjuntos (JSON array de URLs) adjuntos: Mapped[str | None] = mapped_column(Text, nullable=True) # Respuesta a otro mensaje respuesta_a_id: Mapped[int | None] = mapped_column( ForeignKey("mensajes.id", ondelete="SET NULL"), nullable=True, ) # Mensaje eliminado (soft delete) eliminado_por_admin: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) eliminado_por_conductor: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) # Relaciones ORM conductor: Mapped["Conductor"] = relationship( "Conductor", back_populates="mensajes", lazy="selectin", ) # Índices __table_args__ = ( Index("idx_mensajes_conductor_creado", "conductor_id", "creado_en"), Index("idx_mensajes_leido", "leido"), ) def __repr__(self) -> str: direccion = "admin->conductor" if self.de_admin else "conductor->admin" return f""