From f0a7d5e1f261e45f17e3bd0fa0e5e3297310b541 Mon Sep 17 00:00:00 2001 From: acazares Date: Fri, 20 Feb 2026 11:54:40 -0600 Subject: [PATCH] refactor: enhance JSON serialization in AuditLog service --- .../modules/a76/audit_log/services/service.py | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/backend/api/v1/modules/a76/audit_log/services/service.py b/backend/api/v1/modules/a76/audit_log/services/service.py index dd1b18c1..7625241a 100644 --- a/backend/api/v1/modules/a76/audit_log/services/service.py +++ b/backend/api/v1/modules/a76/audit_log/services/service.py @@ -1,7 +1,9 @@ """ Audit Log Service """ -from datetime import datetime, timedelta +from datetime import datetime, timedelta, date, time +from decimal import Decimal +import uuid import pytz from typing import Optional, List, Dict, Any from sqlalchemy.orm import Session @@ -11,6 +13,29 @@ from core.security import verify_token # keep if needed or simpler just remove i # We don't need security import here anymore as context is passed explicitly or handled by events +def _make_json_safe(obj: Any) -> Any: + """Recursively convert non-JSON-serializable types to serializable equivalents.""" + if obj is None: + return None + if isinstance(obj, dict): + return {k: _make_json_safe(v) for k, v in obj.items()} + if isinstance(obj, (list, tuple)): + return [_make_json_safe(v) for v in obj] + if isinstance(obj, datetime): + return obj.isoformat() + if isinstance(obj, date): + return obj.isoformat() + if isinstance(obj, time): + return obj.isoformat() + if isinstance(obj, Decimal): + return float(obj) + if isinstance(obj, uuid.UUID): + return str(obj) + if isinstance(obj, bytes): + return obj.decode("utf-8", errors="replace") + return obj + + class AuditService: @staticmethod @@ -56,8 +81,8 @@ class AuditService: table_name=table_name, record_id=record_id, operation_type=operation_type, - old_values=old_values, - new_values=new_values, + old_values=_make_json_safe(old_values), + new_values=_make_json_safe(new_values), changed_fields=changed_fields, ip_address=ip_address, user_agent=user_agent,