Skip to content

Commit 10de772

Browse files
vchrisbcodingjoe
authored andcommitted
Fix #246 -- Add support for deepcopy
1 parent 90cf8de commit 10de772

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

Diff for: stdimage/models.py

+19
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,25 @@ def delete_variations(self):
144144
variation_name = self.get_variation_name(self.name, variation)
145145
self.storage.delete(variation_name)
146146

147+
def __getstate__(self):
148+
state = super().__getstate__()
149+
state["variations"] = {}
150+
for variation_name in self.field.variations:
151+
variation = getattr(self, variation_name)
152+
variation_state = variation.__getstate__()
153+
state["variations"][variation_name] = variation_state
154+
return state
155+
156+
def __setstate__(self, state):
157+
variations = state["variations"]
158+
state.pop("variations")
159+
super().__setstate__(state)
160+
for key, value in variations.items():
161+
cls = ImageFieldFile
162+
field = cls.__new__(cls)
163+
setattr(self, key, field)
164+
getattr(self, key).__setstate__(value)
165+
147166

148167
class StdImageField(ImageField):
149168
"""

Diff for: tests/test_models.py

+45
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import io
22
import os
33
import time
4+
from copy import deepcopy
45

56
import pytest
67
from django.conf import settings
78
from django.core.files.storage import default_storage
89
from django.core.files.uploadedfile import SimpleUploadedFile
10+
from django.db.models.fields.files import ImageFieldFile
911
from PIL import Image
1012

13+
from stdimage.models import StdImageFieldFile
14+
1115
from . import models
1216
from .models import (
1317
AdminDeleteModel,
@@ -170,6 +174,47 @@ def test_defer(self, db, django_assert_num_queries):
170174
deferred.image
171175
assert instance.image.thumbnail == deferred.image.thumbnail
172176

177+
@pytest.mark.django_db
178+
def test_variations_deepcopy(self):
179+
"""Tests test_variations() with a deep copied object"""
180+
instance_original = ResizeModel.objects.create(
181+
image=self.fixtures["600x400.jpg"]
182+
)
183+
instance = deepcopy(instance_original)
184+
assert isinstance(instance.image, StdImageFieldFile)
185+
186+
assert hasattr(instance.image, "thumbnail")
187+
assert hasattr(instance.image, "medium")
188+
189+
assert isinstance(instance.image.thumbnail, ImageFieldFile)
190+
assert isinstance(instance.image.medium, ImageFieldFile)
191+
192+
source_file = self.fixtures["600x400.jpg"]
193+
194+
assert os.path.exists(os.path.join(IMG_DIR, "600x400.jpg"))
195+
assert instance.image.width == 600
196+
assert instance.image.height == 400
197+
path = os.path.join(IMG_DIR, "600x400.jpg")
198+
199+
with open(path, "rb") as f:
200+
source_file.seek(0)
201+
assert source_file.read() == f.read()
202+
203+
path = os.path.join(IMG_DIR, "600x400.medium.jpg")
204+
assert os.path.exists(path)
205+
assert instance.image.medium.width == 400
206+
assert instance.image.medium.height <= 400
207+
with open(os.path.join(IMG_DIR, "600x400.medium.jpg"), "rb") as f:
208+
source_file.seek(0)
209+
assert source_file.read() != f.read()
210+
211+
assert os.path.exists(os.path.join(IMG_DIR, "600x400.thumbnail.jpg"))
212+
assert instance.image.thumbnail.width == 100
213+
assert instance.image.thumbnail.height <= 75
214+
with open(os.path.join(IMG_DIR, "600x400.thumbnail.jpg"), "rb") as f:
215+
source_file.seek(0)
216+
assert source_file.read() != f.read()
217+
173218

174219
class TestUtils(TestStdImage):
175220
"""Tests Utils"""

0 commit comments

Comments
 (0)