From 8abfc76ea559ac4229916e97206e95e726d6f8b4 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Jun 2011 14:12:22 +0200 Subject: [PATCH 01/10] [imp] created first version of one2manydataset and implemented delete bzr revid: nicolas.vanhoren@openerp.com-20110621121222-3bjpeh66un137ip6 --- addons/base/static/src/js/form.js | 55 ++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 90357325928..5cfe5db1dd2 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1267,6 +1267,15 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ } }); +/* +# Values: (0, 0, { fields }) create +# (1, ID, { fields }) update +# (2, ID) remove (delete) +# (3, ID) unlink one (target id or target of relation) +# (4, ID) link +# (5) unlink all (only valid for one2many) +*/ + openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); @@ -1279,9 +1288,8 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ var self = this; - this.dataset = new openerp.base.DataSetStatic(this.session, this.field.relation); - this.dataset.on_unlink.add_last(function(ids) { - self.dataset.set_ids(_.without.apply(_, [self.dataset.ids].concat(ids))); + this.dataset = new openerp.base.form.One2ManyDataset(this.session, this.field.relation); + this.dataset.on_change.add_last(function() { self.on_ui_change(); self.reload_current_view(); }); @@ -1337,18 +1345,47 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ // TODO niv: but fme did not implemented delete in form view anyway } }, + set_value_from_ui: function() {}, set_value: function(value) { if(value != false) { - this.dataset.set_ids(value); + this.dataset.reset_ids(value); this.is_setted.resolve(); } }, - get_value: function(value) { - //TODO niv - return []; + get_value: function() { + var val = _.map(this.dataset.to_delete, function(v, k) {return [2, parseInt(k, 10)];}); + var val = val.concat(_.map(this.dataset.to_create, function(x) {return [0, 0, x];})); + return val; + }, + validate: function() { + this.invalid = false; + // TODO niv } }); +openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ + init: function() { + this._super.apply(this, arguments); + this.reset_ids([]); + }, + create: function(data, callback, error_callback) { + }, + write: function (id, data, callback) { + }, + unlink: function(ids) { + var self = this; + this.set_ids(_.without.apply(_, [this.ids].concat(ids))); + _.each(ids, function(x) {self.to_delete[x] = true;}); + this.on_change(); + }, + reset_ids: function(ids) { + this.set_ids(ids); + this.to_delete = {}; + this.to_create = {}; + }, + on_change: function() {} +}); + openerp.base.form.One2ManyListView = openerp.base.ListView.extend({ do_add_record: function () { var self = this; @@ -1505,7 +1542,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ $sbutton.click(function() { self.on_select_elements(self.selected_ids); }); - self.view_list = new openerp.base.form.Many2XPopupListView( null, self.session, + self.view_list = new openerp.base.form.SelectCreateListView( null, self.session, self.element_id + "_view_list", self.dataset, false, {'deletable': false}); self.view_list.popup = self; @@ -1563,7 +1600,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ } }); -openerp.base.form.Many2XPopupListView = openerp.base.ListView.extend({ +openerp.base.form.SelectCreateListView = openerp.base.ListView.extend({ do_add_record: function () { this.popup.new_object(); }, From 946664f635472eee7aa8e775154d5f716e568baf Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 22 Jun 2011 13:21:23 +0200 Subject: [PATCH 02/10] [imp] added first code for cached read_ids bzr revid: nicolas.vanhoren@openerp.com-20110622112123-rq2917e1i8he2hfz --- addons/base/static/src/js/form.js | 36 +++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 5cfe5db1dd2..1f4f791d9fd 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1364,6 +1364,9 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ }); openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ + virtual_id_prefix: "one2many_v_id_", + virtual_id_regex: /one2many_v_id_.*/, + debug_mode: true, init: function() { this._super.apply(this, arguments); this.reset_ids([]); @@ -1375,15 +1378,40 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ unlink: function(ids) { var self = this; this.set_ids(_.without.apply(_, [this.ids].concat(ids))); - _.each(ids, function(x) {self.to_delete[x] = true;}); + _.each(ids, function(x) {self.to_delete.push({id:x})}); this.on_change(); }, reset_ids: function(ids) { this.set_ids(ids); - this.to_delete = {}; - this.to_create = {}; + this.to_delete = []; + this.to_create = []; + this.cache = []; + }, + on_change: function() {}, + read_ids: function (ids, fields, callback) { + var self = this; + var to_get = []; + var to_remember = []; + _.each(ids, function(id) { + var cached = _.detect(self.cache, function(x) {return x.id === id;}); + if (!cached || !_each.all(fields, function(x) {cached.values[x] !== undefined})) + to_get.push(id); + else + to_remember.push(cached); + }); + // for debuggin, test to see if all the ids we try to load from db are real ids + if (this.debug_mode) + _.each(to_get, function(x) { + if(typeof(x) == "string") { + var test = self.virtual_id_regex.exec(x); + if(test && test[0] === x) { + throw "Trying to get value from virtual id"; + } + } + }); + //TODO niv + this._super(ids, fields, callback); }, - on_change: function() {} }); openerp.base.form.One2ManyListView = openerp.base.ListView.extend({ From 46abe6600a40c0088cc83928e71167b9e816032e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 22 Jun 2011 16:01:49 +0200 Subject: [PATCH 03/10] [imp] added most methods of one2many dataset (but not tested) bzr revid: nicolas.vanhoren@openerp.com-20110622140149-287ofpshcqmxq1wl --- addons/base/static/src/js/form.js | 72 +++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 6aa61b22f49..c5227074bfc 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1381,35 +1381,62 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ this.reset_ids([]); }, create: function(data, callback, error_callback) { + var cached = {id:_.uniqueId(this.virtual_id_prefix), values: data}; + this.to_create.push(cached); + this.set_ids(ids.concat([cached.id])); + this.cache.push(cached); + this.on_change(); + return $.Deferred().then(callback).resolve({result: cached.id}).promise(); }, write: function (id, data, callback) { + var record = _.select(this.to_create, function(x) {return x.id === id;}); + record = record || _.select(this.to_write, function(x) {return x.id === id;}); + if (previous) { + $.extend(previous.value, data); + } else { + record = {id: id, values: data}; + self.to_write.push(record); + } + var cached = _.select(this.cache, function(x) {return x.id === id;}); + $.extend(cached.value, record.values); + this.on_change(); + return $.Deferred().then(callback).resolve({result: true}).promise(); }, unlink: function(ids) { var self = this; + var to_create_size = this.to_create.length; + var remove = function(list, to_remove) { + return _.reject(list, function(x) { return _.include(to_remove, x.id);}); + }; + this.to_create = remove(this.to_create); + this.to_write = remove(this.to_write); + this.cache = remove(this.cache); this.set_ids(_.without.apply(_, [this.ids].concat(ids))); - _.each(ids, function(x) {self.to_delete.push({id:x})}); + if (this.to_create == to_create_size) { + _.each(ids, function(x) {self.to_delete.push({id:x})}); + } this.on_change(); }, reset_ids: function(ids) { this.set_ids(ids); this.to_delete = []; this.to_create = []; + this.to_write = []; this.cache = []; + // good idea? + this.on_change(); }, on_change: function() {}, read_ids: function (ids, fields, callback) { var self = this; var to_get = []; - var to_remember = []; _.each(ids, function(id) { var cached = _.detect(self.cache, function(x) {return x.id === id;}); if (!cached || !_each.all(fields, function(x) {cached.values[x] !== undefined})) to_get.push(id); - else - to_remember.push(cached); }); - // for debuggin, test to see if all the ids we try to load from db are real ids - if (this.debug_mode) + if (this.debug_mode) { + // test to see if all the ids we try to load from db are real ids _.each(to_get, function(x) { if(typeof(x) == "string") { var test = self.virtual_id_regex.exec(x); @@ -1418,8 +1445,37 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ } } }); - //TODO niv - this._super(ids, fields, callback); + }; + var completion = $.Deferred(); + $.when(completion).then(callback); + var return_records = function() { + var records = _.map(ids, function(id) {return _.detect(self.cache, function(c) {return c.id === id;}).values;}); + if (self.debug_mode) { + if (_.include(records, undefined)) { + throw "Record not correctly loaded"; + } + } + completion.resolve(records); + } + if(to_get) { + var rpc_promise = this._super(to_get, fields, function(records) { + _.each(records, function(record, index) { + var id = to_get[index]; + var cached = _.detect(self.cache, function(x) {return x.id === id;}); + if (!cached) { + self.cache.push({id: id, values: record}); + } else { + // I assume cache value is prioritary + self.cached = $.extend({}, record, cached); + } + }); + return_records(); + }); + $.when(rpc_promise).fail(function() {completion.reject();}); + } else { + return_records(); + } + return completion.promise(); }, }); From dbac9436f975c0124231a9bada6766a0eb2a2dbc Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 22 Jun 2011 16:53:54 +0200 Subject: [PATCH 04/10] [imp] avoid to reload the list view 2 times in many2many bzr revid: nicolas.vanhoren@openerp.com-20110622145354-ihabdaecz0rwq970 --- addons/base/static/src/js/form.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 09e9b39561d..53538faae41 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1518,8 +1518,6 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ this.dataset = new openerp.base.DataSetStatic( this.session, this.field.relation); this.dataset.on_unlink.add_last(function(ids) { - self.list_view.reload_content(); - self.on_ui_change(); }); From 36d85bed82a7321efe6d33ea22a37e997fa4f491 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 22 Jun 2011 17:08:38 +0200 Subject: [PATCH 05/10] [imp] corrected some behavior about suppressions in datasets bzr revid: nicolas.vanhoren@openerp.com-20110622150838-6ju63f7k0njkocru --- addons/base/static/src/js/form.js | 38 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 53538faae41..7787a807c01 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1305,7 +1305,6 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ this.dataset = new openerp.base.form.One2ManyDataset(this.session, this.field.relation); this.dataset.on_change.add_last(function() { self.on_ui_change(); - self.reload_current_view(); }); var modes = this.node.attrs.mode; @@ -1377,6 +1376,23 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ } }); +openerp.base.form.One2ManyListView = openerp.base.ListView.extend({ + do_add_record: function () { + var self = this; + var pop = new openerp.base.form.SelectCreatePopup(null, self.o2m.view.session); + pop.select_element(self.o2m.field.relation,{ + initial_view: "form", + alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined + }); + pop.on_select_elements.add(function(element_ids) { + var ids = self.o2m.dataset.ids; + _.each(element_ids, function(x) {if (!_.include(ids, x)) ids.push(x);}); + self.o2m.dataset.set_ids(ids); + self.o2m.reload_current_view(); + }); + } +}); + openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ virtual_id_prefix: "one2many_v_id_", virtual_id_regex: /one2many_v_id_.*/, @@ -1484,24 +1500,6 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ }, }); -openerp.base.form.One2ManyListView = openerp.base.ListView.extend({ - do_add_record: function () { - var self = this; - var pop = new openerp.base.form.SelectCreatePopup(null, self.o2m.view.session); - pop.select_element(self.o2m.field.relation,{ - initial_view: "form", - alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined - }); - pop.on_select_elements.add(function(element_ids) { - var ids = self.o2m.dataset.ids; - _.each(element_ids, function(x) {if (!_.include(ids, x)) ids.push(x);}); - self.o2m.dataset.set_ids(ids); - self.o2m.on_ui_change(); - self.o2m.reload_current_view(); - }); - } -}); - openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); @@ -1517,7 +1515,7 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ this.dataset = new openerp.base.DataSetStatic( this.session, this.field.relation); - this.dataset.on_unlink.add_last(function(ids) { + this.dataset.on_change.add_last(function(ids) { self.on_ui_change(); }); From 63d23036a353f2c52df108ec34ca36cbfd4aba8e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 12:42:22 +0200 Subject: [PATCH 06/10] [fix] lot of fixes in o2m bzr revid: nicolas.vanhoren@openerp.com-20110623104222-5lqe0o4xih4xwvxj --- addons/base/static/src/js/form.js | 78 +++++++++++++------------------ addons/base/static/src/js/list.js | 2 +- 2 files changed, 33 insertions(+), 47 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 7787a807c01..963798ffaab 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -365,12 +365,13 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV if (!this.datarecord.id) { this.on_attachments_loaded([]); } else { - this.rpc('/base/dataset/search_read', { + // TODO fme: modify this so it doesn't try to load attachments when there is not sidebar + /*this.rpc('/base/dataset/search_read', { model: 'ir.attachment', fields: ['name', 'url', 'type'], domain: [['res_model', '=', this.dataset.model], ['res_id', '=', this.datarecord.id], ['type', 'in', ['binary', 'url']]], context: this.dataset.context - }, this.on_attachments_loaded); + }, this.on_attachments_loaded);*/ } }, on_attachments_loaded: function(attachments) { @@ -1264,6 +1265,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ }, set_value_from_ui: function() {}, set_value: function(value) { + value = value || null; this._super(value); this.original_value = value; this._change_int_ext_value(value); @@ -1295,7 +1297,6 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ this._super(view, node); this.template = "FieldOne2Many"; this.is_started = $.Deferred(); - this.is_setted = $.Deferred(); }, start: function() { this._super.apply(this, arguments); @@ -1340,14 +1341,6 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ self.is_started.resolve(); }); this.viewmanager.start(); - - $.when(this.is_started, this.is_setted).then(function() { - if (modes[0] == "tree") { - var view = self.viewmanager.views[self.viewmanager.active_view].controller; - view.reload_content(); - } - // TODO niv: handle other types of views - }); }, reload_current_view: function() { var self = this; @@ -1355,15 +1348,18 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ if(self.viewmanager.active_view === "list") { view.reload_content(); } else if (self.viewmanager.active_view === "form") { - // TODO niv: but fme did not implemented delete in form view anyway + // TODO niv: implement } }, set_value_from_ui: function() {}, set_value: function(value) { - if(value != false) { - this.dataset.reset_ids(value); - this.is_setted.resolve(); - } + value = value || [] + this._super(value); + this.dataset.reset_ids(value); + var self = this; + $.when(this.is_started).then(function() { + self.reload_current_view(); + }); }, get_value: function() { var val = _.map(this.dataset.to_delete, function(v, k) {return [2, parseInt(k, 10)];}); @@ -1404,7 +1400,6 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ create: function(data, callback, error_callback) { var cached = {id:_.uniqueId(this.virtual_id_prefix), values: data}; this.to_create.push(cached); - this.set_ids(ids.concat([cached.id])); this.cache.push(cached); this.on_change(); return $.Deferred().then(callback).resolve({result: cached.id}).promise(); @@ -1412,7 +1407,7 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ write: function (id, data, callback) { var record = _.select(this.to_create, function(x) {return x.id === id;}); record = record || _.select(this.to_write, function(x) {return x.id === id;}); - if (previous) { + if (record) { $.extend(previous.value, data); } else { record = {id: id, values: data}; @@ -1444,8 +1439,6 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ this.to_create = []; this.to_write = []; this.cache = []; - // good idea? - this.on_change(); }, on_change: function() {}, read_ids: function (ids, fields, callback) { @@ -1453,22 +1446,15 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ var to_get = []; _.each(ids, function(id) { var cached = _.detect(self.cache, function(x) {return x.id === id;}); - if (!cached || !_each.all(fields, function(x) {cached.values[x] !== undefined})) - to_get.push(id); + var created = _.detect(self.to_create, function(x) {return x.id === id;}); + if (created) { + _.each(fields, function(x) {if (cached.values[x] === undefined) cached.values[x] = false;}); + } else { + if (!cached || !_.all(fields, function(x) {return cached.values[x] !== undefined})) + to_get.push(id); + } }); - if (this.debug_mode) { - // test to see if all the ids we try to load from db are real ids - _.each(to_get, function(x) { - if(typeof(x) == "string") { - var test = self.virtual_id_regex.exec(x); - if(test && test[0] === x) { - throw "Trying to get value from virtual id"; - } - } - }); - }; - var completion = $.Deferred(); - $.when(completion).then(callback); + var completion = $.Deferred().then(callback); var return_records = function() { var records = _.map(ids, function(id) {return _.detect(self.cache, function(c) {return c.id === id;}).values;}); if (self.debug_mode) { @@ -1478,7 +1464,7 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ } completion.resolve(records); } - if(to_get) { + if(to_get.length > 0) { var rpc_promise = this._super(to_get, fields, function(records) { _.each(records, function(record, index) { var id = to_get[index]; @@ -1487,7 +1473,7 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ self.cache.push({id: id, values: record}); } else { // I assume cache value is prioritary - self.cached = $.extend({}, record, cached); + _.defaults(cached.values, record); } }); return_records(); @@ -1506,7 +1492,6 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ this.template = "FieldMany2Many"; this.list_id = _.uniqueId("many2many"); this.is_started = $.Deferred(); - this.is_setted = $.Deferred(); }, start: function() { this._super.apply(this, arguments); @@ -1515,7 +1500,8 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ this.dataset = new openerp.base.DataSetStatic( this.session, this.field.relation); - this.dataset.on_change.add_last(function(ids) { + this.dataset.on_unlink.add_last(function(ids) { + //TODO niv: should check this for other cases self.on_ui_change(); }); @@ -1528,15 +1514,15 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ self.is_started.resolve(); }); this.list_view.start(); - $.when(this.is_started, this.is_setted).then(function() { - self.list_view.reload_content(); - }); }, set_value: function(value) { - if (value != false) { - this.dataset.set_ids(value); - this.is_setted.resolve(); - } + value = value || []; + this._super(value); + this.dataset.set_ids(value); + var self = this; + $.when(this.is_started).then(function() { + self.list_view.reload_content(); + }); }, get_value: function() { return [[6,false,this.dataset.ids]]; diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 38162849e08..31c16b98fc1 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -877,7 +877,7 @@ openerp.base.ListView.Groups = Class.extend( /** @lends openerp.base.ListView.Gr var d = new $.Deferred(); dataset.read_slice( - _.filter(_.pluck(this.columns, 'name'), _.identity), + _.filter(_.pluck(_.select(this.columns, function(x) {return x.tag == "field";}), 'name'), _.identity), 0, false, function (records) { var form_records = _(records).map( From 9eede2e3a42fcbea9590fdfacc48d895b76b9502 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 14:21:10 +0200 Subject: [PATCH 07/10] [fix] added setTimeout to all methods of o2m dataset to avoid lot of potential bugs in the views bzr revid: nicolas.vanhoren@openerp.com-20110623122110-4cst4fm1dzup5z69 --- addons/base/static/src/js/data.js | 2 ++ addons/base/static/src/js/form.js | 23 +++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 47e6d4fed3d..954eb8ccf43 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -357,6 +357,8 @@ openerp.base.DataSetStatic = openerp.base.DataSet.extend({ this.count = this.ids.length; }, read_slice: function (fields, offset, limit, callback) { + var self = this; + offset = offset || 0; var end_pos = limit && limit !== -1 ? offset + limit : undefined; this.read_ids(this.ids.slice(offset, end_pos), fields, callback); }, diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 963798ffaab..a2ca5b42b20 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1402,7 +1402,9 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ this.to_create.push(cached); this.cache.push(cached); this.on_change(); - return $.Deferred().then(callback).resolve({result: cached.id}).promise(); + var to_return = $.Deferred().then(callback); + setTimeout(function() {to_return.resolve({result: cached.id});}, 0); + return to_return.promise(); }, write: function (id, data, callback) { var record = _.select(this.to_create, function(x) {return x.id === id;}); @@ -1416,9 +1418,11 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ var cached = _.select(this.cache, function(x) {return x.id === id;}); $.extend(cached.value, record.values); this.on_change(); - return $.Deferred().then(callback).resolve({result: true}).promise(); + var to_return = $.Deferred().then(callback); + setTimeout(function () {to_return.resolve({result: true});}, 0); + return to_return.promise(); }, - unlink: function(ids) { + unlink: function(ids, callback, error_callback) { var self = this; var to_create_size = this.to_create.length; var remove = function(list, to_remove) { @@ -1432,6 +1436,9 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ _.each(ids, function(x) {self.to_delete.push({id:x})}); } this.on_change(); + var to_return = $.Deferred().then(callback); + setTimeout(function () {to_return.resolve({result: true});}, 0); + return to_return.promise(); }, reset_ids: function(ids) { this.set_ids(ids); @@ -1457,12 +1464,20 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ var completion = $.Deferred().then(callback); var return_records = function() { var records = _.map(ids, function(id) {return _.detect(self.cache, function(c) {return c.id === id;}).values;}); + // avoid giving fields that were not asked for (+ create a copy of the cache) + records = _.map(records, function(record) { + var tmp = {}; + _.each(fields, function(field) { + tmp[field] = record[field]; + }); + return tmp; + }); if (self.debug_mode) { if (_.include(records, undefined)) { throw "Record not correctly loaded"; } } - completion.resolve(records); + setTimeout(function () {completion.resolve(records);}, 0); } if(to_get.length > 0) { var rpc_promise = this._super(to_get, fields, function(records) { From abf83d268559516d8c6de24567731390f496a327 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 14:40:16 +0200 Subject: [PATCH 08/10] [imp] made m2o compatible with set_value(int) bzr revid: nicolas.vanhoren@openerp.com-20110623124016-5vhg59oodplvj5ig --- addons/base/static/src/js/form.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index a2ca5b42b20..62ffb997783 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1266,9 +1266,21 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ set_value_from_ui: function() {}, set_value: function(value) { value = value || null; - this._super(value); - this.original_value = value; - this._change_int_ext_value(value); + var self = this; + var _super = this._super; + var real_set_value = function(rval) { + _super.apply(self, rval); + self.original_value = rval; + self._change_int_ext_value(rval); + }; + if(typeof(value) === "number") { + var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []); + dataset.call("name_get", value, function(data) { + real_set_value(data.result[0]); + }); + } else { + setTimeout(function() {real_set_value(value);}, 0); + } }, get_value: function() { if (this.value === undefined) From 7fc77495e047a5cd0588d6c92c01fc2ed9f041f0 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 14:57:25 +0200 Subject: [PATCH 09/10] [fix] problem in get_value of m2o bzr revid: nicolas.vanhoren@openerp.com-20110623125725-lzt263x8c7t0obmk --- addons/base/static/src/js/form.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 62ffb997783..9a9f9738a6a 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1080,6 +1080,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ this.value = null; this.cm_id = _.uniqueId('m2o_cm_'); this.last_search = []; + this.tmp_value = undefined; }, start: function() { this._super(); @@ -1268,14 +1269,16 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ value = value || null; var self = this; var _super = this._super; + this.tmp_value = value; var real_set_value = function(rval) { + this.tmp_value = undefined; _super.apply(self, rval); self.original_value = rval; self._change_int_ext_value(rval); }; if(typeof(value) === "number") { var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []); - dataset.call("name_get", value, function(data) { + dataset.call("name_get", [value], function(data) { real_set_value(data.result[0]); }); } else { @@ -1283,6 +1286,12 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ } }, get_value: function() { + if (this.tmp_value !== undefined) { + if (this.tmp_value instanceof Array) { + return this.tmp_value[0]; + } + return this.tmp_value; + } if (this.value === undefined) throw "theorically unreachable state"; return this.value ? this.value[0] : false; From 986eaa7c9ca66608e364a1ea5a1f20fcdce693da Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 15:51:24 +0200 Subject: [PATCH 10/10] [fix] problem with ids not added to read_ids in o2m dataset bzr revid: nicolas.vanhoren@openerp.com-20110623135124-8yvk56l18j9f6mwk --- addons/base/static/src/js/form.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 9a9f9738a6a..4bb2e0ca636 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1280,7 +1280,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, []); dataset.call("name_get", [value], function(data) { real_set_value(data.result[0]); - }); + }).fail(function() {self.tmp_value = undefined;}); } else { setTimeout(function() {real_set_value(value);}, 0); } @@ -1486,9 +1486,10 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ var return_records = function() { var records = _.map(ids, function(id) {return _.detect(self.cache, function(c) {return c.id === id;}).values;}); // avoid giving fields that were not asked for (+ create a copy of the cache) + var fields_plus_id = fields.concat(["id"]); records = _.map(records, function(record) { var tmp = {}; - _.each(fields, function(field) { + _.each(fields_plus_id, function(field) { tmp[field] = record[field]; }); return tmp;