From 51b2ff754241cb0ff737b9c022edc056ae3ea319 Mon Sep 17 00:00:00 2001 From: Craig Weber Date: Fri, 2 Feb 2024 17:11:51 -0500 Subject: [PATCH] Fixes `Invariant in union serialization` when the value is a LazyObject --- reactivated/serialization/__init__.py | 5 +++++ tests/__snapshots__/serialization.ambr | 9 +++++++++ tests/serialization.py | 8 ++++++++ 3 files changed, 22 insertions(+) diff --git a/reactivated/serialization/__init__.py b/reactivated/serialization/__init__.py index a1553e5f..25cb8450 100644 --- a/reactivated/serialization/__init__.py +++ b/reactivated/serialization/__init__.py @@ -22,6 +22,7 @@ from django.conf import settings from django.db import models from django.forms.models import ModelChoiceIteratorValue +from django.utils.functional import LazyObject from django.utils.module_loading import import_string from reactivated import fields, stubs, utils @@ -1135,6 +1136,10 @@ def serialize( if value is None: return None + # If value is a lazy object, resolve it before continuing. + if isinstance(value, LazyObject): + value = value.__reduce__()[1][0] + serializer: Serializer serializer_path = schema.schema.get("serializer", None) diff --git a/tests/__snapshots__/serialization.ambr b/tests/__snapshots__/serialization.ambr index dd1687e8..4f7587ad 100644 --- a/tests/__snapshots__/serialization.ambr +++ b/tests/__snapshots__/serialization.ambr @@ -767,6 +767,15 @@ 'type': 'object', }) # --- +# name: test_serialize_lazy_object + Thing( + definitions=dict({ + }), + schema=dict({ + 'type': 'string', + }), + ) +# --- # name: test_simple_union Thing( definitions=dict({ diff --git a/tests/serialization.py b/tests/serialization.py index 68347e7f..4e09e938 100644 --- a/tests/serialization.py +++ b/tests/serialization.py @@ -23,6 +23,7 @@ from django.db import models as django_models from django.db.models import IntegerField, Model, UUIDField from django.forms.models import ModelChoiceIteratorValue +from django.utils.functional import SimpleLazyObject from django.utils.translation import gettext, gettext_lazy from jsonschema import validate @@ -245,6 +246,12 @@ def test_serialization(): convert_to_json_and_validate(serialized, generated_schema) +def test_serialize_lazy_object(snapshot): + schema = create_schema(str, {}) + assert serialize(SimpleLazyObject(lambda: "hello"), schema) == "hello" + assert schema == snapshot + + @pytest.mark.skip def test_form(): generated_schema = create_schema(forms.OperaForm, {}) @@ -608,6 +615,7 @@ def test_simple_union(snapshot): assert serialize(["1", "2", "3"], schema) == ["1", "2", "3"] assert serialize((5, "hello"), schema) == [5, "hello"] assert serialize(True, schema) is True + assert serialize(SimpleLazyObject(lambda: "hello"), schema) == "hello" assert schema == snapshot