[MERGE] forward port branch saas-11.2 up to 7fd9dbdd9f

This commit is contained in:
Christophe Simonis
2018-04-24 16:35:06 +02:00
6 changed files with 103 additions and 8 deletions
+2 -2
View File
@@ -853,7 +853,7 @@ class WizardMultiChartsAccounts(models.TransientModel):
@api.multi @api.multi
def existing_accounting(self, company_id): 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: for model in model_to_check:
if len(self.env[model].search([('company_id', '=', company_id.id)])) > 0: if len(self.env[model].search([('company_id', '=', company_id.id)])) > 0:
return True return True
@@ -888,7 +888,7 @@ class WizardMultiChartsAccounts(models.TransientModel):
accounting_props.unlink() accounting_props.unlink()
# delete account, journal, tax, fiscal position and reconciliation model # 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: for model in models_to_delete:
res = self.env[model].search([('company_id', '=', self.company_id.id)]) res = self.env[model].search([('company_id', '=', self.company_id.id)])
if len(res): if len(res):
@@ -78,6 +78,16 @@ var KanbanController = BasicController.extend({
} }
return this.renderer.updateRecord(this.model.get(id)); 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 * This method calls the server to ask for a resequence. Note that this
* does not rerender the user interface, because in most case, the * does not rerender the user interface, because in most case, the
@@ -134,6 +144,10 @@ var KanbanController = BasicController.extend({
_onAddColumn: function (event) { _onAddColumn: function (event) {
var self = this; var self = this;
this.model.createGroup(event.data.value, this.handle).then(function () { 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}); return self.update({}, {reload: false});
}).then(function () { }).then(function () {
self._updateButtons(); self._updateButtons();
@@ -396,9 +410,7 @@ var KanbanController = BasicController.extend({
*/ */
_onResequenceColumn: function (event) { _onResequenceColumn: function (event) {
var self = this; var self = this;
var state = this.model.get(this.handle, {raw: true}); this._resequenceColumns(event.data.ids).then(function () {
var model = state.fields[state.groupedBy[0]].relation;
this.model.resequence(model, event.data.ids, this.handle).then(function () {
self._updateEnv(); self._updateEnv();
}); });
}, },
@@ -1015,6 +1015,9 @@ var MockServer = Class.extend({
case '/web/dataset/search_read': case '/web/dataset/search_read':
return $.when(this._mockSearchReadController(args)); 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))) { if (route.indexOf('/web/image') >= 0 || _.contains(['.png', '.jpg'], route.substr(route.length - 4))) {
return $.when(); return $.when();
@@ -1579,7 +1579,7 @@ QUnit.module('Views', {
}); });
QUnit.test('create a column in grouped on m2o', function (assert) { QUnit.test('create a column in grouped on m2o', function (assert) {
assert.expect(13); assert.expect(14);
var nbRPCs = 0; var nbRPCs = 0;
var kanban = createView({ var kanban = createView({
@@ -1598,6 +1598,11 @@ QUnit.module('Views', {
if (args.method === 'name_create') { if (args.method === 'name_create') {
assert.ok(true, "should call 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); return this._super(route, args);
}, },
}); });
@@ -1679,7 +1684,7 @@ QUnit.module('Views', {
}); });
QUnit.test('delete a column in grouped on m2o', function (assert) { QUnit.test('delete a column in grouped on m2o', function (assert) {
assert.expect(28); assert.expect(29);
testUtils.patch(KanbanRenderer, { testUtils.patch(KanbanRenderer, {
_renderGrouped: function () { _renderGrouped: function () {
@@ -1,6 +1,7 @@
odoo.define('base.settings', function (require) { odoo.define('base.settings', function (require) {
"use strict"; "use strict";
var BasicModel = require('web.BasicModel');
var core = require('web.core'); var core = require('web.core');
var config = require('web.config'); var config = require('web.config');
var FormView = require('web.FormView'); 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({ var BaseSettingView = FormView.extend({
jsLibs: [], jsLibs: [],
config: _.extend({}, FormView.prototype.config, { config: _.extend({}, FormView.prototype.config, {
Model: BaseSettingsModel,
Renderer: BaseSettingRenderer, Renderer: BaseSettingRenderer,
Controller: BaseSettingController, Controller: BaseSettingController,
}), }),
@@ -370,6 +388,7 @@ var BaseSettingView = FormView.extend({
view_registry.add('base_settings', BaseSettingView); view_registry.add('base_settings', BaseSettingView);
return { return {
Model: BaseSettingsModel,
Renderer: BaseSettingRenderer, Renderer: BaseSettingRenderer,
Controller: BaseSettingController, Controller: BaseSettingController,
}; };
@@ -6,6 +6,8 @@ var view_registry = require('web.view_registry');
var createView = testUtils.createView; var createView = testUtils.createView;
var BaseSettingsView = view_registry.get('base_settings'); var BaseSettingsView = view_registry.get('base_settings');
var createActionManager = testUtils.createActionManager;
QUnit.module('base_settings_tests', { QUnit.module('base_settings_tests', {
beforeEach: function () { beforeEach: function () {
@@ -83,5 +85,59 @@ QUnit.module('base_settings_tests', {
assert.strictEqual(form.$('.notFound').hasClass('o_hidden'),false,"record not found message shown"); assert.strictEqual(form.$('.notFound').hasClass('o_hidden'),false,"record not found message shown");
form.destroy(); 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': '<form string="Settings" js_class="base_settings">' +
'<div class="app_settings_block" string="CRM" data-key="crm">' +
'<button name="4" string="Execute action" type="action"/>' +
'</div>' +
'</form>',
'project,2,list': '<tree><field name="foo"/></tree>',
'project,false,search': '<search></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();
});
});
}); });
});