From f9d43e83c67691f84f352b2594977a05cbf3d50c Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Wed, 23 Jul 2014 12:19:51 +0200 Subject: [PATCH] [FIX] web: correct rev 680f955 Missing backport of commit f652402 for buffered dataset Again, should not be forwardported --- addons/web/static/src/js/data.js | 28 ++++++++++++++++++++++----- addons/web/static/src/js/view_form.js | 15 ++++++-------- addons/web/static/src/js/view_list.js | 9 +++++---- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index ee24c481a3a..6ae69fbe67b 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -430,12 +430,30 @@ instance.web.DataSet = instance.web.Class.extend(instance.web.PropertiesMixin, read_ids: function (ids, fields, options) { if (_.isEmpty(ids)) return $.Deferred().resolve([]); - + options = options || {}; - // TODO: reorder results to match ids list - return this._model.call('read', - [ids, fields || false], - {context: this.get_context(options.context)}); + var method = 'read'; + var ids_arg = ids; + var context = this.get_context(options.context); + if (options.check_access_rule === true){ + method = 'search_read'; + ids_arg = [['id', 'in', ids]]; + context = new instance.web.CompoundContext(context, {active_test: false}); + } + return this._model.call(method, + [ids_arg, fields || false], + {context: context}) + .then(function (records) { + if (records.length <= 1) { return records; } + var indexes = {}; + for (var i = 0; i < ids.length; i++) { + indexes[ids[i]] = i; + } + records.sort(function (a, b) { + return indexes[a.id] - indexes[b.id]; + }); + return records; + }); }, /** * Read a slice of the records represented by this DataSet, based on its diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 790fa88caa5..e91955e0a4e 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -957,20 +957,17 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } else { var fields = _.keys(self.fields_view.fields); fields.push('display_name'); - // Use of search_read instead of read to check if we can still read the record (security rules) - return self.dataset.call('search_read', [[['id', '=', self.dataset.ids[self.dataset.index]]], fields], + return self.dataset.read_index(fields, { context: { 'bin_size': true, 'future_display_name': true - } + }, + check_access_rule: true }).then(function(r) { - if (_.isEmpty(r)){ - self.do_action('history_back'); - } - else{ - self.trigger('load_record', r[0]); - } + self.trigger('load_record', r); + }).fail(function (){ + self.do_action('history_back'); }); } }); diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 9d4c781b785..54f7946a9a3 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -529,13 +529,14 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi reload_record: function (record) { var self = this; // Use of search_read instead of read to check if we can still read the record (security rules) - return this.dataset.call('search_read', [ - [['id', '=', record.get('id')]], + return this.dataset.read_ids( + [record.get('id')], _.pluck(_(this.columns).filter(function (r) { return r.tag === 'field'; - }), 'name')] + }), 'name'), + {check_access_rule: true} ).done(function (records) { - var values = _.isEmpty(records) ? undefined : records[0]; + var values = records[0]; if (!values) { self.records.remove(record); return;