BeanieODM / beanie

Asynchronous Python ODM for MongoDB
http://beanie-odm.dev/
Apache License 2.0
1.91k stars 201 forks source link

[BUG] Double return in sources code of class beanie.odm.fields.Link #891

Closed dantetemplar closed 2 months ago

dantetemplar commented 4 months ago

Describe the bug The beanie.odm.fields.Link.__get_pydantic_core_schema__ method has two return statements, while the second one is never executed.

To Reproduce https://github.com/roman-right/beanie/blob/e2d95be0843375353d6ec79a230f63d4f874ee0e/beanie/odm/fields.py#L396-L419

Expected behavior No redundant return statement inside the method; Also this method should not use deprecated pydantic_core.core_schema.general_plain_validator_function

dantetemplar commented 4 months ago

Actually, I've struggled with json schema for beanie Link....

That's my solution for replacing _id with id in FastAPI, and dividing Input and Output shemas for Generic Link

__all__ = ["CustomDocument", "CustomLink"]

from typing import Type, Any, TypeVar, get_args

from beanie import Document, PydanticObjectId, Link
from beanie.odm.registry import DocsRegistry
from pydantic import Field, ConfigDict, GetCoreSchemaHandler
from pydantic_core import CoreSchema, core_schema

class CustomDocument(Document):
    model_config = ConfigDict(json_schema_extra={})

    id: PydanticObjectId | None = Field(default=None, description="MongoDB document ObjectID", serialization_alias="id")

    class Settings:
        keep_nulls = False
        max_nesting_depth = 1

D = TypeVar("D", bound=Document)

class CustomLink(Link[D]):
    @classmethod
    def __get_pydantic_core_schema__(cls, source_type: Type[Any], handler: GetCoreSchemaHandler) -> CoreSchema:
        document_class = DocsRegistry.evaluate_fr(get_args(source_type)[0])
        document_class: Type[Document]

        serialization_schema = core_schema.plain_serializer_function_ser_schema(
            lambda instance: cls.serialize(instance),
            return_schema=core_schema.union_schema(
                [
                    core_schema.typed_dict_schema(
                        {
                            "id": core_schema.typed_dict_field(core_schema.str_schema()),
                            "collection": core_schema.typed_dict_field(core_schema.str_schema()),
                        }
                    ),
                    document_class.__pydantic_core_schema__,
                ],
            ),
        )

        schema = core_schema.json_or_python_schema(
            python_schema=core_schema.with_info_plain_validator_function(cls.build_validation(handler, source_type)),
            json_schema=core_schema.with_default_schema(core_schema.str_schema(), default="5eb7cf5a86d9755df3a6c593"),
            serialization=serialization_schema,
        )

        return schema
github-actions[bot] commented 3 months ago

This issue is stale because it has been open 30 days with no activity.

github-actions[bot] commented 2 months ago

This issue was closed because it has been stalled for 14 days with no activity.

dantetemplar commented 2 months ago

someday I will create PR...