Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refacor dbfield #118

Merged
merged 3 commits into from
Apr 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions pyodmongo/models/db_field_info.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from typing import Any
from pydantic import BaseModel, ConfigDict
from dataclasses import dataclass


class DbField(BaseModel):
@dataclass
class DbField:
field_name: str = None
field_alias: str = None
path_str: str = None
field_type: Any = None
by_reference: bool = None
is_list: bool = None
has_model_fields: bool = None
model_config = ConfigDict(extra="allow")
12 changes: 10 additions & 2 deletions pyodmongo/models/db_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,28 @@
resolve_indexes,
resolve_class_fields_db_info,
resolve_reference_pipeline,
resolve_db_fields,
)
from pydantic import BaseModel
from pydantic._internal._model_construction import ModelMetaclass
from typing_extensions import dataclass_transform
from typing import ClassVar
import copy


@dataclass_transform()
@dataclass_transform(kw_only_default=True)
class DbMeta(ModelMetaclass):
def __new__(cls, name: str, bases: tuple, namespace: dict, **kwargs: Any) -> type:
def __new__(
cls, name: str, bases: tuple[Any], namespace: dict, **kwargs: Any
) -> type:
setattr(cls, "__pyodmongo_complete__", False)
for base in bases:
setattr(base, "__pyodmongo_complete__", False)

# TODO finish db_fields after ModelMetaclass
db_fields = copy.deepcopy(namespace.get("__annotations__"))
db_fields = resolve_db_fields(bases=bases, db_fields=db_fields)

cls: BaseModel = ModelMetaclass.__new__(cls, name, bases, namespace, **kwargs)

setattr(cls, "__pyodmongo_complete__", True)
Expand Down
18 changes: 18 additions & 0 deletions pyodmongo/services/model_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,21 @@ def resolve_class_fields_db_info(cls: BaseModel):
db_field_info=db_field_info, path=[path]
)
setattr(cls, field + "__pyodmongo", field_to_set)


# TODO finish resolve_single_db_field
def resolve_single_db_field(value: Any) -> DbField:
by_reference = False
return value


def resolve_db_fields(bases: tuple[Any], db_fields: dict):
for base in bases:
if base is object:
continue
base_annotations = base.__dict__.get("__annotations__")
for base_field, value in base_annotations.items():
if base_field not in db_fields.keys() and not base_field.startswith("_"):
db_fields[base_field] = resolve_single_db_field(value=value)
resolve_db_fields(bases=base.__bases__, db_fields=db_fields)
return db_fields
Loading