Skip to content

Commit

Permalink
[FIX] web: ActionManager: handle false actions
Browse files Browse the repository at this point in the history
Server actions return an action to execute, or false. When they
return false, an 'ir.actions.act_window_close' must be executed,
such that the current dialog closes (if any) and mostly, the
'on_close' handler is executed, which ensures for example that the
current view is reloaded.

The case where server actions return false has been broken by rev.
32b8cec. It produced tracebacks in several models, when clicking
on some actions in the 'Action' dropdown. For instance, in lunch,
go to Configuration > Products, open one in a form view, and click
on 'Lunch: Archive/Restore products' in the Action dropdown.
  • Loading branch information
Nikunj Ladava authored and aab-odoo committed Feb 15, 2018
1 parent 8b9e854 commit 4c186f3
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
1 change: 1 addition & 0 deletions addons/web/static/src/js/chrome/action_manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,7 @@ var ActionManager = Widget.extend({
},
});
return this.dp.add(runDef).then(function (action) {
action = action || { type: 'ir.actions.act_window_close' };
return self.doAction(action, options);
});
},
Expand Down
39 changes: 39 additions & 0 deletions addons/web/static/tests/chrome/action_manager_tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -1324,6 +1324,45 @@ QUnit.module('ActionManager', {
actionManager.destroy();
});

QUnit.test('handle server actions returning false', function (assert) {
assert.expect(9);

var actionManager = createActionManager({
actions: this.actions,
archs: this.archs,
data: this.data,
mockRPC: function (route, args) {
assert.step(args.method || route);
if (route === '/web/action/run') {
return $.when(false);
}
return this._super.apply(this, arguments);
},
});

// execute an action in target="new"
actionManager.doAction(5, {
on_close: assert.step.bind(assert, 'close handler'),
});
assert.strictEqual($('.o_technical_modal .o_form_view').length, 1,
"should have rendered a form view in a modal");

// execute a server action that returns false
actionManager.doAction(2);
assert.strictEqual($('.o_technical_modal').length, 0,
"should have closed the modal");
assert.verifySteps([
'/web/action/load', // action 5
'load_views',
'default_get',
'/web/action/load', // action 2
'/web/action/run',
'close handler',
]);

actionManager.destroy();
});

QUnit.module('Report actions');

QUnit.test('can execute report actions from db ID', function (assert) {
Expand Down

0 comments on commit 4c186f3

Please sign in to comment.