diff --git a/addons/web/static/test/x2many.js b/addons/web/static/test/x2many.js
deleted file mode 100644
index 2174ae42994..00000000000
--- a/addons/web/static/test/x2many.js
+++ /dev/null
@@ -1,610 +0,0 @@
-odoo.define('web.test.x2many', function (require) {
-'use strict';
-
-var Tour = require('web.Tour');
-var inc;
-
-Tour.register({
- id: 'widget_x2many',
- name: "one2many and many2many checks",
- mode: 'test',
- path: '/web#action=test_new_api.action_discussions',
-
- steps: [
- {
- title: "wait web client",
- waitFor: '.breadcrumb:contains(Discussions)'
- },
-
- // create test discussion
- {
- title: "create new discussion",
- element: 'button.o_list_button_add',
- },
- {
- title: "insert title",
- element: 'input.o_form_required',
- sampleText: 'test'
- },
-
- // try to add a user with one2many form
- {
- title: "click on moderator one2many drop down",
- waitFor: 'input.o_form_required:propValue(test)',
- element: 'tr:contains(Moderator) .o_form_input_dropdown > input'
- },
- {
- title: "click on 'Create and Edit...'",
- element: '.o_m2o_dropdown_option:last'
- },
- {
- title: "insert a name into the modal form",
- element: '.modal input.o_form_field.o_form_required:first',
- sampleText: 'user_test',
- onload: function () {
- inc = new Date().getTime();
- this.sampleText = 'user_test_' + inc;
- }
- },
- {
- title: "insert an email into the modal form",
- waitFor: '.modal input.o_form_field.o_form_required:propValueContains(user_test)',
- element: '.modal input.o_form_field.o_form_required:eq(1)',
- sampleText: 'user_test@test',
- onload: function () {
- this.sampleText = 'user_test_' + inc + '@test';
- }
- },
- {
- title: "save the modal content and create the new moderator",
- waitFor: '.modal input.o_form_field.o_form_required:propValueContains(@test)',
- element: '.modal .modal-footer button:contains(Save)',
- },
- {
- title: "check if the modal is saved",
- waitFor: 'tr:contains(Moderator) .o_form_field_many2one input:propValueContains(user_test)',
- },
- {
- title: "check the onchange from the o2m to the m2m",
- waitFor: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr td:contains(user_test)',
- },
-
- // add ourself as participant
- {
- title: "change tab to Participants",
- element: '[data-toggle="tab"]:contains(Participants)'
- },
- {
- title: "click to add participants",
- element: '.tab-pane:eq(2).active .o_form_field_x2many_list_row_add a'
- },
- {
- title: "select Admin",
- element: '.modal tr:has(td[data-field="name"]:containsExact(Administrator)) .o_list_record_selector input[type="checkbox"]'
- },
- {
- title: "save selected participants",
- waitFor: '.modal tr:has(td[data-field="name"]:containsExact(Administrator)) .o_list_record_selector input[type="checkbox"]:propChecked',
- element: '.o_selectcreatepopup_search_select'
- },
-
- // save
- {
- title: "save discussion",
- waitFor: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(Administrator))',
- element: 'button.o_form_button_save'
- },
- // edit
- {
- title: "edit discussion",
- element: 'button.o_form_button_edit'
- },
-
- // add message a
- {
- title: "Select First Tab",
- element: 'a[role=tab]:first',
- },
- {
- title: "create new message a",
- element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
- },
- {
- title: "insert body a",
- element: '.modal textarea.o_form_textarea',
- sampleText: 'a'
- },
- {
- title: "save new message a",
- waitFor: '.modal textarea.o_form_textarea:propValue(a)',
- element: '.modal .modal-footer button:contains(Save)'
- },
-
- // add message b
- {
- title: "create new message b",
- waitNot: '.modal',
- waitFor: '.o_web_client:has(textarea[name="message_concat"]:propValue([test] Administrator:a))',
- element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
- },
- {
- title: "insert body b",
- element: '.modal textarea.o_form_textarea',
- sampleText: 'b'
- },
- {
- title: "save new message b",
- waitFor: '.modal textarea.o_form_textarea:propValue(b)',
- element: '.modal .modal-footer button:contains(Save)'
- },
-
- // change title to trigger on change
- {
- title: "insert title",
- waitNot: '.modal',
- waitFor: 'textarea[name="message_concat"]:propValue([test] Administrator:a\n[test] Administrator:b)',
- element: 'input.o_form_required',
- sampleText: 'test_trigger'
- },
- {
- title: "blur the title field",
- waitFor: 'input.o_form_required:propValue(test_trigger)',
- element: '.o_form_field_many2one input:first',
- },
- {
- title: "check onchange",
- waitFor: 'textarea[name="message_concat"]:propValue([test_trigger] Administrator:a\n[test_trigger] Administrator:b)',
- },
-
- // change message b
-
- {
- title: "edit message b",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains([test_trigger] )',
- waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- element: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(b)'
- },
- {
- title: "change the body",
- element: '.modal textarea.o_form_textarea',
- sampleText: 'bbb'
- },
- {
- title: "save changes",
- waitFor: '.modal textarea.o_form_textarea:propValue(bbb)',
- element: '.modal .modal-footer button:contains(Save)'
- },
-
- // add message c
- {
- title: "create new message c",
- waitNot: '.modal',
- waitFor: 'textarea[name="message_concat"]:propValue([test_trigger] Administrator:a\n[test_trigger] Administrator:bbb)',
- element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
- },
- {
- title: "insert body",
- element: '.modal textarea.o_form_textarea',
- sampleText: 'c'
- },
- {
- title: "save new message c",
- waitFor: '.modal textarea.o_form_textarea:propValue(c)',
- element: '.modal .modal-footer button:contains(Save)'
- },
-
- // add participants
- {
- title: "change tab to Participants",
- waitNot: '.modal',
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- element: '[data-toggle="tab"]:contains(Participants)'
- },
- {
- title: "click to add participants",
- element: '.tab-pane:eq(2).active .o_form_field_x2many_list_row_add a'
- },
- {
- title: "select Demo User",
- element: '.modal tr:has(td[data-field="name"]:containsExact(Demo User)) .o_list_record_selector input[type="checkbox"]'
- },
- {
- title: "save selected participants",
- waitFor: '.modal tr:has(td[data-field="name"]:containsExact(Demo User)) .o_list_record_selector input[type="checkbox"]:propChecked',
- element: '.o_selectcreatepopup_search_select'
- },
-
- // save
- {
- title: "save discussion",
- waitFor: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- waitNot: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
- element: 'button.o_form_button_save'
- },
-
- // check saved data
- {
- title: "check data 1",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
- },
- {
- title: "check data 2",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tr:has(td:containsExact(bbb)):has(td:containsExact([test_trigger] Administrator))',
- },
- {
- title: "check data 3",
- waitFor: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- waitNot: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
- },
-
- // edit
- {
- title: "edit discussion",
- element: 'button.o_form_button_edit'
- },
- {
- title: "change tab to Messages",
- waitFor: '.o_form_editable',
- element: '[data-toggle="tab"]:contains(Messages)'
- },
-
- // add message d
- {
- title: "create new message d",
- waitFor: 'li.active a[data-toggle="tab"]:contains(Messages)',
- element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
- },
- {
- title: "insert body",
- element: '.modal textarea.o_form_textarea',
- sampleText: 'd'
- },
- {
- title: "save new message d",
- waitFor: '.modal textarea.o_form_textarea:propValue(d)',
- element: '.modal .modal-footer button:contains(Save)'
- },
-
- // add message e
- {
- title: "create new message e",
- waitNot: '.modal',
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(d)',
- element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
- },
- {
- title: "insert body",
- element: '.modal textarea.o_form_textarea',
- sampleText: 'e'
- },
- {
- title: "save new message e",
- waitFor: '.modal textarea.o_form_textarea:propValue(e)',
- element: '.modal .modal-footer button:contains(Save)'
- },
-
- // change message a
- {
- title: "edit message a",
- waitNot: '.modal',
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(e)',
- element: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(a)'
- },
- {
- title: "change the body",
- element: '.modal textarea.o_form_textarea',
- sampleText: 'aaa'
- },
- {
- title: "save changes",
- waitFor: '.modal textarea.o_form_textarea:propValue(aaa)',
- element: '.modal .modal-footer button:contains(Save)'
- },
-
- // change message e
- {
- title: "edit message e",
- waitNot: '.modal',
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains(aaa)',
- element: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(e)'
- },
-
- {
- title: "open the many2one to select another user",
- element: '.modal .o_form_input_dropdown > input',
- },
- {
- title: "select another user",
- element: '.ui-autocomplete li:contains(Demo User)',
- },
- {
- title: "test one2many's line onchange after many2one",
- waitFor: '.modal .o_form_field:contains([test_trigger] Demo User)',
- },
- {
- title: "test one2many field not triggered onchange",
- waitFor: 'textarea[name="message_concat"]:propValueContains([test_trigger] Administrator:e)',
- },
- {
- title: "save changes",
- element: '.modal .modal-footer button:contains(Save)'
- },
- {
- title: "test one2many triggered the onchange on save for the line",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td.o_readonly:contains([test_trigger] Demo User)',
- },
- {
- title: "test one2many triggered the onchange on save",
- waitFor: 'textarea[name="message_concat"]:propValueContains([test_trigger] Demo User:e)',
- },
-
- // remove
- {
- title: "remove b",
- waitNot: '.modal',
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains(aaa)',
- element: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(bbb)) .o_list_record_delete'
- },
- {
- title: "remove e",
- waitNot: 'tr:has(td:containsExact(bbb))',
- element: 'tr:has(td:containsExact(e)) .o_list_record_delete'
- },
-
- // save
- {
- title: "save discussion",
- waitNot: 'tr:has(td:containsExact(e))',
- element: 'button.o_form_button_save'
- },
-
- // check saved data
- {
- title: "check data 4",
- waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(.o_list_record_delete):eq(4)',
- },
- {
- title: "check data 5",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(aaa)):has(tr td:containsExact(c)):has(tr td:containsExact(d))',
- },
- {
- title: "check data 6",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact([test_trigger] Administrator)):has(td:containsExact(aaa))',
- },
- {
- title: "check data 7",
- waitFor: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- waitNot: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[date-id]:eq(3)',
- },
-
- // edit
- {
- title: "edit discussion",
- element: 'button.o_form_button_edit'
- },
-
- // add message ddd
- {
- title: "create new message ddd",
- waitNot: '.modal',
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(d))',
- element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
- },
- {
- title: "select another user",
- element: '.modal .o_form_field_many2one .o_form_input_dropdown > input',
- },
- {
- title: "select demo user",
- element: 'li a:contains(Demo User)',
- },
- {
- title: "test one2many's line onchange after many2one",
- waitFor: '.modal .o_form_field:contains([test_trigger] Demo User)',
- },
- {
- title: "insert body",
- element: '.modal textarea.o_form_textarea',
- sampleText: 'ddd'
- },
- {
- title: "save new message ddd",
- waitFor: '.modal textarea.o_form_textarea:propValue(ddd)',
- element: '.modal .modal-footer button:contains(Save)'
- },
-
- // trigger onchange
- {
- title: "blur the one2many",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(ddd))',
- element: 'input.o_form_required',
- },
-
- // check onchange data
- {
- title: "check data 8",
- waitFor: 'textarea[name="message_concat"]:propValueContains([test_trigger] Administrator:aaa\n[test_trigger] Administrator:c\n[test_trigger] Administrator:d\n[test_trigger] Demo User:ddd)',
- },
- {
- title: "check data 9",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
- waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(4)',
- },
-
- // cancel
- {
- title: "cancel change",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(ddd))',
- element: '.o_form_button_cancel',
- onload: function () {
- // remove the window alert (can't click on it with JavaScript tour)
- $('.oe_form_dirty').removeClass('oe_form_dirty');
- }
- },
-
- /////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////////////////////
-
- {
- title: "switch to the second form view to test one2many with editable list (toggle menu dropdown)",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- element: '.o_sub_menu .oe_secondary_submenu .oe_menu_leaf .oe_menu_text:containsExact(Discussions)'
- },
- {
- title: "switch to the second form view to test one2many with editable list (open submenu)",
- element: '.o_sub_menu .oe_secondary_submenu .oe_menu_leaf .oe_menu_text:contains(Discussions 2)'
- },
-
- {
- title: "select previous created record",
- waitFor: '.breadcrumb li:containsExact(Discussions 2)',
- element: 'td[data-field="name"]:contains(test_trigger):last',
- },
- {
- title: "click on edit",
- element: '.o_form_button_edit',
- },
-
- {
- title: "edit title",
- waitFor: ".o_form_editable",
- element: 'input.o_form_required',
- sampleText: 'test_trigger2'
- },
- {
- title: "click outside to trigger onchange",
- element: '.o_form_sheet',
- },
- {
- title: "click on a field of the editable list to edit content",
- waitFor: '.o_list_editable:contains(test_trigger2)',
- element: '.o_list_editable tr[data-id]:eq(1) td',
- },
- {
- title: "change text value",
- element: '.o_list_editable_form textarea.o_form_field[data-fieldname="body"]',
- sampleText: 'ccc'
- },
- {
- title: "click on first field (trigger the line onchange)",
- element: '.o_list_editable_form .o_form_field[data-fieldname="name"]',
- },
- {
- title: "test one2many's line onchange",
- waitFor: '.o_list_editable_form .o_form_field[data-fieldname="size"]:contains(3)',
- },
- {
- title: "test one2many field not triggered onchange",
- waitNot: 'textarea[name="message_concat"]:propValueContains(ccc)',
- },
-
- {
- title: "open the many2one to select an other user",
- element: '.o_list_editable_form .o_form_field_many2one .o_form_input_dropdown > input',
- },
- {
- title: "select an other user",
- element: '.ui-autocomplete li a:contains(Demo User)',
- },
- {
- title: "test one2many's line onchange after many2one",
- waitFor: '.o_list_editable_form span.o_form_field:contains([test_trigger2] Demo User)',
- },
- {
- title: "test one2many field not triggered onchange",
- waitNot: 'textarea[name="message_concat"]:propValueContains(ccc)',
- },
- {
- title: "change text value",
- element: 'textarea.o_form_field[data-fieldname="body"]',
- sampleText: 'ccccc'
- },
-
- // check onchange
- {
- title: "click outside to trigger one2many onchange",
- waitNot: 'textarea[name="message_concat"]:propValueContains(Demo User)',
- element: 'input.o_form_required',
- },
- {
- title: "test one2many onchange",
- waitFor: 'textarea[name="message_concat"]:propValueContains([test_trigger2] Demo User:ccccc)',
- },
-
- {
- title: "click outside to trigger one2many onchange",
- element: '.o_form_field_many2manytags .o_form_input_dropdown > input',
- },
- {
- title: "add a tag",
- element: '.ui-autocomplete a:first',
- },
-
- // remove record
- {
- title: "delete the last item in the editable list",
- element: '.o_list_view tr[data-id] td.o_list_record_delete span:visible:last',
- },
- {
- title: "test one2many onchange after delete",
- waitNot: 'textarea[name="message_concat"]:propValueContains(Administrator:d)',
- },
-
- // save
- {
- title: "save discussion",
- waitNot: 'tr:has(td:containsExact(d))',
- element: 'button.o_form_button_save'
- },
-
- // check saved data
- {
- title: "check data 10",
- waitFor: '.o_form_textarea:containsExact([test_trigger2] Administrator:aaa\n[test_trigger2] Demo User:ccccc)',
- },
- {
- title: "check data 11",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(1)',
- waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- },
-
- // edit
- {
- title: "edit discussion",
- element: 'button.o_form_button_edit'
- },
-
- // add message eee
- {
- title: "create new message eee",
- waitFor: 'li.active a[data-toggle="tab"]:contains(Messages)',
- element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
- },
- {
- title: "change text value",
- element: 'textarea.o_form_field[data-fieldname="body"]',
- sampleText: 'eee'
- },
-
- // save
- {
- title: "save discussion",
- waitFor: 'textarea.o_form_field[data-fieldname="body"]:propValueContains(eee)',
- element: 'button.o_form_button_save'
- },
-
- // check saved data
- {
- title: "check data 12",
- waitFor: '.o_form_textarea:containsExact([test_trigger2] Administrator:aaa\n[test_trigger2] Demo User:ccccc\n[test_trigger2] Administrator:eee)',
- },
- {
- title: "check data 13",
- waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
- waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
- },
- ]
-});
-
-});
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
index dcc9fc4fd22..ccf01aaa2a1 100644
--- a/addons/web/views/webclient_templates.xml
+++ b/addons/web/views/webclient_templates.xml
@@ -73,7 +73,6 @@
-
diff --git a/openerp/addons/test_new_api/__openerp__.py b/openerp/addons/test_new_api/__openerp__.py
index 60041bd0f3f..e238f37f779 100644
--- a/openerp/addons/test_new_api/__openerp__.py
+++ b/openerp/addons/test_new_api/__openerp__.py
@@ -4,12 +4,13 @@
'version': '1.0',
'category': 'Tests',
'description': """A module to test the API.""",
- 'depends': ['base', 'web'],
+ 'depends': ['base', 'web', 'web_tour'],
'installable': True,
'auto_install': False,
'data': [
'ir.model.access.csv',
'views.xml',
'demo_data.xml',
+ 'template.xml',
],
}
diff --git a/openerp/addons/test_new_api/static/test/x2many.js b/openerp/addons/test_new_api/static/test/x2many.js
new file mode 100644
index 00000000000..d26eedcd0f6
--- /dev/null
+++ b/openerp/addons/test_new_api/static/test/x2many.js
@@ -0,0 +1,458 @@
+odoo.define('web.test.x2many', function (require) {
+ 'use strict';
+
+ var tour = require("web_tour.tour");
+ var inc;
+
+ tour.register('widget_x2many', {
+ url: '/web?debug=assets#action=test_new_api.action_discussions',
+ test: true,
+ }, [{
+ content: "wait web client",
+ trigger: '.breadcrumb:contains(Discussions)',
+ }, { // create test discussion
+ content: "create new discussion",
+ trigger: 'button.o_list_button_add',
+ }, {
+ content: "insert content",
+ trigger: 'input.o_form_required',
+ run: 'text test',
+ }, { // try to add a user with one2many form
+ content: "click on moderator one2many drop down",
+ trigger: 'tr:contains(Moderator) .o_form_input_dropdown > input',
+ run: 'click',
+ }, {
+ content: "click on 'Create and Edit...'",
+ trigger: '.ui-autocomplete .o_m2o_dropdown_option:last',
+ }, {
+ content: "insert a name into the modal form",
+ trigger: 'input.o_form_field.o_form_required:first',
+ extra_trigger: '.modal:visible',
+ run: function (action_helper) {
+ action_helper.text('user_test_' + (inc = new Date().getTime()));
+ }
+ }, {
+ content: "insert an email into the modal form",
+ extra_trigger: 'input.o_form_field.o_form_required:propValueContains(user_test)',
+ trigger: 'input.o_form_field.o_form_required:eq(1)',
+ run: function (action_helper) {
+ action_helper.text('user_test_' + inc + '@test');
+ }
+ }, {
+ content: "save the modal content and create the new moderator",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: 'input.o_form_field.o_form_required:propValueContains(@test)',
+ }, {
+ content: "check if the modal is saved",
+ trigger: 'tr:contains(Moderator) .o_form_field_many2one input:propValueContains(user_test)',
+ run: function () {}, // it's a check
+ }, {
+ content: "check the onchange from the o2m to the m2m",
+ trigger: '.o_content:has(.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr td:contains(user_test))',
+ run: function () {}, // it's a check
+ }, { // add ourself as participant
+ content: "change tab to Participants",
+ trigger: '[data-toggle="tab"]:contains(Participants)'
+ }, {
+ content: "click to add participants",
+ trigger: '.tab-pane:eq(2).active .o_form_field_x2many_list_row_add a'
+ }, {
+ content: "select Admin",
+ trigger: 'tr:has(td[data-field="name"]:containsExact(Administrator)) .o_list_record_selector input[type="checkbox"]'
+ }, {
+ content: "save selected participants",
+ trigger: '.o_selectcreatepopup_search_select',
+ extra_trigger: 'tr:has(td[data-field="name"]:containsExact(Administrator)) .o_list_record_selector input[type="checkbox"]:propChecked',
+ }, { // save
+ content: "save discussion",
+ trigger: 'button.o_form_button_save',
+ extra_trigger: '.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(Administrator))',
+ }, { // edit
+ content: "edit discussion",
+ trigger: 'button.o_form_button_edit',
+ }, { // add message a
+ content: "Select First Tab",
+ trigger: 'a[role=tab]:first',
+ }, {
+ content: "create new message a",
+ trigger: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
+ }, {
+ content: "insert body a",
+ trigger: 'textarea.o_form_textarea[name="body"]',
+ run: 'text a',
+ }, {
+ content: "save new message a",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: '.modal textarea.o_form_textarea[name="body"]:propValue(a)',
+ }, { // add message b
+ content: "create new message b",
+ trigger: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a',
+ extra_trigger: '.o_web_client:has(textarea[name="message_concat"]:propValue([test] Administrator:a))',
+ }, {
+ content: "insert body b",
+ trigger: 'textarea.o_form_textarea[name="body"]',
+ run: 'text b',
+ }, {
+ content: "save new message b",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: 'textarea.o_form_textarea[name="body"]:propValue(b)',
+ }, { // change content to trigger on change
+ content: "insert content",
+ trigger: 'input.o_form_required',
+ extra_trigger: 'textarea[name="message_concat"]:propValue([test] Administrator:a\n[test] Administrator:b)',
+ run: 'text test_trigger',
+ }, {
+ content: "blur the content field",
+ trigger: '.o_form_field_many2one input:first',
+ extra_trigger: 'input.o_form_required:propValue(test_trigger)',
+ }, {
+ content: "check onchange",
+ trigger: 'textarea[name="message_concat"]:propValue([test_trigger] Administrator:a\n[test_trigger] Administrator:b)',
+ run: function () {},
+ }, { // change message b
+ content: "edit message b",
+ trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(b)',
+ extra_trigger: 'body:not(:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2))) .tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains([test_trigger] )',
+ }, {
+ content: "change the body",
+ trigger: 'textarea.o_form_textarea[name="body"]',
+ run: 'text bbb',
+ }, {
+ content: "save changes",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: 'textarea.o_form_textarea[name="body"]:propValue(bbb)',
+ }, { // add message c
+ content: "create new message c",
+ trigger: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a',
+ extra_trigger: 'textarea[name="message_concat"]:propValue([test_trigger] Administrator:a\n[test_trigger] Administrator:bbb)',
+ }, {
+ content: "insert body",
+ trigger: 'textarea.o_form_textarea[name="body"]',
+ run: 'text c',
+ }, {
+ content: "save new message c",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: 'textarea.o_form_textarea[name="body"]:propValue(c)',
+ }, { // add participants
+ content: "change tab to Participants",
+ trigger: '[data-toggle="tab"]:contains(Participants)',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ }, {
+ content: "click to add participants",
+ trigger: '.tab-pane:eq(2).active .o_form_field_x2many_list_row_add a',
+ }, {
+ content: "select Demo User",
+ trigger: 'tr:has(td[data-field="name"]:containsExact(Demo User)) .o_list_record_selector input[type="checkbox"]',
+ }, {
+ content: "save selected participants",
+ trigger: '.o_selectcreatepopup_search_select',
+ extra_trigger: 'tr:has(td[data-field="name"]:containsExact(Demo User)) .o_list_record_selector input[type="checkbox"]:propChecked',
+ }, { // save
+ content: "save discussion",
+ trigger: 'button.o_form_button_save',
+ extra_trigger: 'body:not(:has(.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3))) .tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ }, { // check saved data
+ content: "check data 1",
+ trigger: '.o_content:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2))',
+ extra_trigger: 'body:not(:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)))',
+ run: function () {}, // it's a check
+ }, {
+ content: "check data 2",
+ trigger: '.o_content:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tr:has(td:containsExact(bbb)):has(td:containsExact([test_trigger] Administrator)))',
+ run: function () {}, // it's a check
+ }, {
+ content: "check data 3",
+ trigger: '.o_content:has(.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2))',
+ extra_trigger: 'body:not(:has(.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)))',
+ run: function () {}, // it's a check
+ }, { // edit
+ content: "edit discussion",
+ trigger: 'button.o_form_button_edit',
+ }, {
+ content: "change tab to Messages",
+ trigger: '[data-toggle="tab"]:contains(Messages)',
+ extra_trigger: '.o_form_editable',
+ }, { // add message d
+ content: "create new message d",
+ trigger: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a',
+ extra_trigger: 'li.active a[data-toggle="tab"]:contains(Messages)',
+ }, {
+ content: "insert body",
+ trigger: 'textarea.o_form_textarea[name="body"]',
+ run: 'text d',
+ }, {
+ content: "save new message d",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: 'textarea.o_form_textarea[name="body"]:propValue(d)',
+ }, { // add message e
+ content: "create new message e",
+ trigger: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(d)',
+ }, {
+ content: "insert body",
+ trigger: 'textarea.o_form_textarea[name="body"]',
+ run: 'text e',
+ }, {
+ content: "save new message e",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: 'textarea.o_form_textarea[name="body"]:propValue(e)',
+ }, { // change message a
+ content: "edit message a",
+ trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(a)',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(e)',
+ }, {
+ content: "change the body",
+ trigger: 'textarea.o_form_textarea[name="body"]',
+ run: 'text aaa',
+ }, {
+ content: "save changes",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: 'textarea.o_form_textarea[name="body"]:propValue(aaa)',
+ }, { // change message e
+ content: "edit message e",
+ trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(e)',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains(aaa)',
+ }, {
+ content: "open the many2one to select another user",
+ trigger: '.o_form_input_dropdown > input',
+ run: 'text Demo',
+ }, {
+ content: "select another user",
+ trigger: '.ui-autocomplete li:contains(Demo User)',
+ in_modal: false,
+ }, {
+ content: "test one2many's line onchange after many2one",
+ trigger: '.o_form_field:contains([test_trigger] Demo User)',
+ run: function () {}, // it's a check
+ }, {
+ content: "test one2many field not triggered onchange",
+ trigger: 'textarea[name="message_concat"]:propValueContains([test_trigger] Administrator:e)',
+ in_modal: false,
+ run: function () {}, // don't change texarea content
+ }, {
+ content: "save changes",
+ trigger: '.modal-footer button:contains(Save):contains(Close)'
+ }, {
+ content: "test one2many triggered the onchange on save for the line",
+ trigger: '.o_content:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td.o_readonly:contains([test_trigger] Demo User))',
+ run: function () {}, // it's a check
+ }, {
+ content: "test one2many triggered the onchange on save",
+ trigger: 'textarea[name="message_concat"]:propValueContains([test_trigger] Demo User:e)',
+ run: function () {}, // don't change texarea content
+ }, { // remove
+ content: "remove b",
+ trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(bbb)) .o_list_record_delete',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains(aaa)',
+ }, {
+ content: "remove e",
+ trigger: 'tr:has(td:containsExact(e)) .o_list_record_delete',
+ extra_trigger: 'body:not(:has(tr:has(td:containsExact(bbb))))',
+ }, { // save
+ content: "save discussion",
+ trigger: 'button.o_form_button_save',
+ extra_trigger: 'body:not(:has(tr:has(td:containsExact(e))))',
+ }, { // check saved data
+ content: "check data 4",
+ trigger: '.o_content:not(:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(.o_list_record_delete):eq(4)))',
+ run: function () {}, // it's a check
+ }, {
+ content: "check data 5",
+ trigger: '.o_content:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(aaa)):has(tr td:containsExact(c)):has(tr td:containsExact(d)))',
+ run: function () {}, // it's a check
+ }, {
+ content: "check data 6",
+ trigger: '.o_content:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact([test_trigger] Administrator)):has(td:containsExact(aaa)))',
+ run: function () {}, // it's a check
+ }, {
+ content: "check data 7",
+ trigger: '.o_content:has(.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2))',
+ extra_trigger: '.o_content:not(:has(.tab-pane:eq(2) .o_form_field.o_view_manager_content tbody tr[date-id]:eq(3)))',
+ run: function () {}, // it's a check
+ }, { // edit
+ content: "edit discussion",
+ trigger: 'button.o_form_button_edit',
+ }, { // add message ddd
+ content: "create new message ddd",
+ trigger: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(d))',
+ }, {
+ content: "select another user",
+ trigger: '.o_form_field_many2one .o_form_input_dropdown > input',
+ extra_trigger: 'body:has(.modal) .tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(d))',
+ run: 'text Demo',
+ }, {
+ content: "select demo user",
+ trigger: '.ui-autocomplete li a:contains(Demo User)',
+ in_modal: false,
+ }, {
+ content: "test one2many's line onchange after many2one",
+ trigger: '.o_form_field:contains([test_trigger] Demo User)',
+ run: function () {}, // it's a check
+ }, {
+ content: "insert body",
+ trigger: 'textarea.o_form_textarea[name="body"]',
+ run: 'text ddd',
+ }, {
+ content: "save new message ddd",
+ trigger: '.modal-footer button:contains(Save)',
+ extra_trigger: 'textarea.o_form_textarea[name="body"]:propValue(ddd)',
+ }, { // trigger onchange
+ content: "blur the one2many",
+ trigger: 'input.o_form_required',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(ddd))',
+ }, { // check onchange data
+ content: "check data 8",
+ trigger: 'textarea[name="message_concat"]:propValueContains([test_trigger] Administrator:aaa\n[test_trigger] Administrator:c\n[test_trigger] Administrator:d\n[test_trigger] Demo User:ddd)',
+ run: function () {}, // don't change texarea content
+ }, {
+ content: "check data 9",
+ trigger: '.o_content:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3))',
+ extra_trigger: 'body:not(:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(4)))',
+ run: function () {}, // it's a check
+ }, { // cancel
+ content: "cancel change",
+ trigger: '.o_cp_buttons .o_form_button_cancel',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(ddd))',
+ run: 'click',
+ }, {
+ content: "confirm cancel change",
+ trigger: '.modal-footer button:contains(Ok)',
+ },
+
+ /////////////////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////////////////////
+
+ {
+ content: "switch to the second form view to test one2many with editable list (toggle menu dropdown)",
+ trigger: '.o_sub_menu .oe_secondary_submenu .oe_menu_leaf .oe_menu_text:containsExact(Discussions)',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ edition: 'community'
+ }, {
+ content: "switch to the second form view to test one2many with editable list (toggle menu dropdown)",
+ trigger: 'nav .o_menu_sections li a:containsExact(Discussions)',
+ extra_trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ edition: 'enterprise'
+ }, {
+ content: "switch to the second form view to test one2many with editable list (open submenu)",
+ trigger: '.o_sub_menu .oe_secondary_submenu .oe_menu_leaf .oe_menu_text:contains(Discussions 2)',
+ edition: 'community'
+ }, {
+ content: "switch to the second form view to test one2many with editable list (open submenu)",
+ trigger: 'nav .o_menu_sections ul li a:contains(Discussions 2)',
+ edition: 'enterprise'
+ }, {
+ content: "select previous created record",
+ trigger: 'td[data-field="name"]:contains(test_trigger):last',
+ extra_trigger: '.breadcrumb li:containsExact(Discussions 2)',
+ }, {
+ content: "click on edit",
+ trigger: '.o_cp_buttons .o_form_button_edit',
+ }, {
+ content: "edit content",
+ trigger: 'input.o_form_required',
+ extra_trigger: ".o_form_editable",
+ run: 'text test_trigger2'
+ }, {
+ content: "click outside to trigger onchange",
+ trigger: '.o_form_sheet',
+ }, {
+ content: "click on a field of the editable list to edit content",
+ trigger: '.o_list_editable tr[data-id]:eq(1) td',
+ extra_trigger: '.o_list_editable:contains(test_trigger2)',
+ }, {
+ content: "change text value",
+ trigger: '.o_list_editable_form textarea.o_form_field[data-fieldname="body"]',
+ run: 'text ccc'
+ }, {
+ content: "click on other field (trigger the line onchange)",
+ trigger: '.o_list_editable_form .o_form_field_many2one[data-fieldname="author"] input',
+ run: 'click'
+ }, {
+ content: "test one2many's line onchange",
+ trigger: '.o_list_editable_form .o_form_field[data-fieldname="size"]:contains(3)',
+ run: function () {}, // don't blur the many2one
+ }, {
+ content: "test one2many field not triggered onchange",
+ trigger: '.o_content:not(:has(textarea[name="message_concat"]:propValueContains(ccc)))',
+ run: function () {}, // don't blur the many2one
+ }, {
+ content: "open the many2one to select an other user",
+ trigger: '.o_list_editable_form .o_form_field_many2one .o_form_input_dropdown > input',
+ run: 'text Demo',
+ }, {
+ content: "select an other user",
+ trigger: '.ui-autocomplete li a:contains(Demo User)',
+ }, {
+ content: "test one2many's line onchange after many2one",
+ trigger: '.o_list_editable_form span.o_form_field:contains([test_trigger2] Demo User)',
+ run: function () {}, // don't blur the many2one
+ }, {
+ content: "test one2many field not triggered onchange",
+ trigger: '.o_content:not(:has(textarea[name="message_concat"]:propValueContains(ccc)))',
+ run: function () {}, // don't blur the many2one
+ }, {
+ content: "change text value",
+ trigger: 'textarea.o_form_field[data-fieldname="body"]',
+ run: 'text ccccc',
+ }, { // check onchange
+ content: "click outside to trigger one2many onchange",
+ trigger: 'input.o_form_required',
+ extra_trigger: 'body:not(:has(textarea[name="message_concat"]:propValueContains(Demo User)))',
+ run: 'click'
+ }, {
+ content: "test one2many onchange",
+ trigger: 'textarea[name="message_concat"]:propValueContains([test_trigger2] Demo User:ccccc)',
+ run: function () {}, // don't change texarea content
+ }, {
+ content: "click outside to trigger one2many onchange",
+ trigger: '.o_form_field_many2manytags .o_form_input_dropdown > input',
+ }, {
+ content: "add a tag",
+ trigger: '.ui-autocomplete a:first',
+ }, { // remove record
+ content: "delete the last item in the editable list",
+ trigger: '.o_list_view tr[data-id] td.o_list_record_delete span:visible:last',
+ }, {
+ content: "test one2many onchange after delete",
+ trigger: '.o_content:not(:has(textarea[name="message_concat"]:propValueContains(Administrator:d)))',
+ run: function () {},
+ }, { // save
+ content: "save discussion",
+ trigger: 'button.o_form_button_save',
+ extra_trigger: 'body:not(:has(tr:has(td:containsExact(d))))',
+ }, { // check saved data
+ content: "check data 10",
+ trigger: '.o_form_textarea:containsExact([test_trigger2] Administrator:aaa\n[test_trigger2] Demo User:ccccc)',
+ run: function () {}, // don't change texarea content
+ }, {
+ content: "check data 11",
+ trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(1)',
+ extra_trigger: 'body:not(:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)))',
+ run: function () {},
+ }, { // edit
+ content: "edit discussion",
+ trigger: 'button.o_form_button_edit'
+ }, { // add message eee
+ content: "create new message eee",
+ trigger: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a',
+ extra_trigger: 'li.active a[data-toggle="tab"]:contains(Messages)',
+ }, {
+ content: "change text value",
+ trigger: 'textarea.o_form_field[data-fieldname="body"]',
+ run: 'text eee'
+ }, { // save
+ content: "save discussion",
+ trigger: 'button.o_form_button_save',
+ extra_trigger: 'textarea.o_form_field[data-fieldname="body"]:propValueContains(eee)',
+ }, { // check saved data
+ content: "check data 12",
+ trigger: '.o_form_textarea:containsExact([test_trigger2] Administrator:aaa\n[test_trigger2] Demo User:ccccc\n[test_trigger2] Administrator:eee)',
+ run: function () {}, // it's a check
+ }, {
+ content: "check data 13",
+ trigger: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ extra_trigger: 'body:not(:has(.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)))',
+ run: function () {}, // it's a check
+ }]);
+});
diff --git a/openerp/addons/test_new_api/template.xml b/openerp/addons/test_new_api/template.xml
new file mode 100644
index 00000000000..5a9a01dc71d
--- /dev/null
+++ b/openerp/addons/test_new_api/template.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/openerp/addons/test_new_api/tests/test_ui.py b/openerp/addons/test_new_api/tests/test_ui.py
index 9e68c932e2d..ccaa8d1dfc0 100644
--- a/openerp/addons/test_new_api/tests/test_ui.py
+++ b/openerp/addons/test_new_api/tests/test_ui.py
@@ -1,10 +1,11 @@
-import openerp.tests
+import odoo.tests
+
+class TestUi(odoo.tests.HttpCase):
+ post_install = True
+ at_install = False
-@openerp.tests.common.at_install(False)
-@openerp.tests.common.post_install(True)
-class TestUi(openerp.tests.HttpCase):
def test_01_admin_widget_x2many(self):
self.phantom_js("/web#action=test_new_api.action_discussions",
- "odoo.__DEBUG__.services['web.Tour'].run('widget_x2many', 'test')",
- "odoo.__DEBUG__.services['web.Tour'].tours.widget_x2many",
- login="admin")
+ "odoo.__DEBUG__.services['web_tour.tour'].run('widget_x2many', 100)",
+ "odoo.__DEBUG__.services['web_tour.tour'].tours.widget_x2many.ready",
+ login="admin", timeout=120)