[imp] lot of concurrency improvements for form view

bzr revid: nicolas.vanhoren@openerp.com-20111012141007-87w0fgemvqv2ul15
This commit is contained in:
niv-openerp 2011-10-12 16:10:07 +02:00
parent 130e441133
commit efa2ca1195
1 changed files with 28 additions and 14 deletions

View File

@ -45,6 +45,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
_.defaults(this.options, {"always_show_new_button": true, _.defaults(this.options, {"always_show_new_button": true,
"not_interactible_on_create": false}); "not_interactible_on_create": false});
this.save_lock = $.Deferred().resolve(); this.save_lock = $.Deferred().resolve();
this.reload_lock = $.Deferred().resolve();
}, },
start: function() { start: function() {
this._super(); this._super();
@ -367,6 +368,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
do_save: function(success, prepend_on_create) { do_save: function(success, prepend_on_create) {
var self = this; var self = this;
var action = function() { var action = function() {
try {
if (!self.ready) { if (!self.ready) {
return $.Deferred().reject(); return $.Deferred().reject();
} }
@ -403,6 +405,10 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
}).then(success); }).then(success);
} }
} }
} catch (e) {
console.error(e);
return $.Deferred().reject();
}
}; };
this.save_lock = this.save_lock.pipe(action, action); this.save_lock = this.save_lock.pipe(action, action);
return this.save_lock; return this.save_lock;
@ -430,7 +436,8 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
// should not happen in the server, but may happen for internal purpose // should not happen in the server, but may happen for internal purpose
return $.Deferred().reject(); return $.Deferred().reject();
} else { } else {
return this.reload().then(success); this.reload();
return $.when().then(success);
} }
}, },
/** /**
@ -464,9 +471,8 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
this.sidebar.attachments.do_update(); this.sidebar.attachments.do_update();
} }
console.debug("The record has been created with id #" + this.datarecord.id); console.debug("The record has been created with id #" + this.datarecord.id);
return this.reload().pipe(function() { this.reload()
return _.extend(r, {created: true}); return $.when(_.extend(r, {created: true})).then(success);
}).then(success);
} }
}, },
on_action: function (action) { on_action: function (action) {
@ -476,15 +482,21 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
console.debug("Cancelling form"); console.debug("Cancelling form");
}, },
reload: function() { reload: function() {
if (this.dataset.index == null || this.dataset.index < 0) { var self = this;
return $.when(this.on_button_new()); var act = function() {
} else { if (self.dataset.index == null || self.dataset.index < 0) {
return this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded); return $.when(self.on_button_new());
} } else {
return self.dataset.read_index(_.keys(self.fields_view.fields), self.on_record_loaded);
}
};
this.reload_lock = this.reload_lock.pipe(act, act);
return this.reload_lock;
}, },
get_fields_values: function() { get_fields_values: function() {
var values = {}; var values = {};
_.each(this.fields, function(value, key) { _.each(this.fields, function(value, key) {
value.is_dirty();
var val = value.get_value(); var val = value.get_value();
values[key] = val; values[key] = val;
}); });
@ -923,7 +935,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
return self.on_confirmed(); return self.on_confirmed();
} }
}; };
if (!this.node.attrs.special && (this.view.dirty_for_user || !this.view.datarecord.id)) { if (!this.node.attrs.special) {
return this.view.recursive_save().pipe(exec_action); return this.view.recursive_save().pipe(exec_action);
} else { } else {
return exec_action(); return exec_action();
@ -2008,8 +2020,6 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
var self = this; var self = this;
if (!this.dataset) if (!this.dataset)
return []; return [];
if (!this.form_last_update.isResolved() && !this.form_last_update.isRejected())
this.save_form_view();
var val = this.dataset.delete_all ? [commands.delete_all()] : []; var val = this.dataset.delete_all ? [commands.delete_all()] : [];
val = val.concat(_.map(this.dataset.ids, function(id) { val = val.concat(_.map(this.dataset.ids, function(id) {
var alter_order = _.detect(self.dataset.to_create, function(x) {return x.id === id;}); var alter_order = _.detect(self.dataset.to_create, function(x) {return x.id === id;});
@ -2372,13 +2382,17 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save-new"); var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save-new");
$nbutton.click(function() { $nbutton.click(function() {
$.when(self.view_form.do_save()).then(function() { $.when(self.view_form.do_save()).then(function() {
self.view_form.on_button_new(); self.view_form.reload_lock.then(function() {
self.view_form.on_button_new();
});
}); });
}); });
var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save"); var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save");
$nbutton.click(function() { $nbutton.click(function() {
$.when(self.view_form.do_save()).then(function() { $.when(self.view_form.do_save()).then(function() {
self.check_exit(); self.view_form.reload_lock.then(function() {
self.check_exit();
});
}); });
}); });
var $cbutton = $buttons.find(".oe_selectcreatepopup-form-close"); var $cbutton = $buttons.find(".oe_selectcreatepopup-form-close");