from datetime import datetime,date from decimal import Decimal from typing import Any from pydantic import BaseModel def prepare_for_db(obj: Any) -> Any: """ Recursively sanitizes the object to be MongoDB-compatible: - Converts Decimal to float - Converts datetime with tzinfo to naive datetime - Converts Pydantic BaseModel to dict """ if isinstance(obj, Decimal): return float(obj) elif isinstance(obj, date) and not isinstance(obj, datetime): return datetime(obj.year, obj.month, obj.day) elif isinstance(obj, datetime): return obj.replace(tzinfo=None) elif isinstance(obj, BaseModel): return prepare_for_db(obj.dict()) elif isinstance(obj, dict): return {k: prepare_for_db(v) for k, v in obj.items()} elif isinstance(obj, list): return [prepare_for_db(v) for v in obj] else: return obj