diff options
Diffstat (limited to 'addons/base_import/models.py')
| -rw-r--r-- | addons/base_import/models.py | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/addons/base_import/models.py b/addons/base_import/models.py index 7cbd0d79e09..22b48967e65 100644 --- a/addons/base_import/models.py +++ b/addons/base_import/models.py @@ -6,6 +6,8 @@ import logging import operator import os +from openerp.tools.mimetypes import guess_mimetype + try: from cStringIO import StringIO except ImportError: @@ -158,16 +160,36 @@ class ir_import(orm.TransientModel): return fields def _read_file(self, file_type, record, options): + # guess mimetype from file content + mimetype = guess_mimetype(record.file) + (file_extension, handler, req) = FILE_TYPE_DICT.get(mimetype, (None, None, None)) + if handler: + try: + return getattr(self, '_read_' + file_extension)(record, options) + except Exception: + _logger.warn("Failed to read file '%s' (transient id %d) using guessed mimetype %s", + record.file_name or '<unknown>', record.id, mimetype) + + # try reading with user-provided mimetype (file_extension, handler, req) = FILE_TYPE_DICT.get(file_type, (None, None, None)) if handler: - return getattr(self, '_read_' + file_extension)(record, options) + try: + return getattr(self, '_read_' + file_extension)(record, options) + except Exception: + _logger.warn("Failed to read file '%s' (transient id %d) using user-provided mimetype %s", + record.file_name or '<unknown>', record.id, file_type) + # fallback on file extensions as mime types can be unreliable (e.g. # software setting incorrect mime types, or non-installed software # leading to browser not sending mime types) if record.file_name: p, ext = os.path.splitext(record.file_name) - if ext and EXTENSIONS.get(ext): - return getattr(self, '_read_' + ext[1:])(record, options) + if ext in EXTENSIONS: + try: + return getattr(self, '_read_' + ext[1:])(record, options) + except Exception: + _logger.warn("Failed to read file '%s' (transient id %s) using file extension", + record.file_name, record.id) if req: raise ImportError(_("Unable to load \"{extension}\" file: requires Python module \"{modname}\"").format(extension=file_extension, modname=req)) |
