[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
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):
@@ -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();
});
},
@@ -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();
@@ -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 () {
@@ -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,
};
@@ -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': '<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();
});
});
});
});