actualizacion into develop/Ronald

develop/Ronald
Ronald Morales 2024-03-06 15:34:48 -03:00
commit 68c4f6a272
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
{
"rut": "22222222-2",
"password": "usuario2"
"rut": "11111111-1",
"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;
-----
@ -51,6 +47,10 @@ delete from linea_paradero;
-----
delete from linea;
-----
update linea
set vigente = false
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;
-----
delete from rol_linea where id_linea not in (select id_linea from linea);
-----
ALTER TABLE rol_linea ADD CONSTRAINT rol_linea_id_linea_fkey FOREIGN KEY (id_linea) REFERENCES linea(id_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);
-----

View File

@ -1,9 +1,10 @@
from rest_framework import viewsets
from rest_framework.decorators import action
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
@ -55,7 +56,8 @@ class DispositivoViewSet(viewsets.ModelViewSet):
input = json.loads(request.body)
getInfoDevice = input['GetInfoDevice']
record = models.Paradero.objects \
cursor = connection.cursor()
paradero = models.Paradero.objects \
.filter(dispositivo__id_dispositivo=getInfoDevice['idDispositivo']) \
.annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \
.first()
@ -64,58 +66,160 @@ class DispositivoViewSet(viewsets.ModelViewSet):
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}'
key = f'stop_id:{paradero.nro_paradero}'
json_trayectos = r.get(key)
trayectos = []
if json_trayectos != None:
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 = {}
lineas_agrupadas = {}
for t in trayectos:
# agregar al listado los trayecto en donde no se registro el paradero
"""
json_trayectos = r.get('stop_id:none')
trayectos_none = []
if json_trayectos != None:
trayectos_none = json.loads(json_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()
for trayecto in trayectos_none:
trayecto['stop_id'] = 'none'
trayecto['hora_llegada'] = None
trayectos.append(trayecto)
linea = lineas[pk_linea]
"""
lineas = models.Linea.objects.filter(lineaparadero__id_paradero = paradero.id_paradero).order_by('route_short_name')
detalle_lineas = []
for linea in lineas:
llegadas = []
if linea == None:
logging.error(pk_linea)
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 linea != None:
if pk_linea not in lineas_agrupadas:
lineas_agrupadas[pk_linea] = {
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': llegadas_ordendas
}
detalle_lineas.append(item)
lineas_agrupadas[pk_linea]['Llegadas'].append({
'patente': t['vehicle_license_plate'],
'Planificada': None,
'EstimadaGPS': t['hora_llegada'],
'DistanciaGPS': None,
'Mensajelinea': None,
})
# 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])
# 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')
# save_log_dispositivo(id_dispositivo=getInfoDevice['idDispositivo'], accion_url='getInfoDevice')
cursor.close()
return JsonResponse({
"GetInfoDeviceResponse": {
"DetalleLineas": detalle_lineas,
"MensajeParadero": "No considerar, uso futuro",
"NroParadero": record.nro_paradero,
"NombreParadero": record.nombre_paradero
"NroParadero": paradero.nro_paradero,
"NombreParadero": paradero.nombre_paradero,
"proto": trayectos,
}
})

View File

@ -1,6 +1,6 @@
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.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
@ -46,6 +46,57 @@ class LineaViewSet(viewsets.ModelViewSet):
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'])
def buses(self, request, pk=None):
pk = request.GET['id_linea']
@ -80,6 +131,23 @@ class LineaViewSet(viewsets.ModelViewSet):
'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:
array_buses.append(obj_buses[patente])
@ -97,8 +165,6 @@ class LineaViewSet(viewsets.ModelViewSet):
.filter(id_linea=pk) \
.first()
logging.error(linea)
detalle_buses = []
paraderos = models.Paradero.objects \
.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 api.serializers import ParaderoSerializer
from api.models import Paradero, Dispositivo
from decouple import config
import logging
class ParaderoViewSet(viewsets.ModelViewSet):
@ -41,7 +42,8 @@ class ParaderoViewSet(viewsets.ModelViewSet):
url = 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}'