FlotillasGPS - Sistema completo de monitoreo de flotillas GPS
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.
This commit is contained in:
97
backend/app/schemas/base.py
Normal file
97
backend/app/schemas/base.py
Normal file
@@ -0,0 +1,97 @@
|
||||
"""
|
||||
Schemas base y utilidades comunes para Pydantic.
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Generic, List, Optional, TypeVar
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
|
||||
class BaseSchema(BaseModel):
|
||||
"""Schema base con configuración común."""
|
||||
|
||||
model_config = ConfigDict(
|
||||
from_attributes=True,
|
||||
populate_by_name=True,
|
||||
use_enum_values=True,
|
||||
json_encoders={datetime: lambda v: v.isoformat()},
|
||||
)
|
||||
|
||||
|
||||
class TimestampSchema(BaseSchema):
|
||||
"""Schema con campos de timestamp."""
|
||||
|
||||
creado_en: datetime
|
||||
actualizado_en: datetime
|
||||
|
||||
|
||||
# Type variable para paginación genérica
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
class PaginatedResponse(BaseModel, Generic[T]):
|
||||
"""Respuesta paginada genérica."""
|
||||
|
||||
items: List[T]
|
||||
total: int
|
||||
page: int
|
||||
page_size: int
|
||||
pages: int
|
||||
|
||||
@property
|
||||
def has_next(self) -> bool:
|
||||
return self.page < self.pages
|
||||
|
||||
@property
|
||||
def has_prev(self) -> bool:
|
||||
return self.page > 1
|
||||
|
||||
|
||||
class MessageResponse(BaseModel):
|
||||
"""Respuesta simple con mensaje."""
|
||||
|
||||
message: str
|
||||
success: bool = True
|
||||
|
||||
|
||||
class ErrorResponse(BaseModel):
|
||||
"""Respuesta de error."""
|
||||
|
||||
error: dict
|
||||
|
||||
|
||||
class GeoJSONPoint(BaseModel):
|
||||
"""Schema para punto GeoJSON."""
|
||||
|
||||
type: str = "Point"
|
||||
coordinates: List[float] # [lng, lat]
|
||||
|
||||
|
||||
class GeoJSONFeature(BaseModel):
|
||||
"""Schema para feature GeoJSON."""
|
||||
|
||||
type: str = "Feature"
|
||||
geometry: dict
|
||||
properties: dict
|
||||
|
||||
|
||||
class GeoJSONFeatureCollection(BaseModel):
|
||||
"""Schema para colección de features GeoJSON."""
|
||||
|
||||
type: str = "FeatureCollection"
|
||||
features: List[GeoJSONFeature]
|
||||
|
||||
|
||||
class CoordenadasSchema(BaseModel):
|
||||
"""Schema para coordenadas simples."""
|
||||
|
||||
lat: float
|
||||
lng: float
|
||||
|
||||
|
||||
class RangoFechasSchema(BaseModel):
|
||||
"""Schema para filtros de rango de fechas."""
|
||||
|
||||
desde: Optional[datetime] = None
|
||||
hasta: Optional[datetime] = None
|
||||
Reference in New Issue
Block a user