Commit ab501acb authored by Serge S. Koval's avatar Serge S. Koval

Missing files.

parent 4742a1c2
...@@ -194,7 +194,7 @@ class FileUploadField(fields.TextField): ...@@ -194,7 +194,7 @@ class FileUploadField(fields.TextField):
self._delete_file(field) self._delete_file(field)
filename = self.generate_name(obj, self.data) filename = self.generate_name(obj, self.data)
self._save_file(self.data, filename) filename = self._save_file(self.data, filename)
setattr(obj, name, filename) setattr(obj, name, filename)
...@@ -222,6 +222,8 @@ class FileUploadField(fields.TextField): ...@@ -222,6 +222,8 @@ class FileUploadField(fields.TextField):
path = self._get_path(filename) path = self._get_path(filename)
data.save(path) data.save(path)
return filename
class ImageUploadField(FileUploadField): class ImageUploadField(FileUploadField):
""" """
...@@ -233,10 +235,18 @@ class ImageUploadField(FileUploadField): ...@@ -233,10 +235,18 @@ class ImageUploadField(FileUploadField):
""" """
widget = ImageUploadInput() widget = ImageUploadInput()
keep_image_formats = ('PNG',)
"""
If field detects that uploaded image is not in this list, it will save image
as PNG.
"""
def __init__(self, label=None, validators=None, def __init__(self, label=None, validators=None,
base_path=None, relative_path=None, base_path=None, relative_path=None,
namegen=None, allowed_extensions=None, namegen=None, allowed_extensions=None,
thumbgen=None, thumbnail_size=None, endpoint='static', max_size=None,
thumbgen=None, thumbnail_size=None,
endpoint='static',
**kwargs): **kwargs):
""" """
Constructor. Constructor.
...@@ -268,6 +278,9 @@ class ImageUploadField(FileUploadField): ...@@ -268,6 +278,9 @@ class ImageUploadField(FileUploadField):
:param allowed_extensions: :param allowed_extensions:
List of allowed extensions. If not provided, will allow any file. List of allowed extensions. If not provided, will allow any file.
:param max_size:
Tuple of (width, height, force) or None. If provided, Flask-Admin will
resize image to the desired size.
:param thumbgen: :param thumbgen:
Thumbnail filename generation function. All thumbnails will be saved as JPEG files, Thumbnail filename generation function. All thumbnails will be saved as JPEG files,
so there's no need to keep original file extension. so there's no need to keep original file extension.
...@@ -295,13 +308,14 @@ class ImageUploadField(FileUploadField): ...@@ -295,13 +308,14 @@ class ImageUploadField(FileUploadField):
if Image is None: if Image is None:
raise Exception('PIL library was not found') raise Exception('PIL library was not found')
self.max_size = max_size
self.thumbnail_fn = thumbgen or thumbgen_filename self.thumbnail_fn = thumbgen or thumbgen_filename
self.thumbnail_size = thumbnail_size self.thumbnail_size = thumbnail_size
self.endpoint = endpoint self.endpoint = endpoint
self.image = None self.image = None
if not allowed_extensions: if not allowed_extensions:
allowed_extensions = ('gif', 'jpg', 'jpeg', 'png') allowed_extensions = ('gif', 'jpg', 'jpeg', 'png', 'tiff')
super(ImageUploadField, self).__init__(label, validators, super(ImageUploadField, self).__init__(label, validators,
base_path=base_path, base_path=base_path,
...@@ -333,25 +347,48 @@ class ImageUploadField(FileUploadField): ...@@ -333,25 +347,48 @@ class ImageUploadField(FileUploadField):
# Saving # Saving
def _save_file(self, data, filename): def _save_file(self, data, filename):
data.save(self._get_path(filename)) if self.image and self.max_size:
filename, format = self._get_save_format(filename, self.image)
self._save_image(self._resize(self.image, self.max_size),
self._get_path(filename),
format)
else:
data.save(self._get_path(filename))
self._save_thumbnail(data, filename) self._save_thumbnail(data, filename)
return filename
def _save_thumbnail(self, data, filename): def _save_thumbnail(self, data, filename):
if self.image and self.thumbnail_size: if self.image and self.thumbnail_size:
thumb = self.image path = self._get_path(self.thumbnail_fn(filename))
(width, height, force) = self.thumbnail_size self._save_image(self._resize(self.image, self.thumbnail_size),
path)
if self.image.size[0] > width or self.image.size[1] > height: def _resize(self, image, size):
if force: (width, height, force) = size
thumb = ImageOps.fit(self.image, (width, height), Image.ANTIALIAS)
else:
thumb = self.image.copy().thumbnail((width, height), Image.ANTIALIAS)
path = self._get_path(self.thumbnail_fn(filename)) if image.size[0] > width or image.size[1] > height:
with open(path, 'wb') as fp: if force:
thumb.save(fp, 'JPEG') return ImageOps.fit(self.image, (width, height), Image.ANTIALIAS)
else:
return self.image.copy().thumbnail((width, height), Image.ANTIALIAS)
return image
def _save_image(self, image, path, format='JPEG'):
with open(path, 'wb') as fp:
image.save(fp, format)
def _get_save_format(self, filename, image):
if not image.format in self.keep_image_formats:
name, ext = op.splitext(filename)
filename = '%s.jpg' % name
return filename, 'JPEG'
return filename, image.format
# Helpers # Helpers
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment