diff --git a/awesome_avatar/fields.py b/awesome_avatar/fields.py index f73032d..b685187 100644 --- a/awesome_avatar/fields.py +++ b/awesome_avatar/fields.py @@ -1,13 +1,18 @@ import os +import uuid from awesome_avatar.settings import config from django.core.files.uploadedfile import InMemoryUploadedFile from django.db import models from awesome_avatar import forms +from awesome_avatar.widgets import AvatarWidget try: from cStringIO import StringIO except ImportError: - from StringIO import StringIO + try: + from StringIO import StringIO + except ImportError: # python 3 + from io import BytesIO as StringIO try: from PIL import Image @@ -32,10 +37,16 @@ def __init__(self, *args, **kwargs): super(AvatarField, self).__init__(*args, **kwargs) def formfield(self, **kwargs): - defaults = {'form_class': forms.AvatarField} - defaults['width'] = self.width - defaults['height'] = self.height + defaults = { + 'form_class': forms.AvatarField, + 'width': self.width, + 'height': self.height, + } defaults.update(kwargs) + + # django 1.7 fix default widget + if not defaults.get('widget') or not isinstance(defaults.get('widget'), AvatarWidget): + defaults['widget'] = AvatarWidget return super(AvatarField, self).formfield(**defaults) def save_form_data(self, instance, data): @@ -43,15 +54,13 @@ def save_form_data(self, instance, data): file_ = data['file'] if file_: - image = Image.open(StringIO(file_.read())) + image = Image.open(file_) image = image.crop(data['box']) image = image.resize((self.width, self.height), Image.ANTIALIAS) - content = StringIO() - image.save(content, config.save_format, quality=config.save_quality) + file_name = u'{}.{}'.format(str(uuid.uuid1()), config.save_format) + new_data = InMemoryUploadedFile(StringIO(), None, file_name, 'image/' + config.save_format, 0, None) - file_name = u'{}.{}'.format(os.path.splitext(file_.name)[0], config.save_format) + image.save(new_data, config.save_format, quality=config.save_quality) - # new_data = SimpleUploadedFile(file.name, content.getvalue(), content_type='image/' + config.save_format) - new_data = InMemoryUploadedFile(content, None, file_name, 'image/' + config.save_format, len(content.getvalue()), None) super(AvatarField, self).save_form_data(instance, new_data) diff --git a/awesome_avatar/forms.py b/awesome_avatar/forms.py index 71e4d4b..65219d5 100644 --- a/awesome_avatar/forms.py +++ b/awesome_avatar/forms.py @@ -17,4 +17,4 @@ def to_python(self, data): return data def widget_attrs(self, widget): - return {'width': self.width, 'height': self.height} \ No newline at end of file + return {'width': self.width, 'height': self.height}