diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 3ee178d1de5..f9c7d700e15 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -224,25 +224,27 @@ class Website(Home): 'name': {'label': _('Sort by Name'), 'order': 'name'}, } # default sortby order - sort_order = searchbar_sortings.get(sortby, 'name')['order'] + sort_order = searchbar_sortings.get(sortby, 'name')['order'] + ', website_id desc' domain = request.website.website_domain() if search: domain += ['|', ('name', 'ilike', search), ('url', 'ilike', search)] - pages_count = Page.search_count(domain) + pages = Page.search(domain, order=sort_order) + if sortby != 'url': + pages = pages.filtered(pages._is_most_specific_page) + pages_count = len(pages) + step = 50 pager = portal_pager( url="/website/pages", url_args={'sortby': sortby}, total=pages_count, page=page, - step=50 + step=step ) - pages = Page.search(domain, order=sort_order, limit=50, offset=pager['offset']) - # only include pages if they are the most specific one available - pages = pages.filtered(pages._is_most_specific_page) + pages = pages[(page - 1) * step:page * step] values = { 'pager': pager, diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index df963d10fe7..2a55e609199 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -119,14 +119,11 @@ class Http(models.AbstractModel): req_page = request.httprequest.path page_domain = [('url', '=', req_page)] + request.website.website_domain() - published_domain = page_domain + [('website_published', '=', True)] - pages = request.env['website.page'].search(published_domain, order='website_id') - - if not pages: - # Since there are no published pages, try to find a page - # that could potentially be published. - unpublished_domain = page_domain + [('website_published', '=', False)] - pages = request.env['website.page'].search(unpublished_domain, order='website_id') + published_domain = page_domain + # need to bypass website_published, to apply is_most_specific + # filter later if not publisher + pages = request.env['website.page'].sudo().search(published_domain, order='website_id') + pages = pages.filtered(pages._is_most_specific_page) if not request.website.is_publisher(): pages = pages.filtered('is_visible') diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 078180676e8..5a927dec45e 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -791,13 +791,10 @@ class Page(models.Model): return most_specific_page == page_to_test @api.model - def get_page_info(self, id, website_id): - item = self.search_read( - domain=[('id', '=', id)] + self.env['website'].website_domain(website_id), - fields=['id', 'name', 'url', 'website_published', 'website_indexed', 'date_publish', 'menu_ids', 'is_homepage', 'website_id'], - limit=1 + def get_page_info(self, id): + return self.browse(id).read( + ['id', 'name', 'url', 'website_published', 'website_indexed', 'date_publish', 'menu_ids', 'is_homepage', 'website_id'], ) - return item @api.multi def get_view_identifier(self): @@ -845,16 +842,20 @@ class Page(models.Model): # Edits via the page manager shouldn't trigger the COW # mechanism and generate new pages. The user manages page # visibility manually with is_published here. - page.with_context(no_cow=True).write({ + w_vals = { 'key': page_key, 'name': data['name'], 'url': url, 'is_published': data['website_published'], - 'website_id': website.id if data['restrict_to_current_website'] else False, + 'website_id': False if data['share_page_info'] else website.id, 'website_indexed': data['website_indexed'], 'date_publish': data['date_publish'] or None, 'is_homepage': data['is_homepage'], - }) + } + # toggle is hidden to prevent user to unshare a page + if 'share_page_info' in data: + w_vals['website_id'] = False if data['share_page_info'] else website.id + page.with_context(no_cow=True).write(w_vals) # Create redirect if needed if data['create_redirect']: diff --git a/addons/website/static/src/js/menu/content.js b/addons/website/static/src/js/menu/content.js index d4fd2734c10..bcb46553b65 100644 --- a/addons/website/static/src/js/menu/content.js +++ b/addons/website/static/src/js/menu/content.js @@ -81,7 +81,7 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({ defs.push(this._rpc({ model: 'website.page', method: 'get_page_info', - args: [this.page_id, context.website_id], + args: [this.page_id], context: context, }).then(function (page) { page[0].url = _.str.startsWith(page[0].url, '/') ? page[0].url.substring(1) : page[0].url; @@ -220,7 +220,7 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({ is_menu: this.$('#is_menu').prop('checked'), is_homepage: this.$('#is_homepage').prop('checked'), website_published: this.$('#is_published').prop('checked'), - restrict_to_current_website: this.$('#restrict_to_current_website').prop('checked'), + share_page_info: this.$('#share_page_info').prop('checked'), create_redirect: this.$('#create_redirect').prop('checked'), redirect_type: this.$('#redirect_type').val(), website_indexed: this.$('#is_indexed').prop('checked'), diff --git a/addons/website/static/src/scss/website.ui.scss b/addons/website/static/src/scss/website.ui.scss index b752157cf1c..a7be7e98290 100644 --- a/addons/website/static/src/scss/website.ui.scss +++ b/addons/website/static/src/scss/website.ui.scss @@ -468,11 +468,19 @@ body .modal { background-color: $o-brand-odoo; color: white; } - td > a.fa { - margin-left: 5px; - color: $o-brand-odoo; + td, th { + padding: 0.45rem; + } + td { + > a.fa { + margin-left: 5px; + color: $o-brand-odoo; + } + .text-muted { + opacity: 0.5; + } } .fa-check, .fa-eye-slash { - color: $o-brand-primary; + color: #00a09d; } } diff --git a/addons/website/static/src/xml/website.pageProperties.xml b/addons/website/static/src/xml/website.pageProperties.xml index 39786f3449b..7ac590cda2f 100644 --- a/addons/website/static/src/xml/website.pageProperties.xml +++ b/addons/website/static/src/xml/website.pageProperties.xml @@ -88,26 +88,26 @@