From 8644561155b98a40b4ba69b61be04b6fca5ad3ac Mon Sep 17 00:00:00 2001 From: Francisco Sandoval Date: Sun, 25 Feb 2024 14:17:40 -0300 Subject: [PATCH] se agrega mas campos a log de usuarios --- project/api/views/aplicacion.py | 6 +-- project/api/views/comuna.py | 4 +- project/api/views/gtfs_archivo.py | 3 -- project/api/views/letrero_lur.py | 2 +- project/api/views/linea.py | 5 +- project/api/views/mapa.py | 8 ++-- project/api/views/operador.py | 66 ++++++++++++++++++++----- project/api/views/paradero.py | 1 - project/api/views/red_transporte.py | 9 ++-- project/api/views/region.py | 2 +- project/api/views/rol.py | 15 ++++-- project/api/views/rolaplicacion.py | 2 +- project/api/views/tipo.py | 2 +- project/api/views/usuario.py | 74 +++++++++++++++++++++-------- project/logger/models.py | 6 ++- project/logger/views.py | 10 ++-- 16 files changed, 145 insertions(+), 70 deletions(-) diff --git a/project/api/views/aplicacion.py b/project/api/views/aplicacion.py index 3bca5e5..302c53d 100755 --- a/project/api/views/aplicacion.py +++ b/project/api/views/aplicacion.py @@ -1,6 +1,6 @@ from rest_framework import viewsets -from .. import models, serializers -from django.db import models as dj_models +from api import models, serializers +from django.db.models import Max class AplicacionViewSet(viewsets.ModelViewSet): queryset = models.Aplicacion.objects.all() @@ -10,7 +10,7 @@ class AplicacionViewSet(viewsets.ModelViewSet): def create(self, request, *args, **kwargs): # se indica que si no se indico el id, entonces sea el maximo + 1 if not request.data.get('id_aplicacion', None): - max_id = models.Aplicacion.objects.aggregate(dj_models.Max('id_aplicacion'))['id_aplicacion__max'] + max_id = models.Aplicacion.objects.aggregate(Max('id_aplicacion'))['id_aplicacion__max'] new_id = max_id + 1 if max_id is not None else 1 request.data['id_aplicacion'] = new_id diff --git a/project/api/views/comuna.py b/project/api/views/comuna.py index 05fbca6..a64c60c 100755 --- a/project/api/views/comuna.py +++ b/project/api/views/comuna.py @@ -1,7 +1,7 @@ from rest_framework import viewsets from .. import models, serializers -from django.db import models as dj_models +from django.db.models import Max class ComunaViewSet(viewsets.ModelViewSet): queryset = models.Comuna.objects.all() @@ -10,7 +10,7 @@ class ComunaViewSet(viewsets.ModelViewSet): def create(self, request, *args, **kwargs): # se indica que si no se indico el id, entonces sea el maximo + 1 if not request.data.get('id_comuna', None): - max_id = models.Comuna.objects.aggregate(dj_models.Max('id_comuna'))['id_comuna__max'] + max_id = models.Comuna.objects.aggregate(Max('id_comuna'))['id_comuna__max'] new_id = max_id + 1 if max_id is not None else 1 request.data['id_comuna'] = new_id diff --git a/project/api/views/gtfs_archivo.py b/project/api/views/gtfs_archivo.py index c164528..6d9f3c1 100644 --- a/project/api/views/gtfs_archivo.py +++ b/project/api/views/gtfs_archivo.py @@ -1,12 +1,9 @@ from rest_framework import viewsets -from rest_framework.response import Response from rest_framework.decorators import action from django_filters.rest_framework import DjangoFilterBackend from django.core.files.storage import FileSystemStorage -from django.core.files import File from django.http import FileResponse, HttpResponse -from rest_framework import status from api import models , serializers from decouple import config import os diff --git a/project/api/views/letrero_lur.py b/project/api/views/letrero_lur.py index 3c09536..0391955 100755 --- a/project/api/views/letrero_lur.py +++ b/project/api/views/letrero_lur.py @@ -2,7 +2,7 @@ from rest_framework import viewsets from rest_framework.response import Response from rest_framework.decorators import action -from .. import models, serializers +from api import models, serializers class LetreroLUR_ViewSet(viewsets.ModelViewSet): queryset = models.LetreroLUR.objects.all() diff --git a/project/api/views/linea.py b/project/api/views/linea.py index cf397b2..e902762 100755 --- a/project/api/views/linea.py +++ b/project/api/views/linea.py @@ -1,13 +1,12 @@ from rest_framework import viewsets # from rest_framework.response import Response -from rest_framework.decorators import action, api_view +from rest_framework.decorators import action from rest_framework.filters import OrderingFilter from django_filters.rest_framework import DjangoFilterBackend from django.db import connection from api import models, serializers -from django.http import JsonResponse, HttpResponse -from django.forms.models import model_to_dict +from django.http import JsonResponse from os import getenv import redis import json diff --git a/project/api/views/mapa.py b/project/api/views/mapa.py index b0136e5..ad68f92 100755 --- a/project/api/views/mapa.py +++ b/project/api/views/mapa.py @@ -1,12 +1,10 @@ from django.http import JsonResponse -from rest_framework.decorators import action, api_view, schema +from rest_framework.decorators import action, api_view from django.views.decorators.csrf import csrf_exempt -from django.db.models import F, Subquery, Value -from django.db.models.functions import Coalesce -from ..models import Paradero, ParaderoImagen -from ..models import Linea, GtfsShape, GtfsTrips +from api.models import Paradero +from api.models import GtfsShape, GtfsTrips from logging import error google_api_key = 'AIzaSyDnFO9w_SsodjBuY5tOK8-kQJns_l5klQ4' diff --git a/project/api/views/operador.py b/project/api/views/operador.py index c959ace..32a6cac 100755 --- a/project/api/views/operador.py +++ b/project/api/views/operador.py @@ -1,10 +1,11 @@ from rest_framework import viewsets from rest_framework.response import Response -from rest_framework.decorators import action -from django_filters.rest_framework import DjangoFilterBackend from rest_framework.filters import OrderingFilter -from rest_framework import status +from rest_framework.status import HTTP_400_BAD_REQUEST +from django_filters.rest_framework import DjangoFilterBackend +from django.db.models import Max +from django.db import transaction from api import models, serializers import logging @@ -26,14 +27,53 @@ class OperadorViewSet(viewsets.ModelViewSet): def create(self, request, *args, **kwargs): - # Comprueba si 'id_operador' está presente en la petición y no está vacío - id_operador = request.data.get('id_operador') - if not id_operador: - # Si 'id_operador' no está presente o está vacío, retorna un error 400 - return Response( - {"error": "No se puede crear el operador: 'id_operador' no proporcionado."}, - status=status.HTTP_400_BAD_REQUEST + # Comprueba si 'id_operador' está presente en la petición y no está vacío + id_operador = request.data.get('id_operador') + if not id_operador: + # Si 'id_operador' no está presente o está vacío, retorna un error 400 + return Response( + "No se puede crear el operador: 'id_operador' no proporcionado.", + status=HTTP_400_BAD_REQUEST + ) + + try: + with transaction.atomic(): + operador = models.Operador( + id_operador = id_operador, + nombre_operador = request.data.get('nombre_operador'), + vigente = request.data.get('vigente'), ) - - # Si 'id_operador' está presente, procede con la creación normal - return super().create(request, *args, **kwargs) \ No newline at end of file + operador.save() + + # se crea el rol para el operador + max_id = models.Rol.objects.aggregate(Max('id_rol'))['id_rol__max'] + + rol = models.Rol( + id_rol = max_id + 1, + nombre_rol = f'Rol {operador.nombre_operador}' + ) + rol.save() + + rol_operador = models.RolOperador( + id_rol = rol, + id_operador = operador + ) + rol_operador.save() + + return Response({ + 'id_operador': operador.id_operador, + 'nombre_operador': operador.nombre_operador, + 'vigente': operador.vigente, + }) + except Exception as ex: + transaction.rollback() + return Response(str(ex), status=HTTP_400_BAD_REQUEST) + + + def destroy(self, request, pk=None): + try: + with transaction.atomic(): + models.RolOperador.objects.filter(id_operador=pk).delete() + return super().destroy(request, pk) + except Exception as ex: + return Response(str(ex), status=HTTP_400_BAD_REQUEST) diff --git a/project/api/views/paradero.py b/project/api/views/paradero.py index 35e4f30..4734a9d 100755 --- a/project/api/views/paradero.py +++ b/project/api/views/paradero.py @@ -12,7 +12,6 @@ class ParaderoViewSet(viewsets.ModelViewSet): @action(detail=False, methods=['get']) def count(self, request, pk=None): - queryset = Paradero.objects.all() if 'vigente' in request.GET and request.GET['vigente'] == '1': diff --git a/project/api/views/red_transporte.py b/project/api/views/red_transporte.py index 83855b9..c819964 100644 --- a/project/api/views/red_transporte.py +++ b/project/api/views/red_transporte.py @@ -1,11 +1,8 @@ from rest_framework import viewsets -from rest_framework.response import Response -from rest_framework.decorators import action from django_filters.rest_framework import DjangoFilterBackend -from rest_framework import status -from .. import models , serializers -from django.db import models as dj_models +from django.db.models import Max +from api import models , serializers class RedTransporteViewSet(viewsets.ModelViewSet): queryset = models.RedTransporte.objects.all() @@ -17,7 +14,7 @@ class RedTransporteViewSet(viewsets.ModelViewSet): def create(self, request, *args, **kwargs): # se indica que si no se indico el id, entonces sea el maximo + 1 if not request.data.get('id_red', None): - max_id = models.RedTransporte.objects.aggregate(dj_models.Max('id_red'))['id_red__max'] + max_id = models.RedTransporte.objects.aggregate(Max('id_red'))['id_red__max'] new_id = max_id + 1 if max_id is not None else 1 request.data['id_red'] = new_id diff --git a/project/api/views/region.py b/project/api/views/region.py index f81a0de..e1908f8 100755 --- a/project/api/views/region.py +++ b/project/api/views/region.py @@ -1,6 +1,6 @@ from rest_framework import viewsets -from .. import models, serializers +from api import models, serializers class RegionViewSet(viewsets.ModelViewSet): queryset = models.Region.objects.all() diff --git a/project/api/views/rol.py b/project/api/views/rol.py index 2ca6e20..28eb98b 100755 --- a/project/api/views/rol.py +++ b/project/api/views/rol.py @@ -1,6 +1,7 @@ from rest_framework import viewsets -from .. import models, serializers -from django.db import models as dj_models +from rest_framework.response import Response +from api import models, serializers +from django.db.models import Max class RolViewSet(viewsets.ModelViewSet): queryset = models.Rol.objects.all() @@ -9,8 +10,14 @@ class RolViewSet(viewsets.ModelViewSet): def create(self, request, *args, **kwargs): # se indica que si no se indico el id, entonces sea el maximo + 1 if not request.data.get('id_rol', None): - max_id = models.Rol.objects.aggregate(dj_models.Max('id_rol'))['id_rol__max'] + max_id = models.Rol.objects.aggregate(Max('id_rol'))['id_rol__max'] new_id = max_id + 1 if max_id is not None else 1 request.data['id_rol'] = new_id - return super().create(request, *args, **kwargs) \ No newline at end of file + return super().create(request, *args, **kwargs) + + def destroy(self, request, pk=None): + try: + return super().destroy(request, pk) + except Exception as ex: + return Response(str(ex), status=400) \ No newline at end of file diff --git a/project/api/views/rolaplicacion.py b/project/api/views/rolaplicacion.py index 3f9adb4..c4e5962 100755 --- a/project/api/views/rolaplicacion.py +++ b/project/api/views/rolaplicacion.py @@ -1,5 +1,5 @@ from rest_framework import viewsets -from .. import models, serializers +from api import models, serializers import logging class RolAplicacionViewSet(viewsets.ModelViewSet): diff --git a/project/api/views/tipo.py b/project/api/views/tipo.py index 66812b0..2ed2247 100755 --- a/project/api/views/tipo.py +++ b/project/api/views/tipo.py @@ -1,6 +1,6 @@ from rest_framework import viewsets -from .. import models, serializers +from api import models, serializers class TipoTratamientoPersonaViewSet(viewsets.ModelViewSet): queryset = models.TipoTratamientoPersona.objects.all() diff --git a/project/api/views/usuario.py b/project/api/views/usuario.py index 52fd78e..5939dd5 100755 --- a/project/api/views/usuario.py +++ b/project/api/views/usuario.py @@ -24,7 +24,7 @@ class UsuarioViewSet(viewsets.ModelViewSet): def create(self, request): try: login = self.request.jwt_info['login'] - usuario_session = models.Usuario.objects.filter(login=login) + usuario_session = models.Usuario.objects.filter(login=login).first() with transaction.atomic(): input = json.loads(request.body) @@ -36,7 +36,7 @@ class UsuarioViewSet(viewsets.ModelViewSet): if id_tipo_tratamiento: tipo_tratamiento = models.TipoTratamientoPersona.objects.filter(id_tipo_tratamiento = id_tipo_tratamiento).first() - if not persona: + if persona == None: persona = models.Persona( rut = input['rut'], dv = input['dv'], @@ -55,6 +55,9 @@ class UsuarioViewSet(viewsets.ModelViewSet): persona.id_tipo_tratamiento = tipo_tratamiento persona.save() + if persona == None: + raise ValueError('Persona no creada') + rol = models.Rol.objects.filter(id_rol=input.get('id_rol',None)).first() if rol == None: raise ValueError('Rol no encontrado') @@ -67,32 +70,37 @@ class UsuarioViewSet(viewsets.ModelViewSet): ) usuario.save() - save_log_usuario(accion_tabla='create', rut_tabla=persona.rut, rut_usuario_ejecutor=usuario_session.rut.rut) - if input['clave']: logging.error('Modificar clave de usuario') usuario.clave = make_password(input['clave']) usuario.save() - return Response({ - 'rut': persona.rut, - 'dv': persona.dv, - 'nombres': persona.nombres, - 'apellido_a': persona.apellido_a, - 'apellido_b': persona.apellido_b, - 'email': persona.email, - 'login': usuario.login, - 'vigente': usuario.vigente, - }) + save_log_usuario( + accion_tabla='create', + rut_tabla=persona.rut, + login_tabla=usuario.login, + rut_ejecutor=usuario_session.rut.rut, + login_ejecutor=usuario_session.login + ) + + return Response({ + 'rut': persona.rut, + 'dv': persona.dv, + 'nombres': persona.nombres, + 'apellido_a': persona.apellido_a, + 'apellido_b': persona.apellido_b, + 'email': persona.email, + 'login': usuario.login, + 'vigente': usuario.vigente, + }) - except ValueError as e: + except ValueError as ex: transaction.rollback() - return HttpResponse(str(e), status = 400) + return HttpResponse(str(ex), status = 400) - except Exception as e: + except Exception as ex: transaction.rollback() - print(e) - return HttpResponse(str(e), status = 500) + return HttpResponse(str(ex), status = 500) def partial_update(self, request, *args, **kwargs): @@ -119,7 +127,13 @@ class UsuarioViewSet(viewsets.ModelViewSet): usuario.clave = make_password(input['clave']) usuario.save() - save_log_usuario(accion_tabla='update', rut_tabla=persona.rut, rut_usuario_ejecutor=usuario_session.rut.rut) + save_log_usuario( + accion_tabla='update', + rut_tabla=persona.rut, + login_tabla=usuario.login, + rut_ejecutor=usuario_session.rut.rut, + login_ejecutor=usuario_session.login + ) return Response({ 'rut': persona.rut, @@ -142,6 +156,26 @@ class UsuarioViewSet(viewsets.ModelViewSet): return HttpResponse(str(e), status = 500) + def destroy(self, request, pk=None): + try: + login = self.request.jwt_info['login'] + usuario_session = models.Usuario.objects.filter(login=login).first() + usuario = models.Usuario.objects.filter(login=pk).first() + data = super().destroy(request, usuario.rut.rut) + + save_log_usuario( + accion_tabla='delete', + rut_tabla=usuario.rut.rut, + login_tabla=usuario.login, + rut_ejecutor=usuario_session.rut.rut, + login_ejecutor=usuario_session.login + ) + + return data + except Exception as ex: + return Response(str(ex), status=400) + + @action(detail=False, methods=['post']) def permisos(self, request): input = {} diff --git a/project/logger/models.py b/project/logger/models.py index e5b0d6a..a5f2132 100644 --- a/project/logger/models.py +++ b/project/logger/models.py @@ -12,6 +12,8 @@ class LogConsultaDispositivo(Document): class LogTablaUsuario(Document): accion_tabla = StringField(required=True) - rut_usuario_tabla = StringField(required=True) - rut_usuario_ejecutor = StringField(required=True) + rut_tabla = StringField(required=True) + login_tabla = StringField(required=True) + rut_ejecutor = StringField(required=True) + login_ejecutor = StringField(required=True) fecha_hora = DateTimeField(required=True) \ No newline at end of file diff --git a/project/logger/views.py b/project/logger/views.py index e1d5650..3f7ca38 100644 --- a/project/logger/views.py +++ b/project/logger/views.py @@ -28,16 +28,18 @@ def save_log_dispositivo(id_dispositivo, accion_url): return False -def save_log_usuario(accion_tabla, rut_tabla, rut_usuario_ejecutor): +def save_log_usuario(accion_tabla, rut_tabla, login_tabla, rut_ejecutor, login_ejecutor): try: print(rut_tabla, flush=True) - print(rut_usuario_ejecutor, flush=True) + print(rut_ejecutor, flush=True) # connect(db=dbname, host=dbhost, port=dbport, username=dbuser, password=dbpass, authentication_source='admin') nuevo_registro = LogTablaUsuario( accion_tabla = accion_tabla, - rut_usuario_tabla = str(rut_tabla), - rut_usuario_ejecutor = str(rut_usuario_ejecutor), + rut_tabla = str(rut_tabla), + login_tabla = str(login_tabla), + rut_ejecutor = str(rut_ejecutor), + login_ejecutor = str(login_ejecutor), fecha_hora = datetime.datetime.now() ) nuevo_registro.save()