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 } })