51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
from typing import TYPE_CHECKING, Optional, Set
|
|
|
|
from beanie.odm.utils.encoder import Encoder
|
|
|
|
if TYPE_CHECKING:
|
|
from beanie.odm.documents import Document
|
|
|
|
|
|
def get_dict(
|
|
document: "Document",
|
|
to_db: bool = False,
|
|
exclude: Optional[Set[str]] = None,
|
|
keep_nulls: bool = True,
|
|
):
|
|
if exclude is None:
|
|
exclude = set()
|
|
if document.id is None:
|
|
exclude.add("_id")
|
|
if not document.get_settings().use_revision:
|
|
exclude.add("revision_id")
|
|
encoder = Encoder(exclude=exclude, to_db=to_db, keep_nulls=keep_nulls)
|
|
return encoder.encode(document)
|
|
|
|
|
|
def get_nulls(
|
|
document: "Document",
|
|
exclude: Optional[Set[str]] = None,
|
|
):
|
|
dictionary = get_dict(document, exclude=exclude, keep_nulls=True)
|
|
return filter_none(dictionary)
|
|
|
|
|
|
def get_top_level_nones(
|
|
document: "Document",
|
|
exclude: Optional[Set[str]] = None,
|
|
):
|
|
dictionary = get_dict(document, exclude=exclude, keep_nulls=True)
|
|
return {k: v for k, v in dictionary.items() if v is None}
|
|
|
|
|
|
def filter_none(d):
|
|
result = {}
|
|
for k, v in d.items():
|
|
if isinstance(v, dict):
|
|
filtered = filter_none(v)
|
|
if filtered:
|
|
result[k] = filtered
|
|
elif v is None:
|
|
result[k] = v
|
|
return result
|