Merge pull request #1354 from anandpdoshi/image-extn-detection

[fix] detect image extension from content headers if extension isn't of image type
This commit is contained in:
Nabin Hait 2015-10-26 14:50:06 +05:30
commit e287fa1bd6
2 changed files with 30 additions and 6 deletions

View file

@ -16,6 +16,12 @@ from frappe.utils.nestedset import NestedSet
from frappe.utils import strip
import json
import urllib
from PIL import Image, ImageOps
import os
import requests
import requests.exceptions
import StringIO
import mimetypes, imghdr
class FolderNotEmpty(frappe.ValidationError): pass
@ -119,9 +125,6 @@ class File(NestedSet):
self.delete_file()
def make_thumbnail(self):
from PIL import Image, ImageOps
import os
if self.file_url:
if self.file_url.startswith("/files"):
try:
@ -132,12 +135,24 @@ class File(NestedSet):
else:
# downlaod
import requests, StringIO
file_url = frappe.utils.get_url(self.file_url)
r = requests.get(file_url, stream=True)
r.raise_for_status()
try:
r.raise_for_status()
except requests.exceptions.HTTPError, e:
if "404" in e.args[0]:
frappe.msgprint(_("File '{0}' not found").format(self.file_url))
raise
image = Image.open(StringIO.StringIO(r.content))
filename, extn = self.file_url.rsplit("/", 1)[1].rsplit(".", 1)
mimetype = mimetypes.guess_type(filename + "." + extn)[0]
if mimetype is None or not mimetype.startswith("image/"):
# detect file extension by reading image header properties
extn = imghdr.what(filename + "." + extn, h=r.content)
filename = "/files/" + strip(urllib.unquote(filename))
thumbnail = ImageOps.fit(
@ -192,6 +207,7 @@ class File(NestedSet):
delete_file_data_content(self, only_thumbnail=True)
def on_rollback(self):
self.flags.on_rollback = True
self.on_trash()
def on_doctype_update():

View file

@ -201,7 +201,15 @@ class NestedSet(Document):
frappe.throw(_("Cannot delete {0} as it has child nodes").format(self.name), NestedSetChildExistsError)
self.set(self.nsm_parent_field, "")
update_nsm(self)
try:
update_nsm(self)
except frappe.DoesNotExistError:
if self.flags.on_rollback:
pass
frappe.message_log.pop()
else:
raise
def before_rename(self, olddn, newdn, merge=False, group_fname="is_group"):
if merge: