From bc9af2adf043f6457198d2142b84d522813e5852 Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Mon, 6 Nov 2023 18:25:07 +0100 Subject: [PATCH] Fix deepcopy & pickle for unsaved model instances & empty image fields (#324) --- stdimage/models.py | 8 ++++---- tests/test_models.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/stdimage/models.py b/stdimage/models.py index 6e0083d..dd429d8 100644 --- a/stdimage/models.py +++ b/stdimage/models.py @@ -158,9 +158,9 @@ def __getstate__(self): state = super().__getstate__() state["variations"] = {} for variation_name in self.field.variations: - variation = getattr(self, variation_name) - variation_state = variation.__getstate__() - state["variations"][variation_name] = variation_state + if variation := getattr(self, variation_name, None): + variation_state = variation.__getstate__() + state["variations"][variation_name] = variation_state return state def __setstate__(self, state): @@ -207,7 +207,7 @@ def __init__( render_variations=True, force_min_size=False, delete_orphans=False, - **kwargs + **kwargs, ): """ Standardized ImageField for Django. diff --git a/tests/test_models.py b/tests/test_models.py index e8d47f2..e234521 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -174,6 +174,20 @@ def test_defer(self, db, django_assert_num_queries): deferred.image assert instance.image.thumbnail == deferred.image.thumbnail + @pytest.mark.django_db + def test_variations_deepcopy_unsaved(self): + instance_original = ResizeModel(image=self.fixtures["600x400.jpg"]) + instance = deepcopy(instance_original) + assert isinstance(instance.image, StdImageFieldFile) + assert instance.image == instance_original.image + + @pytest.mark.django_db + def test_variations_deepcopy_without_image(self): + instance_original = ThumbnailModel.objects.create(image=None) + instance = deepcopy(instance_original) + assert isinstance(instance.image, StdImageFieldFile) + assert instance.image == instance_original.image + @pytest.mark.django_db def test_variations_deepcopy(self): """Tests test_variations() with a deep copied object"""