Skip to content

Commit

Permalink
Avoid image overwritting on rerender
Browse files Browse the repository at this point in the history
  • Loading branch information
noirbizarre committed Jun 24, 2017
1 parent 1bf0ee9 commit bbb87cf
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Current
- Added `NONE` extensions specification
- Added `list_files` to `Storage` to list the current bucket files
- Image optimization preserve file type as much as possible
- Ensure images are not overwritted before rerendering

0.3.0 (2017-03-05)
------------------
Expand Down
6 changes: 4 additions & 2 deletions flask_fs/mongo.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from __future__ import unicode_literals

import bisect
import io
import logging
import six

Expand Down Expand Up @@ -193,8 +194,9 @@ def rerender(self):
If optmization settings or expected sizes changed,
they will be used for the new rendering.
'''
with self.fs.open(self.original, 'rb') as img:
self.save(img, filename=self.filename, bbox=self.bbox, overwrite=True)
with self.fs.open(self.original, 'rb') as f_img:
img = io.BytesIO(f_img.read()) # Store the image in memory to avoid overwritting
self.save(img, filename=self.filename, bbox=self.bbox, overwrite=True)

__call__ = best_url

Expand Down
47 changes: 47 additions & 0 deletions tests/test_mongoengine.py
Original file line number Diff line number Diff line change
Expand Up @@ -792,6 +792,53 @@ class Tester(db.Document):
assert optimized.size == source.size
assert os.stat(path_optimized).st_size < os.stat(path_original).st_size

def test_rerender_multiple(self, app, storage, resource, image):
class Tester(db.Document):
image = ImageField(fs=storage, max_size=100, optimize=True)

filename = 'flask.{0}'.format(self.ext)
filename_original = 'flask-original.{0}'.format(self.ext)

storage.write(filename_original, image)

tester = Tester()
tester.image.original = filename_original
tester.image.filename = filename
assert tester.to_mongo() == {
'image': {
'original': filename_original,
'filename': filename,
}
}

tester.image.rerender()
tester.save().reload()

assert tester.image
assert str(tester.image) == tester.image.url
assert tester.image.filename == filename
assert tester.image.original == filename_original
assert filename in storage
assert tester.to_mongo() == {
'_id': tester.pk,
'image': {
'filename': filename,
'original': filename_original,
}
}

path_original = storage.path(filename_original)
path_optimized = storage.path(filename)

with open(path_original, 'rb') as f_orig:
with open(path_optimized, 'rb') as f_optimized:
source = Image.open(image)
original = Image.open(f_orig)
optimized = Image.open(f_optimized)
assert original.size == source.size
assert optimized.size[0] == 100
assert os.stat(path_optimized).st_size < os.stat(path_original).st_size


class ImageFieldPngTest(ImageFieldTestMixin):
ext = 'png'
Expand Down

0 comments on commit bbb87cf

Please sign in to comment.