98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
from django.contrib.auth.models import User
|
|
from .models import UserActivity, ErrorLog
|
|
import logging
|
|
|
|
def get_client_ip(request):
|
|
"""Obtiene la IP real del cliente"""
|
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
|
if x_forwarded_for:
|
|
ip = x_forwarded_for.split(',')[0]
|
|
else:
|
|
ip = request.META.get('REMOTE_ADDR')
|
|
return ip
|
|
|
|
def log_user_activity(user, action, object_type='', object_id='', description='', request=None):
|
|
"""
|
|
Registra actividad del usuario
|
|
|
|
Args:
|
|
user: Usuario que realiza la acción
|
|
action: Tipo de acción (login, logout, create, update, delete, view, search, export, import)
|
|
object_type: Tipo de objeto afectado (opcional)
|
|
object_id: ID del objeto afectado (opcional)
|
|
description: Descripción adicional (opcional)
|
|
request: Request object para obtener IP (opcional)
|
|
"""
|
|
ip_address = '127.0.0.1'
|
|
if request:
|
|
ip_address = get_client_ip(request)
|
|
|
|
try:
|
|
UserActivity.objects.create(
|
|
user=user,
|
|
action=action,
|
|
object_type=object_type,
|
|
object_id=str(object_id) if object_id else '',
|
|
description=description,
|
|
ip_address=ip_address
|
|
)
|
|
except Exception as e:
|
|
logging.error(f"Error logging user activity: {e}")
|
|
|
|
def log_error(level, message, traceback='', user=None, request=None):
|
|
"""
|
|
Registra errores personalizados
|
|
|
|
Args:
|
|
level: Nivel del error (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
|
message: Mensaje del error
|
|
traceback: Traceback del error (opcional)
|
|
user: Usuario relacionado (opcional)
|
|
request: Request object (opcional)
|
|
"""
|
|
ip_address = None
|
|
request_path = ''
|
|
|
|
if request:
|
|
ip_address = get_client_ip(request)
|
|
request_path = request.path
|
|
|
|
try:
|
|
ErrorLog.objects.create(
|
|
level=level,
|
|
message=message,
|
|
traceback=traceback,
|
|
user=user,
|
|
ip_address=ip_address,
|
|
request_path=request_path
|
|
)
|
|
except Exception as e:
|
|
logging.error(f"Error logging custom error: {e}")
|
|
|
|
# Decorador para loggear automáticamente acciones
|
|
def log_action(action, object_type=''):
|
|
"""
|
|
Decorador para loggear automáticamente acciones en vistas
|
|
|
|
Usage:
|
|
@log_action('create', 'Pedimento')
|
|
def create_pedimento(request):
|
|
# tu código aquí
|
|
"""
|
|
def decorator(func):
|
|
def wrapper(request, *args, **kwargs):
|
|
result = func(request, *args, **kwargs)
|
|
|
|
if hasattr(request, 'user') and request.user.is_authenticated:
|
|
object_id = kwargs.get('pk', kwargs.get('id', ''))
|
|
log_user_activity(
|
|
user=request.user,
|
|
action=action,
|
|
object_type=object_type,
|
|
object_id=object_id,
|
|
request=request
|
|
)
|
|
|
|
return result
|
|
return wrapper
|
|
return decorator |