Skip to content

Commit b16c3a5

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

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

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
"""

tests/test_models.py

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

6+
import pkg_resources
57
import pytest
68
from django.conf import settings
79
from django.core.files.storage import default_storage
810
from django.core.files.uploadedfile import SimpleUploadedFile
11+
from django.db.models.fields.files import ImageFieldFile
12+
from django.utils import version
913
from PIL import Image
1014

15+
from stdimage.models import StdImageFieldFile
16+
1117
from . import models
1218
from .models import (
1319
AdminDeleteModel,
@@ -170,6 +176,47 @@ def test_defer(self, db, django_assert_num_queries):
170176
deferred.image
171177
assert instance.image.thumbnail == deferred.image.thumbnail
172178

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

174221
class TestUtils(TestStdImage):
175222
"""Tests Utils"""

0 commit comments

Comments
 (0)