From 4d6a9d9c08e397fedc45b7cbb8d25ae125e2feec Mon Sep 17 00:00:00 2001 From: Savva Surenkov Date: Mon, 24 Jul 2023 12:11:09 +0400 Subject: [PATCH] Add backward support for pydantic 1.9.* --- django_pydantic_field/base.py | 19 ++++++------------- django_pydantic_field/utils.py | 16 ++++++++++++++++ pyproject.toml | 2 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/django_pydantic_field/base.py b/django_pydantic_field/base.py index a4caadd..c4e9d9b 100644 --- a/django_pydantic_field/base.py +++ b/django_pydantic_field/base.py @@ -2,11 +2,10 @@ import pydantic from django.core.serializers.json import DjangoJSONEncoder -from pydantic.config import get_config, inherit_config from pydantic.json import pydantic_encoder from pydantic.typing import display_as_type -from .utils import get_local_namespace +from .utils import get_local_namespace, inherit_configs __all__ = ( "SchemaEncoder", @@ -134,15 +133,9 @@ def _get_field_schema_name(schema) -> str: def _get_field_schema_params(schema, config=None, allow_null=False, **kwargs) -> dict: root_model = t.Optional[schema] if allow_null else schema - params: t.Dict[str, t.Any] = dict(kwargs, __root__=(root_model, ...)) - parent_config = getattr(schema, "Config", None) - - if config is not None: - config = get_config(config) - if parent_config is not None: - config = inherit_config(config, parent_config) - else: - config = parent_config - - params["__config__"] = config + params: t.Dict[str, t.Any] = dict( + kwargs, + __root__=(root_model, ...), + __config__=inherit_configs(schema, config), + ) return params diff --git a/django_pydantic_field/utils.py b/django_pydantic_field/utils.py index c39fb73..3a8622b 100644 --- a/django_pydantic_field/utils.py +++ b/django_pydantic_field/utils.py @@ -1,6 +1,13 @@ +from __future__ import annotations + import sys import typing as t +from pydantic.config import BaseConfig, inherit_config + +if t.TYPE_CHECKING: + from pydantic import BaseModel + def get_annotated_type(obj, field, default=None) -> t.Any: try: @@ -20,3 +27,12 @@ def get_local_namespace(cls) -> t.Dict[str, t.Any]: return vars(sys.modules[module]) except (KeyError, AttributeError): return {} + + +def inherit_configs(parent: t.Type[BaseModel], config: t.Type | dict | None = None) -> t.Type[BaseConfig]: + parent_config = t.cast(t.Type[BaseConfig], getattr(parent, "Config", BaseConfig)) + if config is None: + return parent_config + if isinstance(config, dict): + config = type("Config", (BaseConfig,), config) + return inherit_config(config, parent_config) diff --git a/pyproject.toml b/pyproject.toml index c7c11ce..1fd0418 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "django-pydantic-field" -version = "0.2.7" +version = "0.2.8" description = "Django JSONField with Pydantic models as a Schema" readme = "README.md" license = { file = "LICENSE" }