from datetime import date, datetime from decimal import Decimal from typing import Any from uuid import UUID from app.domain.timeutil import to_iso_z def jsonable(value: Any) -> Any: if value is None or isinstance(value, (str, int, bool)): return value if isinstance(value, Decimal): return format(value, "f") if isinstance(value, UUID): return str(value) if isinstance(value, datetime): return to_iso_z(value) if isinstance(value, date): return value.isoformat() if isinstance(value, dict): return {str(key): jsonable(item) for key, item in value.items()} if isinstance(value, (list, tuple)): return [jsonable(item) for item in value] if hasattr(value, "value"): return jsonable(value.value) return value