""" Clases y mixins base para los modelos SQLAlchemy. """ from datetime import datetime, timezone from sqlalchemy import DateTime, func from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base class TimestampMixin: """Mixin que agrega campos de timestamp (creado_en, actualizado_en).""" creado_en: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), server_default=func.now(), nullable=False, ) actualizado_en: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), server_default=func.now(), onupdate=lambda: datetime.now(timezone.utc), nullable=False, ) class SoftDeleteMixin: """Mixin para soft delete (eliminado_en en lugar de borrar físicamente).""" eliminado_en: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, default=None, ) @property def is_deleted(self) -> bool: """Verifica si el registro está eliminado.""" return self.eliminado_en is not None