27 lines
809 B
Python
27 lines
809 B
Python
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
|