From a8dbb62b09bd4932576bcdfa383417e4d8549bf6 Mon Sep 17 00:00:00 2001 From: juanjo <130799031+juanminguezsanz2023@users.noreply.github.com> Date: Thu, 16 Apr 2026 17:28:48 +0200 Subject: [PATCH] fix: serializar dates/Decimal en LogService con DjangoJSONEncoder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Añadir _json_safe() que usa DjangoJSONEncoder para convertir objetos no serializables (datetime.date, Decimal, UUID...) antes de guardar en JSONField, evitando que response quede vacío silenciosamente - Corregir condición status_code: usar 'is not None' para permitir status=0 Co-Authored-By: Claude Sonnet 4.6 --- app/general/utilidades/acciones.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/app/general/utilidades/acciones.py b/app/general/utilidades/acciones.py index 0df937b..15578df 100644 --- a/app/general/utilidades/acciones.py +++ b/app/general/utilidades/acciones.py @@ -1,10 +1,25 @@ +import json import logging from django.utils import timezone +from django.core.serializers.json import DjangoJSONEncoder from . import utils logger = logging.getLogger(__name__) +def _json_safe(value): + """ + Convierte cualquier valor a un tipo seguro para JSONField. + Usa DjangoJSONEncoder para manejar date, datetime, Decimal, UUID, etc. + """ + if value is None or value == '': + return value + try: + return json.loads(json.dumps(value, cls=DjangoJSONEncoder)) + except Exception: + return str(value) + + class LogService: """ Servicio centralizado de gestión de logs. @@ -38,7 +53,7 @@ class LogService: @staticmethod def _ejecutar_log(caller, request, log_id, path, user, body_request, body_response, status_code): - # Importación aquí para evitar problemas de arranque si la BD no está lista + # Importación diferida para evitar problemas de arranque si la BD no está lista from backend_admin.models import Log # Determinar la app llamante a partir del módulo de la vista @@ -87,10 +102,11 @@ class LogService: if path: datos_a_actualizar['path'] = path if body_request is not None: - datos_a_actualizar['request'] = body_request + # _json_safe convierte dates, Decimals, etc. a tipos JSON válidos + datos_a_actualizar['request'] = _json_safe(body_request) if body_response is not None: - datos_a_actualizar['response'] = body_response - if status_code: + datos_a_actualizar['response'] = _json_safe(body_response) + if status_code is not None: datos_a_actualizar['status_code'] = str(status_code) Log.objects.filter(pk=log_id).update(**datos_a_actualizar)