From f71f82f2ededb1d357a192c6780e46ffcf9d49dd Mon Sep 17 00:00:00 2001 From: Francisco Sandoval Date: Sat, 2 Mar 2024 18:10:38 -0300 Subject: [PATCH] cambios sabado 2 de marzo 2024 --- docs/rest/dispositivo.rest | 14 ++ docs/rest/login.rest | 4 +- .../management/commands/actualiza_GTFS.sql | 19 +- project/api/views/dispositivo.py | 188 ++++++++++++++---- project/api/views/linea.py | 72 ++++++- project/api/views/paradero.py | 4 +- 6 files changed, 243 insertions(+), 58 deletions(-) diff --git a/docs/rest/dispositivo.rest b/docs/rest/dispositivo.rest index fdfd80e..0acb4b4 100644 --- a/docs/rest/dispositivo.rest +++ b/docs/rest/dispositivo.rest @@ -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" + } +} + + ### diff --git a/docs/rest/login.rest b/docs/rest/login.rest index e41e31e..bb0234d 100644 --- a/docs/rest/login.rest +++ b/docs/rest/login.rest @@ -8,8 +8,8 @@ POST {{server}}/auth/ Content-Type: application/json { - "rut": "22222222-2", - "password": "usuario2" + "rut": "11111111-1", + "password": "usuario1" } ### diff --git a/project/api/management/commands/actualiza_GTFS.sql b/project/api/management/commands/actualiza_GTFS.sql index 69329ff..3a81a71 100644 --- a/project/api/management/commands/actualiza_GTFS.sql +++ b/project/api/management/commands/actualiza_GTFS.sql @@ -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; ----- @@ -47,7 +43,11 @@ where stop_id not in (select id_paradero::text from paradero); ----- -delete from linea_paradero; +delete from linea_paradero; + +----- + +delete from linea; ----- @@ -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); ----- diff --git a/project/api/views/dispositivo.py b/project/api/views/dispositivo.py index 02b2202..dd28fda 100755 --- a/project/api/views/dispositivo.py +++ b/project/api/views/dispositivo.py @@ -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: - - 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, - }) - + # 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) + + 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 = [] - for pk_linea in lineas_agrupadas: - detalle_lineas.append(lineas_agrupadas[pk_linea]) + for linea in lineas: + 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({ "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, } }) diff --git a/project/api/views/linea.py b/project/api/views/linea.py index e902762..6286545 100755 --- a/project/api/views/linea.py +++ b/project/api/views/linea.py @@ -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'] @@ -79,6 +130,23 @@ class LineaViewSet(viewsets.ModelViewSet): 'longitude': trayecto["longitude"], '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) \ diff --git a/project/api/views/paradero.py b/project/api/views/paradero.py index 4734a9d..8db6b48 100755 --- a/project/api/views/paradero.py +++ b/project/api/views/paradero.py @@ -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}'