File size: 898 Bytes
b1b7430
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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