se registra cambios de usuarios y consultas dispositivos en base mongodb

francisco/logger
Francisco Sandoval 2024-02-25 00:08:59 -03:00
parent 0032c1af1e
commit 3ff0eb4898
13 changed files with 133 additions and 23 deletions

View File

@ -10,6 +10,12 @@ DBPASS=password
DB_REDIS_HOST=dbproto DB_REDIS_HOST=dbproto
DB_REDIS_PORT=6379 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 # Datos de emisor de correos
SMTP_HOST=smtp-mail.outlook.com SMTP_HOST=smtp-mail.outlook.com
SMTP_PORT=587 SMTP_PORT=587

View File

@ -9,7 +9,7 @@ POST {{server}}/auth/
Content-Type: application/json Content-Type: application/json
{ {
"username": "usuario1", "rut": "11111111-1",
"password": "usuario1" "password": "usuario1"
} }

View File

@ -5,12 +5,15 @@ from django.db.models import F
from django.db import connection from django.db import connection
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.decorators import action from rest_framework.decorators import action
from .. import models, serializers from api import models, serializers
from os import getenv from os import getenv
import redis import redis
import json import json
import logging import logging
# funcion para registrar en mongo
from logger.views import save_log_dispositivo
class DispositivoViewSet(viewsets.ModelViewSet): class DispositivoViewSet(viewsets.ModelViewSet):
queryset = models.Dispositivo.objects.all() queryset = models.Dispositivo.objects.all()
serializer_class = serializers.DispositivoSerializer serializer_class = serializers.DispositivoSerializer
@ -29,6 +32,8 @@ class DispositivoViewSet(viewsets.ModelViewSet):
.first() .first()
if (record): if (record):
save_log_dispositivo(id_dispositivo=whoami['idDispositivo'], accion_url='whoami')
return JsonResponse({ return JsonResponse({
"WhoamiResponse": { "WhoamiResponse": {
"NroParadero": record.nro_paradero, "NroParadero": record.nro_paradero,
@ -51,7 +56,6 @@ class DispositivoViewSet(viewsets.ModelViewSet):
input = json.loads(request.body) input = json.loads(request.body)
getInfoDevice = input['GetInfoDevice'] getInfoDevice = input['GetInfoDevice']
record = models.Paradero.objects \ record = models.Paradero.objects \
.filter(dispositivo__id_dispositivo=getInfoDevice['idDispositivo']) \ .filter(dispositivo__id_dispositivo=getInfoDevice['idDispositivo']) \
.annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \ .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: for pk_linea in lineas_agrupadas:
detalle_lineas.append(lineas_agrupadas[pk_linea]) detalle_lineas.append(lineas_agrupadas[pk_linea])
save_log_dispositivo(id_dispositivo=getInfoDevice['idDispositivo'], accion_url='getInfoDevice')
return JsonResponse({ return JsonResponse({
"GetInfoDeviceResponse": { "GetInfoDeviceResponse": {
"DetalleLineas": detalle_lineas, "DetalleLineas": detalle_lineas,
"MensajeParadero": "No considerar, uso futuro" "MensajeParadero": "No considerar, uso futuro",
"NroParadero": record.nro_paradero,
"NombreParadero": record.nombre_paradero
} }
}) })

View File

@ -18,8 +18,9 @@ class PersonaViewSet(viewsets.ModelViewSet):
def create(self, request): def create(self, request):
try: try:
fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp')) if 'photo' in request.data:
fs.save(request.data['photo'], request.data['photo']) fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp'))
fs.save(request.data['photo'], request.data['photo'])
return super().create(request) return super().create(request)
except Exception as e: except Exception as e:
@ -27,21 +28,23 @@ class PersonaViewSet(viewsets.ModelViewSet):
return HttpResponse(e.detail['rut'][0], status=400) return HttpResponse(e.detail['rut'][0], status=400)
return HttpResponse(e, status=400) return HttpResponse(e, status=400)
def partial_update(self, request, pk=None): def partial_update(self, request, pk=None):
try: try:
# indicar el nombre con que se guardara el archivo if 'photo' in request.data:
archivo = request.data['photo'] # indicar el nombre con que se guardara el archivo
extension = Path(archivo.name).suffix archivo = request.data['photo']
nombre_archivo = f'{pk}{extension}' extension = Path(archivo.name).suffix
nombre_archivo = f'{pk}{extension}'
# guardar el archivo en la carpeta # guardar el archivo en la carpeta
fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp')) fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp'))
# Sobrescribir el archivo si ya existe # Sobrescribir el archivo si ya existe
if fs.exists(nombre_archivo): if fs.exists(nombre_archivo):
fs.delete(nombre_archivo) fs.delete(nombre_archivo)
fs.save(nombre_archivo, archivo) fs.save(nombre_archivo, archivo)
# proceder con guardar registro # proceder con guardar registro
return super().partial_update(request, pk) return super().partial_update(request, pk)

View File

@ -6,9 +6,10 @@ 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.decorators import action
from .. import models, schemas, serializers from api import models, schemas, serializers
from logger.views import save_log_usuario
import json import json
import datetime
import logging import logging
class UsuarioViewSet(viewsets.ModelViewSet): class UsuarioViewSet(viewsets.ModelViewSet):
@ -22,13 +23,18 @@ class UsuarioViewSet(viewsets.ModelViewSet):
def create(self, request): def create(self, request):
try: try:
login = self.request.jwt_info['login']
usuario_session = models.Usuario.objects.filter(login=login)
with transaction.atomic(): with transaction.atomic():
input = json.loads(request.body) input = json.loads(request.body)
persona = models.Persona.objects.filter(rut = input['rut']).first() persona = models.Persona.objects.filter(rut = input['rut']).first()
id_tipo_tratamiento = input.get('id_tipo_tratamiento',None) 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: if not persona:
persona = models.Persona( persona = models.Persona(
@ -38,7 +44,7 @@ class UsuarioViewSet(viewsets.ModelViewSet):
apellido_a = input.get('apellido_a',None), apellido_a = input.get('apellido_a',None),
apellido_b = input.get('apellido_b',None), apellido_b = input.get('apellido_b',None),
email = input.get('email',None), email = input.get('email',None),
id_tipo_tratamiento = id_tipo_tratamiento id_tipo_tratamiento = tipo_tratamiento
) )
persona.save() persona.save()
else: else:
@ -46,7 +52,7 @@ class UsuarioViewSet(viewsets.ModelViewSet):
persona.apellido_a = input.get('apellido_a',None) persona.apellido_a = input.get('apellido_a',None)
persona.apellido_b = input.get('apellido_b',None) persona.apellido_b = input.get('apellido_b',None)
persona.email = input.get('email',None) persona.email = input.get('email',None)
persona.id_tipo_tratamiento = id_tipo_tratamiento persona.id_tipo_tratamiento = tipo_tratamiento
persona.save() persona.save()
rol = models.Rol.objects.filter(id_rol=input.get('id_rol',None)).first() rol = models.Rol.objects.filter(id_rol=input.get('id_rol',None)).first()
@ -61,6 +67,8 @@ class UsuarioViewSet(viewsets.ModelViewSet):
) )
usuario.save() usuario.save()
save_log_usuario(accion_tabla='create', rut_tabla=persona.rut, rut_usuario_ejecutor=usuario_session.rut.rut)
if input['clave']: if input['clave']:
logging.error('Modificar clave de usuario') logging.error('Modificar clave de usuario')
usuario.clave = make_password(input['clave']) usuario.clave = make_password(input['clave'])
@ -86,10 +94,14 @@ class UsuarioViewSet(viewsets.ModelViewSet):
print(e) print(e)
return HttpResponse(str(e), status = 500) return HttpResponse(str(e), status = 500)
def update(self, request, *args, **kwargs):
def partial_update(self, request, *args, **kwargs):
input = json.loads(request.body) input = json.loads(request.body)
try: try:
pk = input['rut'] pk = input['rut']
login = self.request.jwt_info['login']
usuario_session = models.Usuario.objects.filter(login=login).first()
with transaction.atomic(): with transaction.atomic():
# validaciones se realiza a nivel del model # validaciones se realiza a nivel del model
@ -107,6 +119,8 @@ class UsuarioViewSet(viewsets.ModelViewSet):
usuario.clave = make_password(input['clave']) usuario.clave = make_password(input['clave'])
usuario.save() usuario.save()
save_log_usuario(accion_tabla='update', rut_tabla=persona.rut, rut_usuario_ejecutor=usuario_session.rut.rut)
return Response({ return Response({
'rut': persona.rut, 'rut': persona.rut,
'dv': persona.dv, 'dv': persona.dv,
@ -127,6 +141,7 @@ class UsuarioViewSet(viewsets.ModelViewSet):
logging.error(e) logging.error(e)
return HttpResponse(str(e), status = 500) return HttpResponse(str(e), status = 500)
@action(detail=False, methods=['post']) @action(detail=False, methods=['post'])
def permisos(self, request): def permisos(self, request):
input = {} input = {}

View File

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class LoggerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'logger'

View File

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

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -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

View File

@ -46,6 +46,7 @@ INSTALLED_APPS = [
'corsheaders', 'corsheaders',
'django_filters', 'django_filters',
'api', 'api',
'logger',
] ]
MIDDLEWARE = [ MIDDLEWARE = [

View File

@ -8,6 +8,7 @@ python-dotenv
python-decouple python-decouple
PyJWT PyJWT
pymongo pymongo
mongoengine
Pillow Pillow
openpyxl openpyxl
google google