cambios sabado 2 de marzo 2024

master
Francisco Sandoval 2024-03-02 18:10:38 -03:00
parent 1e6cdd8855
commit f71f82f2ed
6 changed files with 243 additions and 58 deletions

View File

@ -68,6 +68,20 @@ Content-Type: application/json
} }
###
# @name get_info_device2
POST {{server}}/dispositivos/getInfoDevice/
Authorization: Bearer {{token}}
Content-Type: application/json
{
"GetInfoDevice": {
"idDispositivo": "00000000160f3b42b8:27:eb:0f:3b:42",
"KeyAutorizacion":"token"
}
}
### ###

View File

@ -8,8 +8,8 @@ POST {{server}}/auth/
Content-Type: application/json Content-Type: application/json
{ {
"rut": "22222222-2", "rut": "11111111-1",
"password": "usuario2" "password": "usuario1"
} }
### ###

View File

@ -1,8 +1,4 @@
ALTER TABLE rol_linea drop CONSTRAINT IF EXISTS rol_linea_id_linea_fkey;
-----
ALTER TABLE linea_paradero drop CONSTRAINT IF EXISTS linea_paradero_id_linea_fkey; ALTER TABLE linea_paradero drop CONSTRAINT IF EXISTS linea_paradero_id_linea_fkey;
----- -----
@ -51,6 +47,10 @@ delete from linea_paradero;
----- -----
delete from linea;
-----
update linea update linea
set vigente = false set vigente = false
where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' ) where id_red in (select id_red from gtfs_archivo where trim(upper(status))='PROCESANDO' )
@ -202,11 +202,10 @@ set id_comuna = (select id_comuna from comuna_georeferencia as c where ST_Contai
where id_comuna is not null; where id_comuna is not null;
----- -----
delete from rol_linea where id_linea not in (select id_linea from linea); insert into dispositivo
select 'QRCode-'||id_paradero , id_paradero , true, null, 3
----- from paradero as p where id_paradero
not in (select id_paradero from dispositivo as d where id_tipo_dispositivo=3 and d.id_paradero = p.id_paradero);
ALTER TABLE rol_linea ADD CONSTRAINT rol_linea_id_linea_fkey FOREIGN KEY (id_linea) REFERENCES linea(id_linea);
----- -----

View File

@ -1,9 +1,10 @@
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.decorators import action
from django.http import JsonResponse from django.http import JsonResponse
from django.db.models import F from django.db.models import F
from django.db import connection
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.decorators import action
from api import models, serializers from api import models, serializers
from os import getenv from os import getenv
import redis import redis
@ -55,7 +56,8 @@ class DispositivoViewSet(viewsets.ModelViewSet):
input = json.loads(request.body) input = json.loads(request.body)
getInfoDevice = input['GetInfoDevice'] getInfoDevice = input['GetInfoDevice']
record = models.Paradero.objects \ cursor = connection.cursor()
paradero = models.Paradero.objects \
.filter(dispositivo__id_dispositivo=getInfoDevice['idDispositivo']) \ .filter(dispositivo__id_dispositivo=getInfoDevice['idDispositivo']) \
.annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \ .annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \
.first() .first()
@ -64,58 +66,160 @@ class DispositivoViewSet(viewsets.ModelViewSet):
db_port = getenv('DB_REDIS_PORT') db_port = getenv('DB_REDIS_PORT')
r = redis.Redis(host=db_host, port=db_port, decode_responses=True) r = redis.Redis(host=db_host, port=db_port, decode_responses=True)
key = f'stop_id:{record.nro_paradero}' key = f'stop_id:{paradero.nro_paradero}'
json_trayectos = r.get(key) json_trayectos = r.get(key)
trayectos = []
if json_trayectos != None: if json_trayectos != None:
trayectos = json.loads(json_trayectos) trayectos = json.loads(json_trayectos)
else:
trayectos = []
key = f'stop_id:none'
json_trayectos = r.get(key)
trayectos_none = []
if json_trayectos != None:
trayectos_none = json.loads(json_trayectos)
lineas = {} # agregar al listado los trayecto en donde no se registro el paradero
lineas_agrupadas = {} """
for t in trayectos: json_trayectos = r.get('stop_id:none')
trayectos_none = []
pk_linea = f'{t["route_id"]}-{t["direction_id"]}' if json_trayectos != None:
if pk_linea not in lineas: trayectos_none = json.loads(json_trayectos)
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,
})
for trayecto in trayectos_none:
trayecto['stop_id'] = 'none'
trayecto['hora_llegada'] = None
trayectos.append(trayecto)
"""
lineas = models.Linea.objects.filter(lineaparadero__id_paradero = paradero.id_paradero).order_by('route_short_name')
detalle_lineas = [] detalle_lineas = []
for pk_linea in lineas_agrupadas: for linea in lineas:
detalle_lineas.append(lineas_agrupadas[pk_linea]) llegadas = []
save_log_dispositivo(id_dispositivo=getInfoDevice['idDispositivo'], accion_url='getInfoDevice') for trayecto in trayectos:
id_linea = f"{trayecto['route_id']}-{trayecto['direction_id']}"
stop_id = trayecto['stop_id']
patente = trayecto['vehicle_license_plate']
trayecto['stop_id_alterno'] = None
if id_linea == linea.id_linea:
hora_llegada = trayecto['hora_llegada']
distancia_km = None
# si no trae latitud ni longitud: buscar en trayectos_none por patente
# y sobreescribir latitud y longitud
if trayecto['latitude'] == 0 and trayecto['longitude'] == 0:
for trayecto_none in trayectos_none:
if patente == trayecto_none['vehicle_license_plate']:
trayecto['longitude'] = trayecto_none['longitude']
trayecto['latitude'] = trayecto_none['latitude']
trayecto['stop_id_alterno'] = 'none'
break
if trayecto['latitude'] != 0 and trayecto['longitude'] != 0:
trip_id = trayecto['trip_id']
velocidad_promedio = 80
p_lon = trayecto['longitude']
p_lat = trayecto['latitude']
sql = "select hora_llegada, distancia_km from fn_gtfs_calcula_distancia_tiempo_llegada(%s,%s,%s,%s,%s)"
cursor.execute(sql, [trip_id, stop_id, velocidad_promedio, p_lon, p_lat])
row = cursor.fetchone()
if patente == 'FDCB32':
print(f'SQL: {sql}', flush=True)
print(f'params: {[trip_id, stop_id, velocidad_promedio, p_lon, p_lat]}', flush=True)
print(f'row: {row}', flush=True)
if row != None:
hora_llegada = row[0].strftime('%H:%M:%S')
distancia_km = row[1]
llegadas.append({
'patente': trayecto['vehicle_license_plate'],
'Planificada': trayecto['hora_llegada'],
'Latitud': trayecto['latitude'],
'Longitud': trayecto['longitude'],
'stop_id_alterno': trayecto['stop_id_alterno'],
'EstimadaGPS': hora_llegada,
'DistanciaGPS': distancia_km,
'Mensajelinea': None,
})
llegadas_ordendas = sorted(llegadas, key=lambda x: x['DistanciaGPS'])
item = {
'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': llegadas_ordendas
}
detalle_lineas.append(item)
# 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:
# print(pk_linea, flush=True)
# 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': []
# }
# sql = "select hora_llegada, distancia_km from fn_gtfs_calcula_distancia_tiempo_llegada(%s,%s,%s,%s,%s)"
# trip_id = t['trip_id']
# paradero_id = t['stop_id']
# velocidad_promedio = 30
# p_lon = t['longitude']
# p_lat = t['latitude']
# cursor.execute(sql, [trip_id, paradero_id, velocidad_promedio, p_lon, p_lat])
# row = cursor.fetchone()
# hora_llegada = None
# distancia_km = None
# if row != None:
# hora_llegada = row[0].strftime('%H:%M:%S')
# distancia_km = row[1]
# lineas_agrupadas[pk_linea]['Llegadas'].append({
# 'patente': t['vehicle_license_plate'],
# 'Planificada': t['hora_llegada'],
# 'EstimadaGPS': hora_llegada,
# 'DistanciaGPS': distancia_km,
# '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')
cursor.close()
return JsonResponse({ return JsonResponse({
"GetInfoDeviceResponse": { "GetInfoDeviceResponse": {
"DetalleLineas": detalle_lineas, "DetalleLineas": detalle_lineas,
"MensajeParadero": "No considerar, uso futuro", "MensajeParadero": "No considerar, uso futuro",
"NroParadero": record.nro_paradero, "NroParadero": paradero.nro_paradero,
"NombreParadero": record.nombre_paradero "NombreParadero": paradero.nombre_paradero,
"proto": trayectos,
} }
}) })

View File

@ -1,6 +1,6 @@
from rest_framework import viewsets from rest_framework import viewsets
# from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.filters import OrderingFilter from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
@ -46,6 +46,57 @@ class LineaViewSet(viewsets.ModelViewSet):
return JsonResponse(list(paraderos), safe=False) return JsonResponse(list(paraderos), safe=False)
# @action(detail=False, methods=['get'])
def ___buses(self, request, pk=None):
pk = request.GET['id_linea']
# 1. obtener todas los paraderos de redis
# 2. consultar en cada paradero si hay una linea que corresponda a la consultada
# 3. si existe se agrega el vehiculo
db_host = getenv('DB_REDIS_HOST')
db_port = getenv('DB_REDIS_PORT')
r = redis.Redis(host=db_host, port=db_port, decode_responses=True)
fileproto = r.get('fileproto')
paraderos_redis = r.keys('stop_id:*')
object_buses = {}
for key_paradero in paraderos_redis:
string_trayectos = r.get(key_paradero)
array_trayectos = json.loads(string_trayectos)
for trayecto in array_trayectos:
patente = trayecto['vehicle_license_plate']
id_linea = f"{trayecto['route_id']}-{trayecto['direction_id']}"
if id_linea == pk and key_paradero == 'stop_id:none':
print(trayecto, flush=True)
object_buses[patente] = {
'Patente_vehiculo': trayecto["vehicle_license_plate"],
'latitude': trayecto["latitude"],
'longitude': trayecto["longitude"],
'speed': trayecto["speed"]
}
if id_linea == pk and patente not in object_buses:
object_buses[patente] = {
'Patente_vehiculo': trayecto["vehicle_license_plate"],
'latitude': trayecto["latitude"],
'longitude': trayecto["longitude"],
'speed': trayecto["speed"]
}
array_buses = []
for patente in object_buses:
array_buses.append(object_buses[patente])
return Response({
'fileproto': fileproto,
'buses': array_buses
})
@action(detail=False, methods=['get']) @action(detail=False, methods=['get'])
def buses(self, request, pk=None): def buses(self, request, pk=None):
pk = request.GET['id_linea'] pk = request.GET['id_linea']
@ -80,6 +131,23 @@ class LineaViewSet(viewsets.ModelViewSet):
'speed': trayecto["speed"] 'speed': trayecto["speed"]
} }
key = f'stop_id:none'
data = r.get(key)
if data != None:
array_trayectos = json.loads(data)
for trayecto in array_trayectos:
key_route = f'{trayecto["route_id"]}-{trayecto["direction_id"]}'
if key_route == pk:
patente = trayecto["vehicle_license_plate"]
if (patente not in obj_buses) or (patente in obj_buses and obj_buses[patente]['longitude'] == 0 and obj_buses[patente]['latitude'] == 0):
obj_buses[patente] = {
'Patente_vehiculo': trayecto["vehicle_license_plate"],
'latitude': trayecto["latitude"],
'longitude': trayecto["longitude"],
'speed': trayecto["speed"]
}
for patente in obj_buses: for patente in obj_buses:
array_buses.append(obj_buses[patente]) array_buses.append(obj_buses[patente])
@ -97,8 +165,6 @@ class LineaViewSet(viewsets.ModelViewSet):
.filter(id_linea=pk) \ .filter(id_linea=pk) \
.first() .first()
logging.error(linea)
detalle_buses = [] detalle_buses = []
paraderos = models.Paradero.objects \ paraderos = models.Paradero.objects \
.filter(vigente=True, lineaparadero__id_linea=pk) \ .filter(vigente=True, lineaparadero__id_linea=pk) \

View File

@ -3,6 +3,7 @@ from rest_framework import viewsets
from rest_framework.decorators import action from rest_framework.decorators import action
from api.serializers import ParaderoSerializer from api.serializers import ParaderoSerializer
from api.models import Paradero, Dispositivo from api.models import Paradero, Dispositivo
from decouple import config
import logging import logging
class ParaderoViewSet(viewsets.ModelViewSet): class ParaderoViewSet(viewsets.ModelViewSet):
@ -41,7 +42,8 @@ class ParaderoViewSet(viewsets.ModelViewSet):
url = None url = None
if record != None: if record != None:
url = f'https://transporte-paradero.hz.kursor.cl/rutaParadero/?id={record.id_dispositivo}' base_url = config('URL_PARADERO', 'http://localhost/')
url = f'{base_url}{record.id_dispositivo}'
# url = f'{referer}/public/infoStop?codigoParadero={pk}' # url = f'{referer}/public/infoStop?codigoParadero={pk}'