def get_from_file(self, file_path, upload_to=None, preview_w=None, preview_h=None): from cropduster.models import Image from cropduster.views.forms import clean_upload_data image_file = VirtualFieldFile(file_path) md5 = hashlib.md5() image_contents = image_file.read() md5.update(image_contents) basepath, basename = os.path.split(file_path) basefile, extension = os.path.splitext(basename) if basefile == 'original': basepath, basename = os.path.split(basepath) basename += extension standalone, created = self.get_or_create(md5=md5.hexdigest().lower()) if created or not standalone.image: file_data = clean_upload_data({ 'image': SimpleUploadedFile(basename, image_contents), 'upload_to': upload_to, }) file_path = get_relative_media_url(file_data['image'].name) standalone.image = file_path standalone.save() else: file_path = get_relative_media_url(standalone.image.name) cropduster_image, created = Image.objects.get_or_create( content_type=ContentType.objects.get_for_model(StandaloneImage), object_id=standalone.pk) standalone.image.related_object = cropduster_image cropduster_image.image = file_path cropduster_image.save() cropduster_image.save_preview(preview_w, preview_h) return standalone
def __init__(self, path, upload_to=None, preview_w=None, preview_h=None): self.upload_to = upload_to self.preview_width = preview_w self.preview_height = preview_h self.metadata = {} if not path: self.name = None return if '%' in path: path = urlunquote_plus(path) if path.startswith(settings.MEDIA_URL): # Strips leading MEDIA_URL, if starts with self._path = get_relative_media_url(path, clean_slashes=False) elif re.search(r'^(?:http(?:s)?:)?//', path): # url on other server? download it. self._path = self.download_image_url(path) else: abs_path = get_media_path(path) if os.path.exists(abs_path): self._path = get_relative_media_url(abs_path) if not self._path or not os.path.exists(os.path.join(settings.MEDIA_ROOT, self._path)): self.name = None return super(ImageFile, self).__init__(self._path) if self: self.preview_image = self.get_for_size('preview')
def __init__(self, path, upload_to=None, preview_w=None, preview_h=None): self.upload_to = upload_to self.preview_width = preview_w self.preview_height = preview_h self.metadata = {} if not path: self.name = None return if '%' in path: path = urlunquote_plus(path) if path.startswith(settings.MEDIA_URL): # Strips leading MEDIA_URL, if starts with self._path = get_relative_media_url(path, clean_slashes=False) elif re.search(r'^(?:http(?:s)?:)?//', path): # url on other server? download it. self._path = self.download_image_url(path) else: if default_storage.exists(path): self._path = path if not self._path: self.name = None return super(ImageFile, self).__init__(self._path) if self: self.preview_image = self.get_for_size('preview')
def download_image_url(self, url): from cropduster.models import StandaloneImage from cropduster.views.forms import clean_upload_data image_contents = urlopen(url).read() md5_hash = hashlib.md5() md5_hash.update(image_contents) try: standalone_image = StandaloneImage.objects.get(md5=md5_hash.hexdigest()) except StandaloneImage.DoesNotExist: pass else: return get_relative_media_url(standalone_image.image.name) parse_result = urlparse.urlparse(url) fake_upload = SimpleUploadedFile(os.path.basename(parse_result.path), image_contents) file_data = clean_upload_data({ 'image': fake_upload, 'upload_to': self.upload_to, }) return get_relative_media_url(file_data['image'].name)
def format_error(error): from generic_plus.utils import get_relative_media_url if isinstance(error, six.string_types): return error elif isinstance(error, IOError): if error.errno == errno.ENOENT: # No such file or directory file_name = get_relative_media_url(error.filename) return u"Could not find file %s" % file_name return u"[%(type)s] %(msg)s" % { 'type': error.__class__.__name__, 'msg': error, }
def download_image_url(self, url): from cropduster.models import StandaloneImage from cropduster.views.forms import clean_upload_data image_contents = urlopen(url).read() md5_hash = hashlib.md5() md5_hash.update(image_contents) try: standalone_image = StandaloneImage.objects.get( md5=md5_hash.hexdigest()) except StandaloneImage.DoesNotExist: pass else: return get_relative_media_url(standalone_image.image.name) parse_result = urlparse.urlparse(url) fake_upload = SimpleUploadedFile(os.path.basename(parse_result.path), image_contents) file_data = clean_upload_data({ 'image': fake_upload, 'upload_to': self.upload_to, }) return get_relative_media_url(file_data['image'].name)
def get_file_for_size(image, size_name='original', tmp=False): if isinstance(image, six.string_types): image = VirtualFieldFile(image) if not image: return None path, basename = os.path.split(safe_str_path(image.path)) filename, extension = os.path.splitext(basename) if size_name == 'preview': size_name = '_preview' if tmp: size_name = '%s_tmp' % size_name return VirtualFieldFile( '/'.join([ get_relative_media_url(path), safe_str_path(size_name) + extension]))
def upload(request): if request.method == 'GET': return index(request) # The data we'll be returning as JSON data = { 'warning': [], } form = UploadForm(request.POST, request.FILES) if not form.is_valid(): errors = form['image'].errors or form.errors return json_error(request, 'upload', action="uploading file", errors=[force_text(errors)]) form_data = form.cleaned_data is_standalone = bool(form_data.get('standalone')) orig_file_path = form_data['image'].name if six.PY2 and isinstance(orig_file_path, six.text_type): orig_file_path = orig_file_path.encode('utf-8') orig_image = get_relative_media_url(orig_file_path) with default_storage.open(orig_image, mode='rb') as f: img = PIL.Image.open(BytesIO(f.read())) img.filename = f.name (w, h) = (orig_w, orig_h) = img.size if is_animated_gif(img) and not has_animated_gif_support(): data['warning'].append( u"This server does not have animated gif support; your uploaded image " u"has been made static.") tmp_image = Image(image=orig_image) preview_w = form_data.get('preview_width') or PREVIEW_WIDTH preview_h = form_data.get('preview_height') or PREVIEW_HEIGHT # First pass resize if it's too large resize_ratio = min(preview_w / w, preview_h / h) def fit_preview(im): (w, h) = im.size if resize_ratio < 1: w = int(round(w * resize_ratio)) h = int(round(h * resize_ratio)) preview_img = im.resize((w, h), PIL.Image.ANTIALIAS) else: preview_img = im return preview_img if not is_standalone: preview_file_path = tmp_image.get_image_path('_preview') process_image(img, preview_file_path, fit_preview) data.update({ 'crop': { 'orig_image': orig_image, 'orig_w': orig_w, 'orig_h': orig_h, 'image_id': None, }, 'url': tmp_image.get_image_url('_preview'), 'orig_image': orig_image, 'orig_w': orig_w, 'orig_h': orig_h, 'width': w, 'height': h, }) if not is_standalone: return HttpResponse(json.dumps(data), content_type='application/json') size = Size('crop', w=img.size[0], h=img.size[1]) md5 = form_data.get('md5') try: standalone_image = StandaloneImage.objects.get(md5=md5) except StandaloneImage.DoesNotExist: standalone_image = StandaloneImage(md5=md5, image=orig_image) standalone_image.save() cropduster_image, created = Image.objects.get_or_create( content_type=ContentType.objects.get_for_model(StandaloneImage), object_id=standalone_image.pk) if not cropduster_image.image: cropduster_image.image = orig_image cropduster_image.save() elif cropduster_image.image.name != orig_image: data['crop']['orig_image'] = data[ 'orig_image'] = cropduster_image.image.name data['url'] = cropduster_image.get_image_url('_preview') with cropduster_image.image as f: f.open() img = PIL.Image.open(BytesIO(f.read())) img.filename = f.name preview_file_path = cropduster_image.get_image_path('_preview') if not default_storage.exists(preview_file_path): process_image(img, preview_file_path, fit_preview) thumb = cropduster_image.save_size(size, standalone=True, commit=False) sizes = form_data.get('sizes') or [] if len(sizes) == 1: size = sizes[0] else: size = Size('crop') data.update({ 'thumbs': [{ 'crop_x': thumb.crop_x, 'crop_y': thumb.crop_y, 'crop_w': thumb.crop_w, 'crop_h': thumb.crop_h, 'width': thumb.width, 'height': thumb.height, 'id': None, 'changed': True, 'size': json.dumps(size), 'name': thumb.name, }] }) data['crop'].update({ 'image_id': cropduster_image.pk, 'sizes': json.dumps([size]), }) return HttpResponse(json.dumps(data), content_type='application/json')
def upload(request): if request.method == 'GET': return index(request) # The data we'll be returning as JSON data = { 'warning': [], } form = UploadForm(request.POST, request.FILES) if not form.is_valid(): errors = form['image'].errors or form.errors return json_error(request, 'upload', action="uploading file", errors=[force_text(errors)]) form_data = form.cleaned_data is_standalone = bool(form_data.get('standalone')) orig_file_path = form_data['image'].name if six.PY2 and isinstance(orig_file_path, unicode): orig_file_path = orig_file_path.encode('utf-8') orig_image = get_relative_media_url(orig_file_path) img = PIL.Image.open(orig_file_path) (w, h) = (orig_w, orig_h) = img.size if is_animated_gif(img) and not has_animated_gif_support(): data['warning'].append( u"This server does not have animated gif support; your uploaded image " u"has been made static.") tmp_image = Image(image=orig_image) preview_w = form_data.get('preview_width') or PREVIEW_WIDTH preview_h = form_data.get('preview_height') or PREVIEW_HEIGHT # First pass resize if it's too large resize_ratio = min(preview_w / w, preview_h / h) def fit_preview(im): (w, h) = im.size if resize_ratio < 1: w = int(round(w * resize_ratio)) h = int(round(h * resize_ratio)) preview_img = im.resize((w, h), PIL.Image.ANTIALIAS) else: preview_img = im return preview_img if not is_standalone: preview_file_path = tmp_image.get_image_path('_preview') process_image(img, preview_file_path, fit_preview) data.update({ 'crop': { 'orig_image': orig_image, 'orig_w': orig_w, 'orig_h': orig_h, 'image_id': None, }, 'url': tmp_image.get_image_url('_preview'), 'orig_image': orig_image, 'orig_w': orig_w, 'orig_h': orig_h, 'width': w, 'height': h, }) if not is_standalone: return HttpResponse(json.dumps(data), content_type='application/json') size = Size('crop', w=img.size[0], h=img.size[1]) md5 = form_data.get('md5') try: standalone_image = StandaloneImage.objects.get(md5=md5) except StandaloneImage.DoesNotExist: standalone_image = StandaloneImage(md5=md5, image=orig_image) standalone_image.save() cropduster_image, created = Image.objects.get_or_create( content_type=ContentType.objects.get_for_model(StandaloneImage), object_id=standalone_image.pk) if not cropduster_image.image: cropduster_image.image = orig_image cropduster_image.save() elif cropduster_image.image.name != orig_image: data['crop']['orig_image'] = data['orig_image'] = cropduster_image.image.name data['url'] = cropduster_image.get_image_url('_preview') img = PIL.Image.open(cropduster_image.image.path) preview_file_path = cropduster_image.get_image_path('_preview') if not os.path.exists(preview_file_path): process_image(img, preview_file_path, fit_preview) thumb = cropduster_image.save_size(size, standalone=True) sizes = form_data.get('sizes') or [] if len(sizes) == 1: size = sizes[0] else: size = Size('crop') data.update({ 'thumbs': [{ 'crop_x': thumb.crop_x, 'crop_y': thumb.crop_y, 'crop_w': thumb.crop_w, 'crop_h': thumb.crop_h, 'width': thumb.width, 'height': thumb.height, 'id': None, 'changed': True, 'size': json.dumps(size), 'name': thumb.name, }] }) data['crop'].update({ 'image_id': cropduster_image.pk, 'sizes': json.dumps([size]), }) return HttpResponse(json.dumps(data), content_type='application/json')