diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 8a103ecc7e0..d83636de0f9 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -81,7 +81,8 @@ This module provides the core of the OpenERP Web Client. "static/test/search.js", "static/test/Widget.js", "static/test/list.js", - "static/test/list-editable.js" + "static/test/list-editable.js", + "static/test/mutex.js" ], 'bootstrap': True, 'twitter': False, diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index bc35364309a..6cedfa03d8c 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -622,6 +622,8 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM return self._process_save(save_obj).then(function() { save_obj.ret = _.toArray(arguments); return iterate(); + }, function() { + save_obj.error = true; }); } return $.when(); @@ -805,6 +807,8 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM var save_obj = {prepend_on_create: prepend_on_create, ret: null}; this.save_list.push(save_obj); return this._process_operations().then(function() { + if (save_obj.error) + return $.Deferred().reject(); return $.when.apply($, save_obj.ret); }); }, diff --git a/addons/web/static/test/mutex.js b/addons/web/static/test/mutex.js new file mode 100644 index 00000000000..e88911b5b45 --- /dev/null +++ b/addons/web/static/test/mutex.js @@ -0,0 +1,60 @@ +openerp.testing.section('mutex', { + dependencies: ['web.coresetup'], + setup: function (instance) { + } +}, function (test) { + test('simpleScheduling', function (instance) { + var m = new $.Mutex(); + var def1 = $.Deferred(); + var def2 = $.Deferred(); + var p1 = m.exec(function() { return def1; }); + var p2 = m.exec(function() { return def2; }); + equal(p1.state(), "pending"); + equal(p2.state(), "pending"); + def1.resolve(); + equal(p1.state(), "resolved"); + equal(p2.state(), "pending"); + def2.resolve(); + equal(p1.state(), "resolved"); + equal(p2.state(), "resolved"); + }); + test('simpleScheduling2', function (instance) { + var m = new $.Mutex(); + var def1 = $.Deferred(); + var def2 = $.Deferred(); + var p1 = m.exec(function() { return def1; }); + var p2 = m.exec(function() { return def2; }); + equal(p1.state(), "pending"); + equal(p2.state(), "pending"); + def2.resolve(); + equal(p1.state(), "pending"); + equal(p2.state(), "pending"); + def1.resolve(); + equal(p1.state(), "resolved"); + equal(p2.state(), "resolved"); + }); + test('reject', function (instance) { + var m = new $.Mutex(); + var def1 = $.Deferred(); + var def2 = $.Deferred(); + var def3 = $.Deferred(); + var p1 = m.exec(function() {return def1;}); + var p2 = m.exec(function() {return def2;}); + var p3 = m.exec(function() {return def3;}); + equal(p1.state(), "pending"); + equal(p2.state(), "pending"); + equal(p3.state(), "pending"); + def1.resolve(); + equal(p1.state(), "resolved"); + equal(p2.state(), "pending"); + equal(p3.state(), "pending"); + def2.reject(); + equal(p1.state(), "resolved"); + equal(p2.state(), "rejected"); + equal(p3.state(), "pending"); + def3.resolve(); + equal(p1.state(), "resolved"); + equal(p2.state(), "rejected"); + equal(p3.state(), "resolved"); + }); +});