diff --git a/.env.develop b/.env.develop index 2267fae..6b7d8e1 100644 --- a/.env.develop +++ b/.env.develop @@ -10,6 +10,12 @@ DBPASS=password DB_REDIS_HOST=dbproto DB_REDIS_PORT=6379 +# Conexion con base datos mongo +DB_MONGO_HOST=dbmongo +DB_MONGO_PORT=27017 +DB_MONGO_USER=root +DB_MONGO_PASS=password + # Datos de emisor de correos SMTP_HOST=smtp-mail.outlook.com SMTP_PORT=587 diff --git a/docs/rest/dispositivo.rest b/docs/rest/dispositivo.rest index e8da7b7..fdfd80e 100644 --- a/docs/rest/dispositivo.rest +++ b/docs/rest/dispositivo.rest @@ -9,7 +9,7 @@ POST {{server}}/auth/ Content-Type: application/json { - "username": "usuario1", + "rut": "11111111-1", "password": "usuario1" } diff --git a/project/api/views/dispositivo.py b/project/api/views/dispositivo.py index de96b0d..3074d2f 100755 --- a/project/api/views/dispositivo.py +++ b/project/api/views/dispositivo.py @@ -5,12 +5,15 @@ 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 .. import models, serializers +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 @@ -29,6 +32,8 @@ class DispositivoViewSet(viewsets.ModelViewSet): .first() if (record): + save_log_dispositivo(id_dispositivo=whoami['idDispositivo'], accion_url='whoami') + return JsonResponse({ "WhoamiResponse": { "NroParadero": record.nro_paradero, @@ -51,7 +56,6 @@ class DispositivoViewSet(viewsets.ModelViewSet): 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')) \ @@ -106,10 +110,13 @@ class DispositivoViewSet(viewsets.ModelViewSet): 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" + "MensajeParadero": "No considerar, uso futuro", + "NroParadero": record.nro_paradero, + "NombreParadero": record.nombre_paradero } }) \ No newline at end of file diff --git a/project/api/views/persona.py b/project/api/views/persona.py index bb099bc..c3e319e 100755 --- a/project/api/views/persona.py +++ b/project/api/views/persona.py @@ -18,8 +18,9 @@ class PersonaViewSet(viewsets.ModelViewSet): def create(self, request): try: - fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp')) - fs.save(request.data['photo'], request.data['photo']) + if 'photo' in request.data: + fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp')) + fs.save(request.data['photo'], request.data['photo']) return super().create(request) except Exception as e: @@ -27,21 +28,23 @@ class PersonaViewSet(viewsets.ModelViewSet): return HttpResponse(e.detail['rut'][0], status=400) return HttpResponse(e, status=400) + def partial_update(self, request, pk=None): try: - # indicar el nombre con que se guardara el archivo - archivo = request.data['photo'] - extension = Path(archivo.name).suffix - nombre_archivo = f'{pk}{extension}' + if 'photo' in request.data: + # indicar el nombre con que se guardara el archivo + archivo = request.data['photo'] + extension = Path(archivo.name).suffix + nombre_archivo = f'{pk}{extension}' - # guardar el archivo en la carpeta - fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp')) + # guardar el archivo en la carpeta + fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp')) - # Sobrescribir el archivo si ya existe - if fs.exists(nombre_archivo): - fs.delete(nombre_archivo) + # Sobrescribir el archivo si ya existe + if fs.exists(nombre_archivo): + fs.delete(nombre_archivo) - fs.save(nombre_archivo, archivo) + fs.save(nombre_archivo, archivo) # proceder con guardar registro return super().partial_update(request, pk) diff --git a/project/api/views/usuario.py b/project/api/views/usuario.py index 1cfedd7..52fd78e 100755 --- a/project/api/views/usuario.py +++ b/project/api/views/usuario.py @@ -6,9 +6,10 @@ from rest_framework import viewsets from rest_framework.response import Response from rest_framework.decorators import action -from .. import models, schemas, serializers +from api import models, schemas, serializers +from logger.views import save_log_usuario + import json -import datetime import logging class UsuarioViewSet(viewsets.ModelViewSet): @@ -22,13 +23,18 @@ class UsuarioViewSet(viewsets.ModelViewSet): def create(self, request): try: + login = self.request.jwt_info['login'] + usuario_session = models.Usuario.objects.filter(login=login) + with transaction.atomic(): input = json.loads(request.body) persona = models.Persona.objects.filter(rut = input['rut']).first() id_tipo_tratamiento = input.get('id_tipo_tratamiento',None) - if not id_tipo_tratamiento: - id_tipo_tratamiento = None + + tipo_tratamiento = None + if id_tipo_tratamiento: + tipo_tratamiento = models.TipoTratamientoPersona.objects.filter(id_tipo_tratamiento = id_tipo_tratamiento).first() if not persona: persona = models.Persona( @@ -38,7 +44,7 @@ class UsuarioViewSet(viewsets.ModelViewSet): apellido_a = input.get('apellido_a',None), apellido_b = input.get('apellido_b',None), email = input.get('email',None), - id_tipo_tratamiento = id_tipo_tratamiento + id_tipo_tratamiento = tipo_tratamiento ) persona.save() else: @@ -46,7 +52,7 @@ class UsuarioViewSet(viewsets.ModelViewSet): persona.apellido_a = input.get('apellido_a',None) persona.apellido_b = input.get('apellido_b',None) persona.email = input.get('email',None) - persona.id_tipo_tratamiento = id_tipo_tratamiento + persona.id_tipo_tratamiento = tipo_tratamiento persona.save() rol = models.Rol.objects.filter(id_rol=input.get('id_rol',None)).first() @@ -61,6 +67,8 @@ 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']) @@ -86,10 +94,14 @@ class UsuarioViewSet(viewsets.ModelViewSet): print(e) return HttpResponse(str(e), status = 500) - def update(self, request, *args, **kwargs): + + def partial_update(self, request, *args, **kwargs): input = json.loads(request.body) try: pk = input['rut'] + login = self.request.jwt_info['login'] + usuario_session = models.Usuario.objects.filter(login=login).first() + with transaction.atomic(): # validaciones se realiza a nivel del model @@ -106,6 +118,8 @@ class UsuarioViewSet(viewsets.ModelViewSet): logging.error('Modificar clave de usuario') 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) return Response({ 'rut': persona.rut, @@ -127,6 +141,7 @@ class UsuarioViewSet(viewsets.ModelViewSet): logging.error(e) return HttpResponse(str(e), status = 500) + @action(detail=False, methods=['post']) def permisos(self, request): input = {} diff --git a/project/logger/__init__.py b/project/logger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project/logger/admin.py b/project/logger/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/project/logger/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/project/logger/apps.py b/project/logger/apps.py new file mode 100644 index 0000000..636e88b --- /dev/null +++ b/project/logger/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LoggerConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'logger' diff --git a/project/logger/models.py b/project/logger/models.py new file mode 100644 index 0000000..e5b0d6a --- /dev/null +++ b/project/logger/models.py @@ -0,0 +1,17 @@ +# from django.db import models + +# Create your models here. +# ref: https://docs.mongoengine.org/tutorial.html + +from mongoengine import Document, StringField, DateTimeField + +class LogConsultaDispositivo(Document): + id_dispositivo = StringField(required=True) + accion_url = StringField(required=True) + fecha_hora = DateTimeField(required=True) + +class LogTablaUsuario(Document): + accion_tabla = StringField(required=True) + rut_usuario_tabla = StringField(required=True) + rut_usuario_ejecutor = StringField(required=True) + fecha_hora = DateTimeField(required=True) \ No newline at end of file diff --git a/project/logger/tests.py b/project/logger/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/project/logger/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/project/logger/views.py b/project/logger/views.py new file mode 100644 index 0000000..e1d5650 --- /dev/null +++ b/project/logger/views.py @@ -0,0 +1,48 @@ +# from django.shortcuts import render +from mongoengine import connect +from decouple import config +from logger.models import LogConsultaDispositivo, LogTablaUsuario +import datetime + +dbname = config('DB_MONGO_NAME', 'nombre_basedatos') +dbhost = config('DB_MONGO_HOST', 'localhost') +dbport = int(config('DB_MONGO_PORT', '27017')) +dbuser = config('DB_MONGO_USER', 'usuario') +dbpass = config('DB_MONGO_PASS', 'contrasena') + +connect(db=dbname, host=dbhost, port=dbport, username=dbuser, password=dbpass, authentication_source='admin') + +# Create your views here. +def save_log_dispositivo(id_dispositivo, accion_url): + try: + # connect(db=dbname, host=dbhost, port=dbport, username=dbuser, password=dbpass, authentication_source='admin') + nuevo_registro = LogConsultaDispositivo( + id_dispositivo = id_dispositivo, + accion_url = accion_url, + fecha_hora = datetime.datetime.now() + ) + nuevo_registro.save() + return True + except Exception as err: + print(err, flush=True) + return False + + +def save_log_usuario(accion_tabla, rut_tabla, rut_usuario_ejecutor): + try: + print(rut_tabla, flush=True) + print(rut_usuario_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), + fecha_hora = datetime.datetime.now() + ) + nuevo_registro.save() + return True + except Exception as err: + print(err, flush=True) + return False + \ No newline at end of file diff --git a/project/project/settings.py b/project/project/settings.py index 138674e..45a8f74 100644 --- a/project/project/settings.py +++ b/project/project/settings.py @@ -46,6 +46,7 @@ INSTALLED_APPS = [ 'corsheaders', 'django_filters', 'api', + 'logger', ] MIDDLEWARE = [ diff --git a/requirements.txt b/requirements.txt index b268bca..4224c1a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ python-dotenv python-decouple PyJWT pymongo +mongoengine Pillow openpyxl google