BeanieODM/beanie

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

dantetemplar opened this issue · 4 comments

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

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

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

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

someday I will create PR...