Sistema completo para monitoreo y gestion de flotas de vehiculos con: - Backend FastAPI con PostgreSQL/TimescaleDB - Frontend React con TypeScript y TailwindCSS - App movil React Native con Expo - Soporte para dispositivos GPS, Meshtastic y celulares - Video streaming en vivo con MediaMTX - Geocercas, alertas, viajes y reportes - Autenticacion JWT y WebSockets en tiempo real Documentacion completa y guias de usuario incluidas.
44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
"""
|
|
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
|