Skip to content

Commit 4e76f88

Browse files
committed
fix deepcopy & pickle for unsaved model instances & empty image fields
1 parent bf0ff68 commit 4e76f88

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

Diff for: stdimage/models.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,9 @@ def __getstate__(self):
158158
state = super().__getstate__()
159159
state["variations"] = {}
160160
for variation_name in self.field.variations:
161-
variation = getattr(self, variation_name)
162-
variation_state = variation.__getstate__()
163-
state["variations"][variation_name] = variation_state
161+
if variation := getattr(self, variation_name, None):
162+
variation_state = variation.__getstate__()
163+
state["variations"][variation_name] = variation_state
164164
return state
165165

166166
def __setstate__(self, state):
@@ -207,7 +207,7 @@ def __init__(
207207
render_variations=True,
208208
force_min_size=False,
209209
delete_orphans=False,
210-
**kwargs
210+
**kwargs,
211211
):
212212
"""
213213
Standardized ImageField for Django.

Diff for: tests/test_models.py

+15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import io
22
import os
3+
import pickle
34
import time
45
from copy import deepcopy
56

@@ -174,6 +175,20 @@ def test_defer(self, db, django_assert_num_queries):
174175
deferred.image
175176
assert instance.image.thumbnail == deferred.image.thumbnail
176177

178+
@pytest.mark.django_db
179+
def test_variations_deepcopy_unsaved(self):
180+
instance_original = ResizeModel(image=self.fixtures["600x400.jpg"])
181+
instance = deepcopy(instance_original)
182+
assert isinstance(instance.image, StdImageFieldFile)
183+
assert instance.image == instance_original.image
184+
185+
@pytest.mark.django_db
186+
def test_variations_deepcopy_without_image(self):
187+
instance_original = ThumbnailModel.objects.create(image=None)
188+
instance = deepcopy(instance_original)
189+
assert isinstance(instance.image, StdImageFieldFile)
190+
assert instance.image == instance_original.image
191+
177192
@pytest.mark.django_db
178193
def test_variations_deepcopy(self):
179194
"""Tests test_variations() with a deep copied object"""

0 commit comments

Comments
 (0)