From cbf9300f23948c6043fcd76d6ada3a56e3b16d4a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 22 Jun 2011 16:57:57 +0200 Subject: [PATCH 01/12] [IMP] Improved CrashManager bzr revid: fme@openerp.com-20110622145757-52ffxs6cj8m0jpnb --- addons/base/static/src/css/base.css | 9 ++------- addons/base/static/src/js/chrome.js | 12 +++++++++--- addons/base/static/src/xml/base.xml | 17 +++++++++++++---- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 9749dc97110..a921f320b3d 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -1060,13 +1060,8 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ color: grey; } -.openerp .oe-dialog-warning { +.openerp .oe-dialog-warning p { + padding-left: 1em; font-size: 1.2em; font-weight: bold; } -.openerp .oe-dialog-warning img { - float: left; - position: relative; - top: -0.5em; - margin:0 7px 7px 0; -} diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 2bea20fe972..b019d7f1867 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -399,7 +399,6 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b on_rpc_response: function() { }, on_rpc_error: function(error) { - this.on_log(error.message, error.data.debug); }, /** * The session is validated either by login or by restoration of a previous session @@ -830,8 +829,15 @@ openerp.base.CrashManager = openerp.base.Dialog.extend({ }, on_rpc_error: function(error) { this.error = error; - if (error.code === 200) { - this.dialog_title = "OpenERP Warning"; + if (error.data.fault_code) { + var split = error.data.fault_code.split('\n')[0].split(' -- '); + if (split.length > 1) { + error.type = split.shift(); + error.data.fault_code = error.data.fault_code.substr(error.type.length + 4); + } + } + if (error.code === 200 && error.type) { + this.dialog_title = "OpenERP " + _.capitalize(error.type); this.template = 'DialogWarning'; this.open({ width: 'auto', diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index b03bb044ba4..d059ae84864 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -871,10 +871,19 @@ -

- - -

+ + + + + +
+

+ + d.html_error = context.engine.tools.html_escape(d.error.data.fault_code).replace(/\n/g, '
'); +
+ +

+
From 6e40e0aaa1d14b0352d33cf822e64f64081a0a94 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 22 Jun 2011 17:59:43 +0200 Subject: [PATCH 02/12] [FIX] Form view does not send back untouched fields with default value when saving record bzr revid: fme@openerp.com-20110622155943-ex7p9a97fkhdaxio --- addons/base/static/src/js/form.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 4aa52266e5b..0d1e6afb82d 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -102,7 +102,11 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV this.touched = true; this.show_invalid = false; for (var f in record) { - this.on_form_changed(this.fields[f]); + var field = this.fields[f]; + if (field) { + field.touched = true; + this.on_form_changed(field); + } } } this.on_form_changed(); From 93e3a1f3661d084b500cc08fec0c8d7b0ad25086 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 23 Jun 2011 16:36:51 +0200 Subject: [PATCH 03/12] [FIX] netsvc: revert introduction of cgitb (was done at revno 3452, revision-id vmt@openerp.com-20110609073416-ml22a1vhtizl3z71) lp bug: https://launchpad.net/bugs/797690 fixed bzr revid: vmt@openerp.com-20110623143651-v1x7obfnj48khsdj --- openerp/netsvc.py | 3 +-- setup.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 42ccab414c7..aca1b9c12a9 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -24,7 +24,6 @@ # ############################################################################## -import cgitb import errno import heapq import logging @@ -440,7 +439,7 @@ class OpenERPDispatcher: except Exception, e: self.log('exception', tools.exception_to_unicode(e)) tb = getattr(e, 'traceback', sys.exc_info()) - tb_s = cgitb.text(tb) + tb_s = "".join(traceback.format_exception(*tb)) if tools.config['debug_mode'] and isinstance(tb, types.TracebackType): import pdb pdb.post_mortem(tb[2]) diff --git a/setup.py b/setup.py index 62fb0c9a532..930b266e66b 100755 --- a/setup.py +++ b/setup.py @@ -89,7 +89,7 @@ if os.name == 'nt': "pydot", "asyncore","asynchat", "reportlab", "vobject", "HTMLParser", "select", "mako", "poplib", "imaplib", "smtplib", "email", "yaml", "DAV", - "uuid", "commands", "openerp", # TODO is it necessary to include cgitb? + "uuid", "commands", "openerp", ], "excludes" : ["Tkconstants","Tkinter","tcl"], } From b91fca6709461462f517c480da46ae5b420a44d5 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 23 Jun 2011 17:52:18 +0200 Subject: [PATCH 04/12] [FIX] Dataset's index default value should be null bzr revid: fme@openerp.com-20110623155218-205t5nb0etjdgfc4 --- addons/base/static/src/js/data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 954eb8ccf43..86caa8466c6 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -235,7 +235,7 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. this._super(session); this.model = model; this.context = context || {}; - this.index = 0; + this.index = null; this.count = 0; }, start: function() { From 9e9339688c716458f660b7a693e4b32db517ea7c Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 23 Jun 2011 17:55:09 +0200 Subject: [PATCH 05/12] [IMP] Improved form bzr revid: fme@openerp.com-20110623155509-00vf7x2bwu1bqpx9 --- addons/base/static/src/js/form.js | 87 ++++++++++++++++------------- addons/base/static/src/xml/base.xml | 10 +++- 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 0e76fcf22bd..b4578e3c762 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -36,6 +36,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV this.default_focus_button = null; this.registry = openerp.base.form.widgets; this.has_been_loaded = $.Deferred(); + this.$form_header = null; }, start: function() { //this.log('Starting FormView '+this.model+this.view_id) @@ -59,76 +60,80 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV _.each(this.widgets, function(w) { w.start(); }); - this.$element.find('div.oe_form_pager button[data-pager-action]').click(function() { + this.$form_header = this.$element.find('#' + this.element_id + '_header'); + this.$form_header.find('div.oe_form_pager button[data-pager-action]').click(function() { var action = $(this).data('pager-action'); self.on_pager_action(action); }); - this.$element.find('#' + this.element_id + '_header button.oe_form_button_save').click(this.do_save); - this.$element.find('#' + this.element_id + '_header button.oe_form_button_save_edit').click(this.do_save_edit); - this.$element.find('#' + this.element_id + '_header button.oe_form_button_cancel').click(this.do_cancel); - this.$element.find('#' + this.element_id + '_header button.oe_form_button_new').click(this.on_button_new); + this.$form_header.find('button.oe_form_button_save').click(this.do_save); + this.$form_header.find('button.oe_form_button_save_edit').click(this.do_save_edit); + this.$form_header.find('button.oe_form_button_cancel').click(this.do_cancel); + this.$form_header.find('button.oe_form_button_new').click(this.on_button_new); this.view_manager.sidebar.set_toolbar(data.fields_view.toolbar); this.has_been_loaded.resolve(); }, do_show: function () { var self = this; - self.$element.show(); - if (this.dataset.index === null || (this.dataset.index === 0 && this.dataset.ids.length == 0)) { + if (this.dataset.index === null) { // null index means we should start a new record - // 0 index with empty ids means we called the form with empty dataset (wizards, switched to form from empty list, ...) this.on_button_new(); } else { this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded); } + self.$element.show(); this.view_manager.sidebar.do_refresh(true); }, do_hide: function () { this.$element.hide(); }, on_record_loaded: function(record) { + if (!record) { + throw("Form: No record received"); + } + if (!record.id) { + this.$form_header.find('.oe_form_on_create').show(); + this.$form_header.find('.oe_form_on_update').hide(); + this.$form_header.find('button.oe_form_button_new').hide(); + } else { + this.$form_header.find('.oe_form_on_create').hide(); + this.$form_header.find('.oe_form_on_update').show(); + this.$form_header.find('button.oe_form_button_new').show(); + } this.touched = false; - if (record) { - this.datarecord = record; - for (var f in this.fields) { + this.datarecord = record; + for (var f in this.fields) { + var field = this.fields[f]; + field.touched = false; + field.set_value(this.datarecord[f] || false); + field.validate(); + } + if (!record.id) { + // New record: Second pass in order to trigger the onchanges + this.touched = true; + this.show_invalid = false; + for (var f in record) { var field = this.fields[f]; - field.touched = false; - field.set_value(this.datarecord[f] || false); - field.validate(); - } - if (!record.id) { - // New record: Second pass in order to trigger the onchanges - this.touched = true; - this.show_invalid = false; - for (var f in record) { - var field = this.fields[f]; - if (field) { - field.touched = true; - this.on_form_changed(field); - } + if (field) { + field.touched = true; + this.do_onchange(field); } } - this.on_form_changed(); - this.show_invalid = this.ready = true; - } else { - this.log("No record received"); } + this.on_form_changed(); + this.show_invalid = this.ready = true; this.do_update_pager(record.id == null); this.do_update_sidebar(); if (this.default_focus_field) { this.default_focus_field.focus(); } }, - on_form_changed: function(widget) { - if (widget && widget.node.attrs.on_change) { - this.do_onchange(widget); - } else { - for (var w in this.widgets) { - w = this.widgets[w]; - w.process_attrs(); - w.update_dom(); - } + on_form_changed: function() { + for (var w in this.widgets) { + w = this.widgets[w]; + w.process_attrs(); + w.update_dom(); } }, on_pager_action: function(action) { @@ -161,6 +166,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV this.ready = false; var onchange = _.trim(widget.node.attrs.on_change); var call = onchange.match(/^\s?(.*?)\((.*?)\)\s?$/); + console.log("Onchange triggered for field '%s' -> %s", widget.name, onchange); if (call) { var method = call[1], args = []; var argument_replacement = { @@ -199,12 +205,14 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV on_processed_onchange: function(response, processed) { var result = response.result; if (result.value) { + console.log(" |-> Onchange Response :", result.value); for (var f in result.value) { var field = this.fields[f]; if (field) { var value = result.value[f]; processed.push(field.name); if (field.get_value() != value) { + console.log(" |-> Onchange Action : change '%s' value from '%s' to '%s'", field.name, field.get_value(), value); field.set_value(value); if (_.indexOf(processed, field.name) < 0) { this.do_onchange(field, processed); @@ -728,7 +736,8 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ this.validate(); if (!this.invalid) { this.set_value_from_ui(); - this.view.on_form_changed(this); + this.view.do_onchange(this); + this.view.on_form_changed(); } else { this.update_dom(); } diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index d059ae84864..de95a4294e8 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -360,8 +360,14 @@

- - + +
From 441197c1b3db0f0297f2686ff6691118c69aba86 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 17:58:07 +0200 Subject: [PATCH 06/12] [fix] bugs during write and unlink bzr revid: nicolas.vanhoren@openerp.com-20110623155807-xob4uhcgm3qxeao2 --- addons/base/static/src/js/form.js | 40 +++++++++++++------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index b4578e3c762..576902b952d 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1441,16 +1441,17 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ return to_return.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;}); + var self = this; + var record = _.detect(this.to_create, function(x) {return x.id === id;}); + record = record || _.detect(this.to_write, function(x) {return x.id === id;}); if (record) { - $.extend(previous.value, data); + $.extend(record.values, 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); + var cached = _.detect(this.cache, function(x) {return x.id === id;}); + $.extend(cached.values, record.values); this.on_change(); var to_return = $.Deferred().then(callback); setTimeout(function () {to_return.resolve({result: true});}, 0); @@ -1458,17 +1459,15 @@ openerp.base.form.One2ManyDataset = openerp.base.DataSetStatic.extend({ }, unlink: function(ids, callback, error_callback) { 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); + _.each(ids, function(id) { + if (! _.detect(self.to_create, function(x) { return x.id === id; })) { + self.to_delete.push({id: id}) + } + }); + this.to_create = _.reject(this.to_create, function(x) { return _.include(ids, x.id);}); + this.to_write = _.reject(this.to_write, function(x) { return _.include(ids, x.id);}); + this.cache = _.reject(this.cache, function(x) { return _.include(ids, x.id);}); this.set_ids(_.without.apply(_, [this.ids].concat(ids))); - if (this.to_create == to_create_size) { - _.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); @@ -1497,15 +1496,8 @@ 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) - var fields_plus_id = fields.concat(["id"]); - records = _.map(records, function(record) { - var tmp = {}; - _.each(fields_plus_id, function(field) { - tmp[field] = record[field]; - }); - return tmp; + var records = _.map(ids, function(id) { + return _.extend({}, _.detect(self.cache, function(c) {return c.id === id;}).values, {"id": id}); }); if (self.debug_mode) { if (_.include(records, undefined)) { From 7f8b7e7bc1645dcd19f2179919d0ddf129d2b708 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 17:59:46 +0200 Subject: [PATCH 07/12] [imp] removed useless method in main.py bzr revid: nicolas.vanhoren@openerp.com-20110623155946-mj3lca6u617exxsn --- addons/base/controllers/main.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 3f519f30962..bc6bc141863 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -383,11 +383,6 @@ class DataSet(openerpweb.Controller): reads = Model.read(ids, fields or False, context) reads.sort(key=lambda obj: ids.index(obj['id'])) return reads - - @openerpweb.jsonrequest - def read(self, request, model, ids, fields=False): - return self.do_search_read(request, model, ids, fields, - request.session.eval_context(request.context)) @openerpweb.jsonrequest def get(self, request, model, ids, fields=False): From 93cd2ec1aa8bb6ba2019dccc4d8ec4b2e0d9db6b Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 23 Jun 2011 19:20:50 +0200 Subject: [PATCH 08/12] [FIX] Date widgets does not correctly validate bzr revid: fme@openerp.com-20110623172050-deldzkj98hcuhjjs --- addons/base/static/src/js/form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 576902b952d..69cea6e5be4 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -876,7 +876,7 @@ openerp.base.form.FieldDatetime = openerp.base.form.Field.extend({ } }, validate: function() { - this.invalid = this.required && this.$element.find('input')[this.jqueryui_object]('getDate') === ''; + this.invalid = this.required && !this.$element.find('input')[this.jqueryui_object]('getDate'); }, focus: function() { this.$element.find('input').focus(); From fe6536132f484e4c683a6466a30b99a0f2842c08 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 18:57:17 +0200 Subject: [PATCH 10/12] [imp] refactored one2many dataset & created read only search dataset & used it in the select create popup bzr revid: nicolas.vanhoren@openerp.com-20110623165717-di9r0i463tm4wm7a --- addons/base/static/src/js/data.js | 129 +++++++++++++++++++++++++++++ addons/base/static/src/js/form.js | 131 ++++-------------------------- 2 files changed, 145 insertions(+), 115 deletions(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 86caa8466c6..b3ddd7750c8 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -458,6 +458,135 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ } }); +openerp.base.BufferedDataSet = 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([]); + }, + create: function(data, callback, error_callback) { + var cached = {id:_.uniqueId(this.virtual_id_prefix), values: data}; + this.to_create.push(cached); + this.cache.push(cached); + this.on_change(); + 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 self = this; + var record = _.detect(this.to_create, function(x) {return x.id === id;}); + record = record || _.detect(this.to_write, function(x) {return x.id === id;}); + if (record) { + $.extend(record.values, data); + } else { + record = {id: id, values: data}; + self.to_write.push(record); + } + var cached = _.detect(this.cache, function(x) {return x.id === id;}); + $.extend(cached.values, record.values); + this.on_change(); + var to_return = $.Deferred().then(callback); + setTimeout(function () {to_return.resolve({result: true});}, 0); + return to_return.promise(); + }, + unlink: function(ids, callback, error_callback) { + var self = this; + _.each(ids, function(id) { + if (! _.detect(self.to_create, function(x) { return x.id === id; })) { + self.to_delete.push({id: id}) + } + }); + this.to_create = _.reject(this.to_create, function(x) { return _.include(ids, x.id);}); + this.to_write = _.reject(this.to_write, function(x) { return _.include(ids, x.id);}); + this.cache = _.reject(this.cache, function(x) { return _.include(ids, x.id);}); + this.set_ids(_.without.apply(_, [this.ids].concat(ids))); + 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); + this.to_delete = []; + this.to_create = []; + this.to_write = []; + this.cache = []; + }, + on_change: function() {}, + read_ids: function (ids, fields, callback) { + var self = this; + var to_get = []; + _.each(ids, function(id) { + var cached = _.detect(self.cache, function(x) {return x.id === 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); + } + }); + var completion = $.Deferred().then(callback); + var return_records = function() { + var records = _.map(ids, function(id) { + return _.extend({}, _.detect(self.cache, function(c) {return c.id === id;}).values, {"id": id}); + }); + if (self.debug_mode) { + if (_.include(records, undefined)) { + throw "Record not correctly loaded"; + } + } + setTimeout(function () {completion.resolve(records);}, 0); + } + 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]; + 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 + _.defaults(cached.values, record); + } + }); + return_records(); + }); + $.when(rpc_promise).fail(function() {completion.reject();}); + } else { + return_records(); + } + return completion.promise(); + }, +}); + +openerp.base.ReadOnlyDataSetSearch = openerp.base.DataSetSearch.extend({ + create: function(data, callback, error_callback) { + this.on_create(data); + var to_return = $.Deferred().then(callback); + setTimeout(function () {to_return.resolve({"result": undefined});}, 0); + return to_return.promise(); + }, + on_create: function(data) {}, + write: function (id, data, callback) { + this.on_write(id); + var to_return = $.Deferred().then(callback); + setTimeout(function () {to_return.resolve({"result": true});}, 0); + return to_return.promise(); + }, + on_write: function(id) {}, + unlink: function(ids, callback, error_callback) { + this.on_unlink(ids); + var to_return = $.Deferred().then(callback); + setTimeout(function () {to_return.resolve({"result": true});}, 0); + return to_return.promise(); + }, + on_unlink: function(ids) {} +}); + openerp.base.CompoundContext = function() { this.__ref = "compound_context"; this.__contexts = []; diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 69cea6e5be4..71ce2f5cbb4 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1337,7 +1337,7 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ var self = this; - this.dataset = new openerp.base.form.One2ManyDataset(this.session, this.field.relation); + this.dataset = new openerp.base.BufferedDataSet(this.session, this.field.relation); this.dataset.on_change.add_last(function() { self.on_ui_change(); }); @@ -1423,111 +1423,6 @@ openerp.base.form.One2ManyListView = openerp.base.ListView.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([]); - }, - create: function(data, callback, error_callback) { - var cached = {id:_.uniqueId(this.virtual_id_prefix), values: data}; - this.to_create.push(cached); - this.cache.push(cached); - this.on_change(); - 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 self = this; - var record = _.detect(this.to_create, function(x) {return x.id === id;}); - record = record || _.detect(this.to_write, function(x) {return x.id === id;}); - if (record) { - $.extend(record.values, data); - } else { - record = {id: id, values: data}; - self.to_write.push(record); - } - var cached = _.detect(this.cache, function(x) {return x.id === id;}); - $.extend(cached.values, record.values); - this.on_change(); - var to_return = $.Deferred().then(callback); - setTimeout(function () {to_return.resolve({result: true});}, 0); - return to_return.promise(); - }, - unlink: function(ids, callback, error_callback) { - var self = this; - _.each(ids, function(id) { - if (! _.detect(self.to_create, function(x) { return x.id === id; })) { - self.to_delete.push({id: id}) - } - }); - this.to_create = _.reject(this.to_create, function(x) { return _.include(ids, x.id);}); - this.to_write = _.reject(this.to_write, function(x) { return _.include(ids, x.id);}); - this.cache = _.reject(this.cache, function(x) { return _.include(ids, x.id);}); - this.set_ids(_.without.apply(_, [this.ids].concat(ids))); - 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); - this.to_delete = []; - this.to_create = []; - this.to_write = []; - this.cache = []; - }, - on_change: function() {}, - read_ids: function (ids, fields, callback) { - var self = this; - var to_get = []; - _.each(ids, function(id) { - var cached = _.detect(self.cache, function(x) {return x.id === 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); - } - }); - var completion = $.Deferred().then(callback); - var return_records = function() { - var records = _.map(ids, function(id) { - return _.extend({}, _.detect(self.cache, function(c) {return c.id === id;}).values, {"id": id}); - }); - if (self.debug_mode) { - if (_.include(records, undefined)) { - throw "Record not correctly loaded"; - } - } - setTimeout(function () {completion.resolve(records);}, 0); - } - 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]; - 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 - _.defaults(cached.values, record); - } - }); - return_records(); - }); - $.when(rpc_promise).fail(function() {completion.reject();}); - } else { - return_records(); - } - return completion.promise(); - }, -}); - openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); @@ -1609,12 +1504,13 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ * - initial_view: form or search (default search) * - disable_multiple_selection * - alternative_form_view + * - auto_create (default true) */ select_element: function(model, options, domain, context) { this.model = model; this.domain = domain || []; this.context = context || {}; - this.options = options || {}; + this.options = _.defaults(options || {}, {"initial_view": "search", "auto_create": true}); this.initial_ids = this.options.initial_ids; jQuery(this.render()).dialog({title: '', modal: true, @@ -1623,9 +1519,9 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ }, start: function() { this._super(); - this.dataset = new openerp.base.DataSetSearch(this.session, this.model, + this.dataset = new openerp.base.ReadOnlyDataSetSearch(this.session, this.model, this.context, this.domain); - if ((this.options.initial_view || "search") == "search") { + if (this.options.initial_view == "search") { this.setup_search_view(); } else { // "form" this.new_object(); @@ -1675,6 +1571,16 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ }); this.searchview.start(); }, + on_create: function(data) { + debugger; + if (!this.options.auto_create) + return; + var self = this; + var wdataset = new openerp.base.DataSetSearch(this.session, this.model, this.context, this.domain); + wdataset.create(data, function(r) { + self.on_select_elements([r.result]); + }); + }, on_select_elements: function(element_ids) { }, on_click_element: function(ids) { @@ -1712,12 +1618,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ self.stop(); }); }); - this.view_form.on_created.add_last(function(r, success) { - if (r.result) { - var id = arguments[0].result; - self.on_select_elements([id]); - } - }); + this.dataset.on_create.add(this.on_create); this.view_form.do_show(); } }); From 6de6267db7002a91249032205cf8a0057bcfc87e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 19:07:34 +0200 Subject: [PATCH 11/12] [imp] put correct behavior in creation popup bzr revid: nicolas.vanhoren@openerp.com-20110623170734-o7fab8axwupy6dwg --- addons/base/static/src/js/form.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 71ce2f5cbb4..cd022398355 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1412,13 +1412,15 @@ openerp.base.form.One2ManyListView = openerp.base.ListView.extend({ 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 + alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined, + auto_create: false }); - 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(); + pop.on_create.add(function(data) { + self.o2m.dataset.create(data, function(r) { + self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result])); + pop.stop(); + self.o2m.reload_current_view(); + }); }); } }); @@ -1572,7 +1574,6 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ this.searchview.start(); }, on_create: function(data) { - debugger; if (!this.options.auto_create) return; var self = this; From df6d64249d2ea8580d4e2a79f3ad4ee452302b0a Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 23 Jun 2011 19:27:37 +0200 Subject: [PATCH 12/12] [imp] added save to o2m bzr revid: nicolas.vanhoren@openerp.com-20110623172737-koryk7a8ecoobtt7 --- addons/base/static/src/js/form.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index cd022398355..aa69c539c00 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1396,8 +1396,10 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ }); }, 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];})); + var val = _.map(this.dataset.to_delete, function(v, k) {return [2, x.id];}); + val = val.concat(_.map(this.dataset.to_create, function(x) {return [0, 0, x.values];})); + val = val.concat(_.map(this.dataset.to_write, function(x) {return [1, x.id, x.values];})); + debugger; return val; }, validate: function() {