forked from TDTP/admin_transporte_backend
123 lines
4.1 KiB
Python
Executable File
123 lines
4.1 KiB
Python
Executable File
|
|
from rest_framework import viewsets
|
|
from django.http import JsonResponse
|
|
from django.db.models import F
|
|
from django.db import connection
|
|
from django_filters.rest_framework import DjangoFilterBackend
|
|
from rest_framework.decorators import action
|
|
from api import models, serializers
|
|
from os import getenv
|
|
import redis
|
|
import json
|
|
import logging
|
|
|
|
# funcion para registrar en mongo
|
|
from logger.views import save_log_dispositivo
|
|
|
|
class DispositivoViewSet(viewsets.ModelViewSet):
|
|
queryset = models.Dispositivo.objects.all()
|
|
serializer_class = serializers.DispositivoSerializer
|
|
filter_backends = [DjangoFilterBackend]
|
|
filterset_fields = ['id_paradero', 'id_tipo_dispositivo']
|
|
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def whoami(self, request, pk=None):
|
|
input = json.loads(request.body)
|
|
whoami = input['whoami']
|
|
|
|
record = models.Paradero.objects \
|
|
.filter(dispositivo__id_dispositivo=whoami['idDispositivo']) \
|
|
.annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \
|
|
.first()
|
|
|
|
if (record):
|
|
save_log_dispositivo(id_dispositivo=whoami['idDispositivo'], accion_url='whoami')
|
|
|
|
return JsonResponse({
|
|
"WhoamiResponse": {
|
|
"NroParadero": record.nro_paradero,
|
|
"NombreParadero": record.nombre_paradero,
|
|
"Status": "OK"
|
|
}
|
|
})
|
|
|
|
# retorna json de no existente
|
|
return JsonResponse({
|
|
"WhoamiResponse": {
|
|
"Status": "NOK",
|
|
"errorString": "Dispositivo no identificado"
|
|
}
|
|
})
|
|
|
|
|
|
@action(detail=False, methods=['post'])
|
|
def getInfoDevice(self, request, pk=None):
|
|
input = json.loads(request.body)
|
|
getInfoDevice = input['GetInfoDevice']
|
|
|
|
record = models.Paradero.objects \
|
|
.filter(dispositivo__id_dispositivo=getInfoDevice['idDispositivo']) \
|
|
.annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \
|
|
.first()
|
|
|
|
db_host = getenv('DB_REDIS_HOST')
|
|
db_port = getenv('DB_REDIS_PORT')
|
|
r = redis.Redis(host=db_host, port=db_port, decode_responses=True)
|
|
|
|
key = f'stop_id:{record.nro_paradero}'
|
|
json_trayectos = r.get(key)
|
|
if json_trayectos != None:
|
|
trayectos = json.loads(json_trayectos)
|
|
else:
|
|
trayectos = []
|
|
|
|
|
|
lineas = {}
|
|
lineas_agrupadas = {}
|
|
for t in trayectos:
|
|
|
|
pk_linea = f'{t["route_id"]}-{t["direction_id"]}'
|
|
if pk_linea not in lineas:
|
|
lineas[pk_linea] = models.Linea.objects.filter(id_linea=pk_linea).first()
|
|
|
|
linea = lineas[pk_linea]
|
|
|
|
if linea == None:
|
|
logging.error(pk_linea)
|
|
|
|
if linea != None:
|
|
if pk_linea not in lineas_agrupadas:
|
|
lineas_agrupadas[pk_linea] = {
|
|
'Linea': linea.route_long_name,
|
|
'Descripcion': linea.route_short_name,
|
|
'TipoLocomocion': linea.route_type.descripcion,
|
|
'colorFondo': linea.route_color,
|
|
'colorTexto': linea.route_text_color,
|
|
'Llegadas': []
|
|
}
|
|
|
|
lineas_agrupadas[pk_linea]['Llegadas'].append({
|
|
'patente': t['vehicle_license_plate'],
|
|
'Planificada': None,
|
|
'EstimadaGPS': t['hora_llegada'],
|
|
'DistanciaGPS': None,
|
|
'Mensajelinea': None,
|
|
})
|
|
|
|
|
|
detalle_lineas = []
|
|
for pk_linea in lineas_agrupadas:
|
|
detalle_lineas.append(lineas_agrupadas[pk_linea])
|
|
|
|
save_log_dispositivo(id_dispositivo=getInfoDevice['idDispositivo'], accion_url='getInfoDevice')
|
|
|
|
return JsonResponse({
|
|
"GetInfoDeviceResponse": {
|
|
"DetalleLineas": detalle_lineas,
|
|
"MensajeParadero": "No considerar, uso futuro",
|
|
"NroParadero": record.nro_paradero,
|
|
"NombreParadero": record.nombre_paradero
|
|
}
|
|
})
|