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.
93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
"""
|
|
Schemas Pydantic para Dispositivo GPS/Tracker.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from pydantic import Field
|
|
|
|
from app.schemas.base import BaseSchema, TimestampSchema
|
|
|
|
|
|
class DispositivoBase(BaseSchema):
|
|
"""Schema base de dispositivo."""
|
|
|
|
tipo: str = Field(default="gps", max_length=50)
|
|
identificador: str = Field(..., min_length=1, max_length=100)
|
|
nombre: Optional[str] = Field(None, max_length=100)
|
|
marca: Optional[str] = Field(None, max_length=50)
|
|
modelo: Optional[str] = Field(None, max_length=50)
|
|
numero_serie: Optional[str] = Field(None, max_length=100)
|
|
telefono_sim: Optional[str] = Field(None, max_length=20)
|
|
operador_sim: Optional[str] = Field(None, max_length=50)
|
|
iccid: Optional[str] = Field(None, max_length=25)
|
|
imei: Optional[str] = Field(None, max_length=20)
|
|
protocolo: str = Field(default="osmand", max_length=50)
|
|
intervalo_reporte: int = Field(default=30, ge=1, le=3600)
|
|
|
|
|
|
class DispositivoCreate(DispositivoBase):
|
|
"""Schema para crear dispositivo."""
|
|
|
|
vehiculo_id: int
|
|
|
|
|
|
class DispositivoUpdate(BaseSchema):
|
|
"""Schema para actualizar dispositivo."""
|
|
|
|
tipo: Optional[str] = Field(None, max_length=50)
|
|
nombre: Optional[str] = Field(None, max_length=100)
|
|
marca: Optional[str] = Field(None, max_length=50)
|
|
modelo: Optional[str] = Field(None, max_length=50)
|
|
numero_serie: Optional[str] = Field(None, max_length=100)
|
|
telefono_sim: Optional[str] = Field(None, max_length=20)
|
|
operador_sim: Optional[str] = Field(None, max_length=50)
|
|
iccid: Optional[str] = Field(None, max_length=25)
|
|
imei: Optional[str] = Field(None, max_length=20)
|
|
protocolo: Optional[str] = Field(None, max_length=50)
|
|
intervalo_reporte: Optional[int] = Field(None, ge=1, le=3600)
|
|
configuracion: Optional[str] = None
|
|
firmware_version: Optional[str] = Field(None, max_length=50)
|
|
activo: Optional[bool] = None
|
|
notas: Optional[str] = None
|
|
|
|
|
|
class DispositivoResponse(DispositivoBase, TimestampSchema):
|
|
"""Schema de respuesta de dispositivo."""
|
|
|
|
id: int
|
|
vehiculo_id: int
|
|
ultimo_contacto: Optional[datetime] = None
|
|
bateria: Optional[float] = None
|
|
señal_gsm: Optional[int] = None
|
|
satelites: Optional[int] = None
|
|
configuracion: Optional[str] = None
|
|
firmware_version: Optional[str] = None
|
|
activo: bool
|
|
conectado: bool
|
|
notas: Optional[str] = None
|
|
|
|
# Calculado
|
|
esta_online: bool
|
|
|
|
|
|
class DispositivoResumen(BaseSchema):
|
|
"""Schema resumido de dispositivo."""
|
|
|
|
id: int
|
|
identificador: str
|
|
tipo: str
|
|
protocolo: str
|
|
activo: bool
|
|
conectado: bool
|
|
ultimo_contacto: Optional[datetime] = None
|
|
bateria: Optional[float] = None
|
|
|
|
|
|
class DispositivoConVehiculo(DispositivoResponse):
|
|
"""Schema de dispositivo con información del vehículo."""
|
|
|
|
vehiculo_nombre: Optional[str] = None
|
|
vehiculo_placa: Optional[str] = None
|