diff --git a/addons/l10n_mx/data/account_tag_data.xml b/addons/l10n_mx/data/account_tag_data.xml index 5160151c821..244c9b65ff3 100644 --- a/addons/l10n_mx/data/account_tag_data.xml +++ b/addons/l10n_mx/data/account_tag_data.xml @@ -5399,7 +5399,7 @@ 802.02 Contra cuenta CUFIN 4 accounts - D + A 803.01 CUFIN de ejercicios anteriores diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 585cb2f36b7..ff6dac34c05 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -25,6 +25,7 @@ import werkzeug.wrappers import zlib from xml.etree import ElementTree from cStringIO import StringIO +import unicodedata import odoo @@ -1067,16 +1068,23 @@ class Binary(http.Controller): var win = window.top.window; win.jQuery(win).trigger(%s, %s); """ + + filename = ufile.filename + if request.httprequest.user_agent.browser == 'safari': + # Safari sends NFD UTF-8 (where é is composed by 'e' and [accent]) + # we need to send it the same stuff, otherwise it'll fail + filename = unicodedata.normalize('NFD', ufile.filename).encode('UTF-8') + try: attachment = Model.create({ - 'name': ufile.filename, + 'name': filename, 'datas': base64.encodestring(ufile.read()), - 'datas_fname': ufile.filename, + 'datas_fname': filename, 'res_model': model, 'res_id': int(id) }) args = { - 'filename': ufile.filename, + 'filename': filename, 'mimetype': ufile.content_type, 'id': attachment.id } diff --git a/addons/web/static/src/js/views/list_view.js b/addons/web/static/src/js/views/list_view.js index e9f4068ec05..d875714afd2 100644 --- a/addons/web/static/src/js/views/list_view.js +++ b/addons/web/static/src/js/views/list_view.js @@ -1089,7 +1089,7 @@ ListView.List = Class.extend({ value = record.get(column.id); // non-resolved (string) m2m values are arrays if (value instanceof Array && !_.isEmpty(value) - && !record.get(column.id + '__display')) { + && (!record.get(column.id + '__display') && record.get(column.id + '__display') !== '')) { var ids; // they come in two shapes: if (value[0] instanceof Array) { diff --git a/addons/web_editor/static/src/js/rte.summernote.js b/addons/web_editor/static/src/js/rte.summernote.js index b8f3198dae2..2f60b1333d4 100644 --- a/addons/web_editor/static/src/js/rte.summernote.js +++ b/addons/web_editor/static/src/js/rte.summernote.js @@ -666,7 +666,15 @@ function summernote_mousedown (event) { } // restore range if range lost after clicking on non-editable area - r = range.create(); + try { + r = range.create(); + } catch (e) { + // If this code is running inside an iframe-editor and that the range + // is outside of this iframe, this will fail as the iframe does not have + // the permission to check the outside content this way. In that case, + // we simply ignore the exception as it is as if there was no range. + return; + } var editables = $(".o_editable[contenteditable], .note-editable[contenteditable]"); var r_editable = editables.has((r||{}).sc); if (!r_editable.closest('.note-editor').is($editable) && !r_editable.filter('.o_editable').is(editables)) { diff --git a/odoo/addons/base/ir/ir_ui_view.py b/odoo/addons/base/ir/ir_ui_view.py index ddae2d1fe7c..928fc642aed 100644 --- a/odoo/addons/base/ir/ir_ui_view.py +++ b/odoo/addons/base/ir/ir_ui_view.py @@ -1155,7 +1155,7 @@ actual arch. query = """SELECT max(v.id) FROM ir_ui_view v LEFT JOIN ir_model_data md ON (md.model = 'ir.ui.view' AND md.res_id = v.id) - WHERE md.module NOT IN (SELECT name FROM ir_module_module) + WHERE md.module IN (SELECT name FROM ir_module_module) IS NOT TRUE AND v.model = %s AND v.active = true GROUP BY coalesce(v.inherit_id, v.id)"""