def _conditional_compress_file(self, name, content, content_encoding): """ Attempts to compress the given file. If the file is larger when compressed, returns the original file. Returns a tuple of (content_encoding, content). """ if content_encoding == CONTENT_ENCODING_GZIP: # Ideally, we would do some sort of incremental compression here, # but boto doesn't support uploading a key from an iterator. with self._temporary_file() as temp_file: with closing(gzip.GzipFile(name, "wb", 9, temp_file)) as zipfile: for chunk in content.chunks(): zipfile.write(chunk) # Check if the zipped version is actually smaller! if temp_file.tell() < content.tell(): temp_file.seek(0) content = File(temp_file, name) yield content, CONTENT_ENCODING_GZIP return # Haha! Gzip made it bigger. content.seek(0) yield content, None
def detailed_spray_area_to_file(filename="detailed_sprayareas.csv"): """Write the detailed spray area report to file.""" with TemporaryFile(mode="w+", encoding="utf-8") as file_pointer: spray_areas_file = File(file_pointer) writer = csv.writer(spray_areas_file) for row in detailed_spray_area_data(): writer.writerow(row) if default_storage.exists(filename): default_storage.delete(filename) spray_areas_file.seek(0) default_storage.save(filename, spray_areas_file)
def _conditional_compress_file(self, name, content): """ Attempts to compress the given file. If the file is larger when compressed, returns the original file. Returns a tuple of (content_encoding, content). """ content_bytes = content.read() # Ideally, we would do some sort of incremental compression here, # but boto doesn't support uploading a key from an iterator. temp_file = self._temporary_file() with closing(gzip.GzipFile(name, "wb", 9, temp_file)) as zipfile: zipfile.write(content_bytes) # Check if the zipped version is actually smaller! if temp_file.tell() < len(content_bytes): temp_file.seek(0) content = File(temp_file, name) return CONTENT_ENCODING_GZIP, content else: # Haha! Gzip made it bigger. content.seek(0) return None, content
def get_resized_image_url(self, size): resized_filename = self.get_resized_image_filename(size) if not self.image.storage.exists(resized_filename): if not self.image.storage.exists(self.image.name) and settings.REMOVE_LOST_AVATAR: self.delete() return Avatar.objects.get_default_avatar().get_resized_image_url(size) thumb = Image.open(self.image) if thumb.mode != "RGB": thumb = thumb.convert("RGB") img_format = thumb.format if not settings.CAN_ENLARGE_AVATAR or ( thumb.size[0] > size or thumb.size[1] > size or not hasattr(thumb, "resize") ): thumb.thumbnail((size, size), Image.ANTIALIAS) else: thumb = thumb.resize((size, size), Image.BICUBIC) f = File(StringIO(), name=resized_filename) try: thumb.save(f, img_format, **settings.SAVE_IMG_PARAMS.get(img_format, {})) except: thumb.save(f, img_format) f.seek(0) self.image.storage.save(resized_filename, ContentFile(f.read())) return self.image.storage.url(resized_filename)
def avatarcrop(request): """ Avatar management """ avatar = get_object_or_404(Avatar, user=request.user, valid=False) if not request.method == "POST": form = AvatarCropForm() else: image = Image.open(ContentFile(avatar.image.read())) if image.mode != "RGB": image = image.convert("RGB") form = AvatarCropForm(image, request.POST) if form.is_valid(): top = int(form.cleaned_data.get("top")) left = int(form.cleaned_data.get("left")) right = int(form.cleaned_data.get("right")) bottom = int(form.cleaned_data.get("bottom")) if not (top or left or right or bottom): (width, height) = image.size if width > height: diff = (width - height) / 2 left = diff right = width - diff bottom = height else: diff = (height - width) / 2 top = diff right = width bottom = height - diff box = [left, top, right, bottom] image = image.crop(box) for a in Avatar.objects.filter(user=request.user).exclude(id=avatar.id): a.delete() f = File(StringIO(), name=avatar.image.name) # need if format is empty image.save(f, image.format) f.seek(0) if hasattr(image, "content_type"): file_ext = image.content_type.split("/")[1] # "image/gif" => "gif" else: file_ext = os.path.splitext(avatar.image.name)[1][1:] if file_ext == "pjpeg": file_ext = "jpeg" avatar.image.delete() avatar.image.save("%s.%s" % (request.user.username, file_ext), ContentFile(f.read())) avatar.valid = True avatar.save() messages.success(request, _("Your new avatar has been saved successfully."), fail_silently=True) signal_responses = signals.post_signal.send(sender=avatarcrop, request=request, form=form) return signals.last_response(signal_responses) or HttpResponseRedirect(reverse("profile_edit_avatar")) template = "userprofile/avatar/crop.html" data = { "section": "avatar", "avatar": avatar, "form": form, "DEFAULT_AVATAR_SIZE": DEFAULT_AVATAR_SIZE, "MIN_AVATAR_SIZE": MIN_AVATAR_SIZE, } signals.context_signal.send(sender=avatarcrop, request=request, context=data) return render_to_response(template, data, context_instance=RequestContext(request))
def avatarchoose(request): """ Avatar choose """ Profile.objects.get_or_create(user=request.user) images = dict() if AVATAR_QUOTA: from userprofile.uploadhandler import QuotaUploadHandler request.upload_handlers.insert(0, QuotaUploadHandler()) if request.method == "POST": form = AvatarForm() if request.POST.get("keyword"): keyword = iri_to_uri(request.POST.get("keyword")) gd_client = gdata.photos.service.PhotosService() feed = gd_client.SearchCommunityPhotos(query="%s&thumbsize=72c" % keyword.split(" ")[0], limit="48") for entry in feed.entry: images[entry.media.thumbnail[0].url] = entry.content.src else: form = AvatarForm(request.POST, request.FILES) if form.is_valid(): image = form.cleaned_data.get("url") or form.cleaned_data.get("photo") try: thumb = Image.open(ContentFile(image.read())) except: messages.error(request, _("This image can't be used as an avatar")) else: if thumb.mode != "RGB": thumb = thumb.convert("RGB") thumb.thumbnail((480, 480), Image.ANTIALIAS) f = File(StringIO(), name=image.name) try: thumb.save(f, thumb.format, **SAVE_IMG_PARAMS.get(thumb.format, {})) except: thumb.save(f, thumb.format) f.seek(0) file_ext = image.content_type.split("/")[1] # "image/gif" => "gif" if file_ext == "pjpeg": file_ext = "jpeg" try: avatar = Avatar.objects.get(user=request.user, valid=False) avatar.delete_avatar_thumbs() avatar.image.delete() except Avatar.DoesNotExist: avatar = Avatar(user=request.user, image="", valid=False) avatar.image.save("%s.%s" % (request.user.username, file_ext), ContentFile(f.read())) avatar.save() signal_responses = signals.post_signal.send(sender=avatarchoose, request=request, form=form) return signals.last_response(signal_responses) or HttpResponseRedirect( reverse("profile_avatar_crop") ) else: form = AvatarForm() if DEFAULT_AVATAR: generic = Avatar.objects.get_default_avatar().get_resized_image_url(DEFAULT_AVATAR_SIZE) else: generic = "" template = "userprofile/avatar/choose.html" data = { "generic": generic, "form": form, "images": images, "AVATAR_WEBSEARCH": AVATAR_WEBSEARCH, "section": "avatar", "DEFAULT_AVATAR_SIZE": DEFAULT_AVATAR_SIZE, "MIN_AVATAR_SIZE": MIN_AVATAR_SIZE, } signals.context_signal.send(sender=avatarchoose, request=request, context=data) return render_to_response(template, data, context_instance=RequestContext(request))
def avatarcrop(request): """ Avatar management """ avatar = get_object_or_404(Avatar, user=request.user, valid=False) if not request.method == "POST": form = AvatarCropForm() else: image = Image.open(ContentFile(avatar.image.read())) if image.mode != "RGB": image = image.convert("RGB") form = AvatarCropForm(image, request.POST) if form.is_valid(): top = int(form.cleaned_data.get('top')) left = int(form.cleaned_data.get('left')) right = int(form.cleaned_data.get('right')) bottom = int(form.cleaned_data.get('bottom')) if not (top or left or right or bottom): (width, height) = image.size if width > height: diff = (width - height) / 2 left = diff right = width - diff bottom = height else: diff = (height - width) / 2 top = diff right = width bottom = height - diff box = [left, top, right, bottom] image = image.crop(box) for a in Avatar.objects.filter(user=request.user).exclude( id=avatar.id): a.delete() f = File(StringIO(), name=avatar.image.name) # need if format is empty image.save(f, image.format) f.seek(0) if hasattr(image, 'content_type'): file_ext = image.content_type.split("/")[ 1] # "image/gif" => "gif" else: file_ext = os.path.splitext(avatar.image.name)[1][1:] if file_ext == 'pjpeg': file_ext = 'jpeg' avatar.image.delete() avatar.image.save("%s.%s" % (request.user.username, file_ext), ContentFile(f.read())) avatar.valid = True avatar.save() messages.success(request, _("Your new avatar has been saved successfully."), fail_silently=True) signal_responses = signals.post_signal.send(sender=avatarcrop, request=request, form=form) return signals.last_response( signal_responses) or HttpResponseRedirect( reverse("profile_edit_avatar")) template = "userprofile/avatar/crop.html" data = { 'section': 'avatar', 'avatar': avatar, 'form': form, 'DEFAULT_AVATAR_SIZE': DEFAULT_AVATAR_SIZE, 'MIN_AVATAR_SIZE': MIN_AVATAR_SIZE } signals.context_signal.send(sender=avatarcrop, request=request, context=data) return render_to_response(template, data, context_instance=RequestContext(request))
def avatarchoose(request): """ Avatar choose """ Profile.objects.get_or_create(user=request.user) images = dict() if AVATAR_QUOTA: from userprofile.uploadhandler import QuotaUploadHandler request.upload_handlers.insert(0, QuotaUploadHandler()) if request.method == "POST": form = AvatarForm() if request.POST.get('keyword'): keyword = iri_to_uri(request.POST.get('keyword')) gd_client = gdata.photos.service.PhotosService() feed = gd_client.SearchCommunityPhotos(query="%s&thumbsize=72c" % keyword.split(" ")[0], limit='48') for entry in feed.entry: images[entry.media.thumbnail[0].url] = entry.content.src else: form = AvatarForm(request.POST, request.FILES) if form.is_valid(): image = form.cleaned_data.get('url') or form.cleaned_data.get( 'photo') try: thumb = Image.open(ContentFile(image.read())) except: messages.error(request, _("This image can't be used as an avatar")) else: if thumb.mode != "RGB": thumb = thumb.convert("RGB") thumb.thumbnail((480, 480), Image.ANTIALIAS) f = File(StringIO(), name=image.name) try: thumb.save(f, thumb.format, **SAVE_IMG_PARAMS.get(thumb.format, {})) except: thumb.save(f, thumb.format) f.seek(0) file_ext = image.content_type.split("/")[ 1] # "image/gif" => "gif" if file_ext == 'pjpeg': file_ext = 'jpeg' try: avatar = Avatar.objects.get(user=request.user, valid=False) avatar.delete_avatar_thumbs() avatar.image.delete() except Avatar.DoesNotExist: avatar = Avatar(user=request.user, image="", valid=False) avatar.image.save( "%s.%s" % (request.user.username, file_ext), ContentFile(f.read())) avatar.save() signal_responses = signals.post_signal.send( sender=avatarchoose, request=request, form=form) return signals.last_response( signal_responses) or HttpResponseRedirect( reverse("profile_avatar_crop")) else: form = AvatarForm() if DEFAULT_AVATAR: generic = Avatar.objects.get_default_avatar().get_resized_image_url( DEFAULT_AVATAR_SIZE) else: generic = "" template = "userprofile/avatar/choose.html" data = { 'generic': generic, 'form': form, "images": images, 'AVATAR_WEBSEARCH': AVATAR_WEBSEARCH, 'section': 'avatar', 'DEFAULT_AVATAR_SIZE': DEFAULT_AVATAR_SIZE, 'MIN_AVATAR_SIZE': MIN_AVATAR_SIZE } signals.context_signal.send(sender=avatarchoose, request=request, context=data) return render_to_response(template, data, context_instance=RequestContext(request))
def make_dummy_image(name='something.jpg', width=640, height=480): stream = File(io.BytesIO(), name=name) with Image.new('RGB', (width, height)) as img: img.save(stream, format='JPEG') stream.seek(0) return stream
def make_dummy_file(name='something.txt', content=None): stream = File(io.BytesIO(), name=name) if content is not None: stream.write(content) stream.seek(0) return stream