From 1decfc7b991c2dfe94e352418ee95901725a8feb Mon Sep 17 00:00:00 2001 From: Florian Demmer Date: Thu, 14 Sep 2023 15:54:08 +0200 Subject: [PATCH 1/2] Preserve kwargs passed to json.dumps() --- django_pydantic_field/base.py | 6 ++++++ tests/test_form_field.py | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/django_pydantic_field/base.py b/django_pydantic_field/base.py index c4e9d9b..1bda836 100644 --- a/django_pydantic_field/base.py +++ b/django_pydantic_field/base.py @@ -95,6 +95,7 @@ def prepare_schema(schema: "ModelType", owner: t.Any = None) -> None: def extract_export_kwargs(ctx: dict, extractor=dict.get) -> t.Dict[str, t.Any]: + # extract the model.json() kwargs from ctx and return them as export_params export_ctx = dict( exclude_defaults=extractor(ctx, "exclude_defaults", None), exclude_none=extractor(ctx, "exclude_none", None), @@ -109,6 +110,11 @@ def extract_export_kwargs(ctx: dict, extractor=dict.get) -> t.Dict[str, t.Any]: if exclude_fields is not None: export_ctx["exclude"] = {"__root__": exclude_fields} + # extract json.dumps() kwargs for formatting + dumps_kwargs = ['indent', 'separators', 'sort_keys'] + for key in dumps_kwargs: + export_ctx[key] = extractor(ctx, key, None) + return {k: v for k, v in export_ctx.items() if v is not None} diff --git a/tests/test_form_field.py b/tests/test_form_field.py index 0f3fdb7..cadcc6a 100644 --- a/tests/test_form_field.py +++ b/tests/test_form_field.py @@ -20,12 +20,31 @@ def test_form_schema_field(): cleaned_data = field.clean('{"stub_str": "abc", "stub_list": ["1970-01-01"]}') assert cleaned_data == InnerSchema.parse_obj({"stub_str": "abc", "stub_list": ["1970-01-01"]}) + def test_empty_form_values(): field = forms.SchemaField(InnerSchema, required=False) assert field.clean("") is None assert field.clean(None) is None +def test_prepare_value(): + field = forms.SchemaField(InnerSchema, required=False) + expected = '{"stub_str": "abc", "stub_int": 1, "stub_list": ["1970-01-01"]}' + assert expected == field.prepare_value({"stub_str": "abc", "stub_list": ["1970-01-01"]}) + + +def test_prepare_value_export_params(): + field = forms.SchemaField(InnerSchema, required=False, indent=2, sort_keys=True, separators=('', ' > ')) + expected = """{ + "stub_int" > 1 + "stub_list" > [ + "1970-01-01" + ] + "stub_str" > "abc" +}""" + assert expected == field.prepare_value({"stub_str": "abc", "stub_list": ["1970-01-01"]}) + + def test_empty_required_raises(): field = forms.SchemaField(InnerSchema) with pytest.raises(ValidationError) as e: @@ -83,6 +102,9 @@ def test_forwardref_model_formfield(): {"exclude_defaults": True}, {"exclude_none": True}, {"by_alias": True}, + {"indent": 4}, + {"separators": (',', ': ')}, + {"sort_keys": True}, ]) def test_form_field_export_kwargs(export_kwargs): field = forms.SchemaField(InnerSchema, required=False, **export_kwargs) From 150f8c00fb2d5b58d878ffba5c63f9a56b976d10 Mon Sep 17 00:00:00 2001 From: Savva Surenkov Date: Thu, 19 Oct 2023 02:14:23 +0400 Subject: [PATCH 2/2] Add extra `json.dump` kwargs --- django_pydantic_field/base.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/django_pydantic_field/base.py b/django_pydantic_field/base.py index 1bda836..e5d7919 100644 --- a/django_pydantic_field/base.py +++ b/django_pydantic_field/base.py @@ -95,12 +95,20 @@ def prepare_schema(schema: "ModelType", owner: t.Any = None) -> None: def extract_export_kwargs(ctx: dict, extractor=dict.get) -> t.Dict[str, t.Any]: - # extract the model.json() kwargs from ctx and return them as export_params + """ Extract ``BaseModel.json()`` kwargs from ctx for field deconstruction/reconstruction.""" + export_ctx = dict( exclude_defaults=extractor(ctx, "exclude_defaults", None), exclude_none=extractor(ctx, "exclude_none", None), exclude_unset=extractor(ctx, "exclude_unset", None), by_alias=extractor(ctx, "by_alias", None), + + # extract json.dumps(...) kwargs, see: https://docs.pydantic.dev/1.10/usage/exporting_models/#modeljson + skipkeys=extractor(ctx, "skipkeys", None), + indent=extractor(ctx, "indent", None), + separators=extractor(ctx, "separators", None), + allow_nan=extractor(ctx, "allow_nan", None), + sort_keys=extractor(ctx, "sort_keys", None), ) include_fields = extractor(ctx, "include", None) if include_fields is not None: @@ -110,11 +118,6 @@ def extract_export_kwargs(ctx: dict, extractor=dict.get) -> t.Dict[str, t.Any]: if exclude_fields is not None: export_ctx["exclude"] = {"__root__": exclude_fields} - # extract json.dumps() kwargs for formatting - dumps_kwargs = ['indent', 'separators', 'sort_keys'] - for key in dumps_kwargs: - export_ctx[key] = extractor(ctx, key, None) - return {k: v for k, v in export_ctx.items() if v is not None}