diff --git a/addons/website/static/src/components/views/page_list.js b/addons/website/static/src/components/views/page_list.js index 71ec551b867..722caf7f537 100644 --- a/addons/website/static/src/components/views/page_list.js +++ b/addons/website/static/src/components/views/page_list.js @@ -6,7 +6,6 @@ import {PageSearchModel} from "./page_search_model"; import {registry} from '@web/core/registry'; import {listView} from '@web/views/list/list_view'; import {ConfirmationDialog} from "@web/core/confirmation_dialog/confirmation_dialog"; -import {useService} from "@web/core/utils/hooks"; import {DeletePageDialog, DuplicatePageDialog} from '@website/components/dialog/page_properties'; import {CheckboxItem} from "@web/core/dropdown/checkbox_item"; @@ -17,7 +16,6 @@ export class PageListController extends PageControllerMixin(listView.Controller) */ setup() { super.setup(); - this.orm = useService('orm'); if (this.props.resModel === "website.page") { this.archiveEnabled = false; } diff --git a/addons/website/static/src/components/views/page_search_model.js b/addons/website/static/src/components/views/page_search_model.js index ddb03dfa456..0eba2fd565f 100644 --- a/addons/website/static/src/components/views/page_search_model.js +++ b/addons/website/static/src/components/views/page_search_model.js @@ -21,8 +21,8 @@ export class PageSearchModel extends SearchModel { // Before the searchModel performs its DB search call, append the // website domain to the search domain. await this.website.fetchWebsites(); - const website = this.website.currentWebsite || this.website.websites[0]; - this.notifyWebsiteChange(website.id); + const website = await this.getCurrentWebsite(); + await this.notifyWebsiteChange(website.id); }); } @@ -87,4 +87,17 @@ export class PageSearchModel extends SearchModel { this.pagesState.websiteDomain = websiteDomain; this._notify(); } + + /** + * Retrieves the current website. + * + * @returns {Object} The current website. + */ + async getCurrentWebsite() { + const currentWebsite = (await this.orm.call('website', 'get_current_website')).match(/\d+/); + if (currentWebsite) { + return this.website.websites.find(w => w.id === parseInt(currentWebsite[0])); + } + return this.website.websites[0]; + } } diff --git a/addons/website/static/src/components/views/page_views_mixin.js b/addons/website/static/src/components/views/page_views_mixin.js index cfcda5cce9d..3007fecc080 100644 --- a/addons/website/static/src/components/views/page_views_mixin.js +++ b/addons/website/static/src/components/views/page_views_mixin.js @@ -21,6 +21,7 @@ export const PageControllerMixin = (component) => class extends component { this.website = useService('website'); this.dialog = useService('dialog'); this.rpc = useService('rpc'); + this.orm = useService('orm'); this.websiteSelection = odoo.debug ? [{id: 0, name: _t("All Websites")}] : []; @@ -29,9 +30,9 @@ export const PageControllerMixin = (component) => class extends component { }); onWillStart(async () => { - await this.website.fetchWebsites(); + // `fetchWebsites()` already done by parent PageSearchModel this.websiteSelection.push(...this.website.websites); - this.state.activeWebsite = this.website.currentWebsite || this.website.websites[0]; + this.state.activeWebsite = await this.env.searchModel.getCurrentWebsite(); }); } diff --git a/addons/website/static/src/js/tours/tour_utils.js b/addons/website/static/src/js/tours/tour_utils.js index 6ad171b066b..19fe57e05fd 100644 --- a/addons/website/static/src/js/tours/tour_utils.js +++ b/addons/website/static/src/js/tours/tour_utils.js @@ -420,6 +420,31 @@ function selectElementInWeSelectWidget(widgetName, elementName, searchNeeded = f return steps; } +/** + * Switches to a different website by clicking on the website switcher. + * + * @param {number} websiteId - The ID of the website to switch to. + * @param {string} websiteName - The name of the website to switch to. + * @returns {Array} - The steps required to perform the website switch. + */ +function switchWebsite(websiteId, websiteName) { + return [{ + content: `Click on the website switch to switch to website '${websiteName}'`, + trigger: '.o_website_switcher_container button', + }, { + content: `Switch to website '${websiteName}'`, + extra_trigger: `iframe html:not([data-website-id="${websiteId}"])`, + trigger: `.o_website_switcher_container .dropdown-item:contains("${websiteName}")`, + }, { + content: "Wait for the iframe to be loaded", + // The page reload generates assets for the new website, it may take + // some time + timeout: 20000, + trigger: `iframe html[data-website-id="${websiteId}"]`, + isCheck: true, + }]; +} + export default { addMedia, assertCssVariable, @@ -431,22 +456,23 @@ export default { changeImage, changeOption, changePaddingSize, - clickOnElement, clickOnEditAndWaitEditMode, + clickOnElement, + clickOnExtraMenuItem, clickOnSave, clickOnSnippet, clickOnText, dragNDrop, + getClientActionUrl, goBackToBlocks, goToTheme, + registerBackendAndFrontendTour, + registerThemeHomepageTour, + registerWebsitePreviewTour, selectColorPalette, + selectElementInWeSelectWidget, selectHeader, selectNested, selectSnippetColumn, - getClientActionUrl, - registerThemeHomepageTour, - clickOnExtraMenuItem, - registerWebsitePreviewTour, - registerBackendAndFrontendTour, - selectElementInWeSelectWidget, + switchWebsite, }; diff --git a/addons/website/static/tests/tours/page_manager.js b/addons/website/static/tests/tours/page_manager.js index 7134c071fa4..ef86f6526b3 100644 --- a/addons/website/static/tests/tours/page_manager.js +++ b/addons/website/static/tests/tours/page_manager.js @@ -1,6 +1,7 @@ /** @odoo-module **/ import wTourUtils from '@website/js/tours/tour_utils'; +import { registry } from "@web/core/registry"; // TODO: This part should be moved in a QUnit test const checkKanbanGroupBy = [{ @@ -107,3 +108,43 @@ wTourUtils.registerWebsitePreviewTour('website_page_manager', { run: () => null, }, ]); + +wTourUtils.registerWebsitePreviewTour('website_page_manager_session_forced', { + test: true, + url: '/', +}, () => [...wTourUtils.switchWebsite(2, 'My Website 2'), { + content: "Click on Site", + trigger: 'button.dropdown-toggle[data-menu-xmlid="website.menu_site"]', +}, { + content: "Click on Pages", + trigger: 'a.dropdown-item[data-menu-xmlid="website.menu_website_pages_list"]', +}, { + content: "Check that the homepage is the one of My Website 2", + trigger: ".o_list_table .o_data_row .o_data_cell[name=name]:contains('Home') " + + "~ .o_data_cell[name=website_id]:contains('My Website 2')", + run: () => null, // it's a check +}, { + content: "Click on the search options", + trigger: ".o_searchview_dropdown_toggler", +}, { + content: "Check that the selected website is My Website 2", + trigger: ".o_dropdown_container.o_website_menu > .dropdown-item:contains('My Website 2')", + run: () => null, // it's a check +}]); + +registry.category("web_tour.tours").add('website_page_manager_direct_access', { + test: true, + url: '/web#action=website.action_website_pages_list', + steps: () => [{ + content: "Check that the homepage is the one of My Website 2", + trigger: ".o_list_table .o_data_row .o_data_cell[name=name]:contains('Home') " + + "~ .o_data_cell[name=website_id]:contains('My Website 2')", + run: () => null, // it's a check +}, { + content: "Click on the search options", + trigger: ".o_searchview_dropdown_toggler", +}, { + content: "Check that the selected website is My Website 2", + trigger: ".o_dropdown_container.o_website_menu > .dropdown-item:contains('My Website 2')", + run: () => null, // it's a check +}]}); diff --git a/addons/website/static/tests/tours/snippet_cache_across_websites.js b/addons/website/static/tests/tours/snippet_cache_across_websites.js index 097be7dbfbb..b4b5d4422c7 100644 --- a/addons/website/static/tests/tours/snippet_cache_across_websites.js +++ b/addons/website/static/tests/tours/snippet_cache_across_websites.js @@ -14,23 +14,7 @@ wTourUtils.registerWebsitePreviewTour('snippet_cache_across_websites', { }, // There's no need to save, but canceling might or might not show a popup... ...wTourUtils.clickOnSave(), - { - content: "Click on the website switch to switch to website 2", - trigger: '.o_website_switcher_container button', - }, - { - content: "Switch to website 2", - // Ensure data-website-id exists - extra_trigger: 'iframe html[data-website-id="1"]', - trigger: '.o_website_switcher_container .dropdown-item:contains("My Website 2")' - }, - { - content: "Wait for the iframe to be loaded", - // The page reload generates assets for website 2, it may take some time - timeout: 20000, - trigger: 'iframe html:not([data-website-id="1"])', - run: () => null, - }, + ...wTourUtils.switchWebsite(2, 'My Website 2'), ...wTourUtils.clickOnEditAndWaitEditMode(), { content: "Check that the custom snippet is not here", diff --git a/addons/website/tests/test_page_manager.py b/addons/website/tests/test_page_manager.py index 92e6e6da287..b34a5abd879 100644 --- a/addons/website/tests/test_page_manager.py +++ b/addons/website/tests/test_page_manager.py @@ -3,6 +3,10 @@ import odoo.tests +from odoo.tests.common import HOST +from odoo.tools import config + + @odoo.tests.common.tagged('post_install', '-at_install') class TestWebsitePageManager(odoo.tests.HttpCase): @@ -13,4 +17,10 @@ class TestWebsitePageManager(odoo.tests.HttpCase): 'domain': '', 'sequence': 20, }) - self.start_tour(self.env['website'].get_client_action_url('/'), 'website_page_manager', login="admin") + url = self.env['website'].get_client_action_url('/') + self.start_tour(url, 'website_page_manager', login="admin") + self.start_tour(url, 'website_page_manager_session_forced', login="admin") + + alternate_website = self.env['website'].search([], limit=2)[1] + alternate_website.domain = f'http://{HOST}:{config["http_port"]}' + self.start_tour('/web#action=website.action_website_pages_list', 'website_page_manager_direct_access', login='admin')