[FIX] web: reload after wizard when record has been removed cause exception

If an action unlink the current records (e.g. unreconcile on account.move.reconcile), trigger history_back to avoid errors when trying to reload inexistant record (opw 607883)
This is a partial backport of saas-4 code (rev c0db6ae, 162ad1c) and should not be forward ported.
This commit is contained in:
Anaël Closson 2014-05-28 16:01:47 +02:00 committed by Martin Trigaux
parent 8320f01fef
commit 680f9554b4
4 changed files with 25 additions and 18 deletions

View File

@ -101,9 +101,6 @@ instance.web.Dialog = instance.web.Widget.extend({
autoOpen: false, autoOpen: false,
position: [false, 40], position: [false, 40],
buttons: null, buttons: null,
beforeClose: function () {
self.trigger("closing");
},
resizeStop: function() { resizeStop: function() {
self.trigger("resized"); self.trigger("resized");
}, },
@ -204,8 +201,9 @@ instance.web.Dialog = instance.web.Widget.extend({
/** /**
Closes the popup, if destroy_on_close was passed to the constructor, it is also destroyed. Closes the popup, if destroy_on_close was passed to the constructor, it is also destroyed.
*/ */
close: function() { close: function(reason) {
if (this.dialog_inited && this.$el.is(":data(dialog)")) { if (this.dialog_inited && this.$el.is(":data(dialog)")) {
this.trigger("closing", reason);
this.$el.dialog('close'); this.$el.dialog('close');
} }
}, },
@ -221,14 +219,14 @@ instance.web.Dialog = instance.web.Widget.extend({
/** /**
Destroys the popup, also closes it. Destroys the popup, also closes it.
*/ */
destroy: function () { destroy: function (reason) {
this.$buttons.remove(); this.$buttons.remove();
_.each(this.getChildren(), function(el) { _.each(this.getChildren(), function(el) {
el.destroy(); el.destroy();
}); });
if (! this.__tmp_dialog_closing) { if (! this.__tmp_dialog_closing) {
this.__tmp_dialog_destroying = true; this.__tmp_dialog_destroying = true;
this.close(); this.close(reason);
this.__tmp_dialog_destroying = undefined; this.__tmp_dialog_destroying = undefined;
} }
if (this.dialog_inited && !this.isDestroyed() && this.$el.is(":data(dialog)")) { if (this.dialog_inited && !this.isDestroyed() && this.$el.is(":data(dialog)")) {

View File

@ -957,14 +957,20 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
} else { } else {
var fields = _.keys(self.fields_view.fields); var fields = _.keys(self.fields_view.fields);
fields.push('display_name'); fields.push('display_name');
return self.dataset.read_index(fields, // Use of search_read instead of read to check if we can still read the record (security rules)
return self.dataset.call('search_read', [[['id', '=', self.dataset.ids[self.dataset.index]]], fields],
{ {
context: { context: {
'bin_size': true, 'bin_size': true,
'future_display_name': true 'future_display_name': true
} }
}).then(function(r) { }).then(function(r) {
self.trigger('load_record', r); if (_.isEmpty(r)){
self.do_action('history_back');
}
else{
self.trigger('load_record', r[0]);
}
}); });
} }
}); });
@ -1972,8 +1978,10 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({
return this.view.do_execute_action( return this.view.do_execute_action(
_.extend({}, this.node.attrs, {context: context}), _.extend({}, this.node.attrs, {context: context}),
this.view.dataset, this.view.datarecord.id, function () { this.view.dataset, this.view.datarecord.id, function (reason) {
self.view.recursive_reload(); if (!_.isObject(reason)) {
self.view.recursive_reload();
}
}); });
}, },
check_disable: function() { check_disable: function() {

View File

@ -528,13 +528,14 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
}, },
reload_record: function (record) { reload_record: function (record) {
var self = this; var self = this;
return this.dataset.read_ids( // Use of search_read instead of read to check if we can still read the record (security rules)
[record.get('id')], return this.dataset.call('search_read', [
[['id', '=', record.get('id')]],
_.pluck(_(this.columns).filter(function (r) { _.pluck(_(this.columns).filter(function (r) {
return r.tag === 'field'; return r.tag === 'field';
}), 'name') }), 'name')]
).done(function (records) { ).done(function (records) {
var values = records[0]; var values = _.isEmpty(records) ? undefined : records[0];
if (!values) { if (!values) {
self.records.remove(record); self.records.remove(record);
return; return;

View File

@ -22,9 +22,9 @@ instance.web.ActionManager = instance.web.Widget.extend({
this._super.apply(this, arguments); this._super.apply(this, arguments);
this.$el.on('click', 'a.oe_breadcrumb_item', this.on_breadcrumb_clicked); this.$el.on('click', 'a.oe_breadcrumb_item', this.on_breadcrumb_clicked);
}, },
dialog_stop: function () { dialog_stop: function (reason) {
if (this.dialog) { if (this.dialog) {
this.dialog.destroy(); this.dialog.destroy(reason);
} }
this.dialog = null; this.dialog = null;
}, },
@ -376,7 +376,7 @@ instance.web.ActionManager = instance.web.Widget.extend({
if (this.dialog_widget && !this.dialog_widget.isDestroyed()) { if (this.dialog_widget && !this.dialog_widget.isDestroyed()) {
this.dialog_widget.destroy(); this.dialog_widget.destroy();
} }
this.dialog_stop(); this.dialog_stop(executor.action);
this.dialog = new instance.web.Dialog(this, { this.dialog = new instance.web.Dialog(this, {
dialogClass: executor.klass, dialogClass: executor.klass,
}); });
@ -394,7 +394,7 @@ instance.web.ActionManager = instance.web.Widget.extend({
this.dialog.open(); this.dialog.open();
return initialized; return initialized;
} else { } else {
this.dialog_stop(); this.dialog_stop(executor.action);
this.inner_action = executor.action; this.inner_action = executor.action;
this.inner_widget = widget; this.inner_widget = widget;
executor.post_process(widget); executor.post_process(widget);