[MERGE] forward port branch saas-11.2 up to 7fd9dbdd9f
This commit is contained in:
@@ -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();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user