diff --git a/addons/account/models/chart_template.py b/addons/account/models/chart_template.py index 7832a2354aa..69413f6bd66 100644 --- a/addons/account/models/chart_template.py +++ b/addons/account/models/chart_template.py @@ -853,7 +853,7 @@ class WizardMultiChartsAccounts(models.TransientModel): @api.multi def existing_accounting(self, company_id): - model_to_check = ['account.move.line', 'account.invoice', 'account.move', 'account.payment', 'account.bank.statement'] + model_to_check = ['account.move.line', 'account.invoice', 'account.payment', 'account.bank.statement'] for model in model_to_check: if len(self.env[model].search([('company_id', '=', company_id.id)])) > 0: return True @@ -888,7 +888,7 @@ class WizardMultiChartsAccounts(models.TransientModel): accounting_props.unlink() # delete account, journal, tax, fiscal position and reconciliation model - models_to_delete = ['account.reconcile.model', 'account.fiscal.position', 'account.tax', 'account.journal'] + models_to_delete = ['account.reconcile.model', 'account.fiscal.position', 'account.tax', 'account.move', 'account.journal'] for model in models_to_delete: res = self.env[model].search([('company_id', '=', self.company_id.id)]) if len(res): diff --git a/addons/web/static/src/js/views/kanban/kanban_controller.js b/addons/web/static/src/js/views/kanban/kanban_controller.js index 5e8bcbf963f..986fff3a53e 100644 --- a/addons/web/static/src/js/views/kanban/kanban_controller.js +++ b/addons/web/static/src/js/views/kanban/kanban_controller.js @@ -78,6 +78,16 @@ var KanbanController = BasicController.extend({ } return this.renderer.updateRecord(this.model.get(id)); }, + /** + * @param {number[]} ids + * @private + * @returns {Deferred} + */ + _resequenceColumns: function (ids) { + var state = this.model.get(this.handle, {raw: true}); + var model = state.fields[state.groupedBy[0]].relation; + return this.model.resequence(model, ids, this.handle); + }, /** * This method calls the server to ask for a resequence. Note that this * does not rerender the user interface, because in most case, the @@ -134,6 +144,10 @@ var KanbanController = BasicController.extend({ _onAddColumn: function (event) { var self = this; this.model.createGroup(event.data.value, this.handle).then(function () { + var state = self.model.get(self.handle, {raw: true}); + var ids = _.pluck(state.data, 'res_id').filter(_.isNumber); + return self._resequenceColumns(ids); + }).then(function () { return self.update({}, {reload: false}); }).then(function () { self._updateButtons(); @@ -396,9 +410,7 @@ var KanbanController = BasicController.extend({ */ _onResequenceColumn: function (event) { var self = this; - var state = this.model.get(this.handle, {raw: true}); - var model = state.fields[state.groupedBy[0]].relation; - this.model.resequence(model, event.data.ids, this.handle).then(function () { + this._resequenceColumns(event.data.ids).then(function () { self._updateEnv(); }); }, diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js index a66f78ff159..148b7452678 100644 --- a/addons/web/static/tests/helpers/mock_server.js +++ b/addons/web/static/tests/helpers/mock_server.js @@ -1015,6 +1015,9 @@ var MockServer = Class.extend({ case '/web/dataset/search_read': return $.when(this._mockSearchReadController(args)); + + case '/web/dataset/resequence': + return $.when(); } if (route.indexOf('/web/image') >= 0 || _.contains(['.png', '.jpg'], route.substr(route.length - 4))) { return $.when(); diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js index fbe345887f3..c5e5f606f61 100644 --- a/addons/web/static/tests/views/kanban_tests.js +++ b/addons/web/static/tests/views/kanban_tests.js @@ -1579,7 +1579,7 @@ QUnit.module('Views', { }); QUnit.test('create a column in grouped on m2o', function (assert) { - assert.expect(13); + assert.expect(14); var nbRPCs = 0; var kanban = createView({ @@ -1598,6 +1598,11 @@ QUnit.module('Views', { if (args.method === 'name_create') { assert.ok(true, "should call name_create"); } + //Create column will call resequence to set column order + if (route === '/web/dataset/resequence') { + assert.ok(true, "should call resequence"); + return $.when(true); + } return this._super(route, args); }, }); @@ -1679,7 +1684,7 @@ QUnit.module('Views', { }); QUnit.test('delete a column in grouped on m2o', function (assert) { - assert.expect(28); + assert.expect(29); testUtils.patch(KanbanRenderer, { _renderGrouped: function () { diff --git a/odoo/addons/base/static/src/js/res_config_settings.js b/odoo/addons/base/static/src/js/res_config_settings.js index 623b452a91e..caae87cc183 100644 --- a/odoo/addons/base/static/src/js/res_config_settings.js +++ b/odoo/addons/base/static/src/js/res_config_settings.js @@ -1,6 +1,7 @@ odoo.define('base.settings', function (require) { "use strict"; +var BasicModel = require('web.BasicModel'); var core = require('web.core'); var config = require('web.config'); var FormView = require('web.FormView'); @@ -346,10 +347,27 @@ var BaseSettingController = FormController.extend({ }, }); +var BaseSettingsModel = BasicModel.extend({ + /** + * @override + */ + save: function (recordID) { + var self = this; + return this._super.apply(this, arguments).then(function (result) { + // we remove here the res_id, because the record should still be + // considered new. We want the web client to always perform a + // default_get to fetch the settings anew. + delete self.localData[recordID].res_id; + return result; + }); + }, +}); + var BaseSettingView = FormView.extend({ jsLibs: [], config: _.extend({}, FormView.prototype.config, { + Model: BaseSettingsModel, Renderer: BaseSettingRenderer, Controller: BaseSettingController, }), @@ -370,6 +388,7 @@ var BaseSettingView = FormView.extend({ view_registry.add('base_settings', BaseSettingView); return { + Model: BaseSettingsModel, Renderer: BaseSettingRenderer, Controller: BaseSettingController, }; diff --git a/odoo/addons/base/static/tests/base_settings_tests.js b/odoo/addons/base/static/tests/base_settings_tests.js index ae46cacfbc4..e4e5dc0527d 100644 --- a/odoo/addons/base/static/tests/base_settings_tests.js +++ b/odoo/addons/base/static/tests/base_settings_tests.js @@ -6,6 +6,8 @@ var view_registry = require('web.view_registry'); var createView = testUtils.createView; var BaseSettingsView = view_registry.get('base_settings'); +var createActionManager = testUtils.createActionManager; + QUnit.module('base_settings_tests', { beforeEach: function () { @@ -83,5 +85,59 @@ QUnit.module('base_settings_tests', { assert.strictEqual(form.$('.notFound').hasClass('o_hidden'),false,"record not found message shown"); form.destroy(); }); + + QUnit.test('settings views does not read existing id when coming back in breadcrumbs', function (assert) { + assert.expect(7); + + var actions = [{ + id: 1, + name: 'Settings view', + res_model: 'project', + type: 'ir.actions.act_window', + views: [[1, 'form']], + }, { + id: 4, + name: 'Other action', + res_model: 'project', + type: 'ir.actions.act_window', + views: [[2, 'list']], + }]; + var archs = { + 'project,1,form': '
' + + '
' + + '
' + + '
', + 'project,2,list': '', + 'project,false,search': '', + }; + + var actionManager = createActionManager({ + actions: actions, + archs: archs, + data: this.data, + mockRPC: function (route, args) { + if (args.method) { + assert.step(args.method); + } + return this._super.apply(this, arguments); + }, + }); + + actionManager.doAction(1); + actionManager.$('button[name="4"]').click(); + $('.o_control_panel .breadcrumb li a').click(); + assert.verifySteps([ + 'load_views', // initial setting action + 'default_get', // this is a setting view => create new record + 'create', // when we click on action button => save + 'read', // with save, we have a reload... (not necessary actually) + 'load_views', // for other action in breadcrumb, + // with a searchread (not shown here since it is a route) + 'default_get', // when we come back, we want to restart from scratch + ]); + + actionManager.destroy(); + }); +}); }); -}); \ No newline at end of file