From e17e07030db3e4e9d5907cc00905e224190e5d25 Mon Sep 17 00:00:00 2001 From: Julien Banken Date: Mon, 14 Jun 2021 12:02:50 +0000 Subject: [PATCH] [IMP] website_event_exhibitor: use a POST method to set the tag filters PURPOSE It has been reported that the page showing the exhibitors is slow because of the partner table used behind the scene. It turns out that the page can generate many links for the filters which can trick the crawlers to explore them all. As the page is slow, the crawlers can put a high pressure on the server by exploring those links. SPECS - Use a POST method to set the tag filters. By using a POST method, the page will not longer generate links and the crawlers will no longer explore them. This technique is actually more reliable than simply defining a `rel="nofollow"` rule on the links. LINKS Task id: 2466072 closes odoo/odoo#68192 Signed-off-by: Thibault Delavallee (tde) --- .../website_event_exhibitor/__manifest__.py | 1 + .../controllers/exhibitor.py | 24 +++-- .../models/event_sponsor.py | 2 +- .../static/src/js/event_sponsor_search.js | 69 +++++++++++++++ .../src/scss/event_exhibitor_templates.scss | 4 + .../views/event_exhibitor_templates_list.xml | 87 ++++++++++--------- 6 files changed, 133 insertions(+), 54 deletions(-) create mode 100644 addons/website_event_exhibitor/static/src/js/event_sponsor_search.js diff --git a/addons/website_event_exhibitor/__manifest__.py b/addons/website_event_exhibitor/__manifest__.py index 521fa6c1140..5991e662488 100644 --- a/addons/website_event_exhibitor/__manifest__.py +++ b/addons/website_event_exhibitor/__manifest__.py @@ -37,6 +37,7 @@ 'website_event_exhibitor/static/src/scss/event_templates_sponsor.scss', 'website_event_exhibitor/static/src/scss/event_exhibitor_templates.scss', 'website_event_exhibitor/static/src/js/event_exhibitor_connect.js', + 'website_event_exhibitor/static/src/js/event_sponsor_search.js', ], } } diff --git a/addons/website_event_exhibitor/controllers/exhibitor.py b/addons/website_event_exhibitor/controllers/exhibitor.py index e0bb980040d..e141d2a78e6 100644 --- a/addons/website_event_exhibitor/controllers/exhibitor.py +++ b/addons/website_event_exhibitor/controllers/exhibitor.py @@ -32,7 +32,7 @@ class ExhibitorController(WebsiteEventController): '/event//exhibitors', # TDE BACKWARD: matches event/event-1/exhibitor/exhib-1 sub domain '/event//exhibitor' - ], type='http', auth="public", website=True, sitemap=False) + ], type='http', auth="public", website=True, sitemap=False, methods=['GET', 'POST']) def event_exhibitors(self, event, **searches): return request.render( "website_event_exhibitor.event_exhibitors", @@ -209,22 +209,20 @@ class ExhibitorController(WebsiteEventController): def _get_search_countries(self, country_search): # TDE FIXME: make me generic (slides, event, ...) + country_ids = set(request.httprequest.form.getlist('sponsor_country')) try: - country_ids = literal_eval(country_search) + country_ids.update(literal_eval(country_search)) except Exception: - countries = request.env['res.country'].sudo() - else: - # perform a search to filter on existing / valid tags implicitly - countries = request.env['res.country'].sudo().search([('id', 'in', country_ids)]) - return countries + pass + # perform a search to filter on existing / valid tags implicitly + return request.env['res.country'].sudo().search([('id', 'in', list(country_ids))]) def _get_search_sponsorships(self, sponsorship_search): # TDE FIXME: make me generic (slides, event, ...) + sponsorship_ids = set(request.httprequest.form.getlist('sponsor_type')) try: - sponsorship_ids = literal_eval(sponsorship_search) + sponsorship_ids.update(literal_eval(sponsorship_search)) except Exception: - sponsorships = request.env['event.sponsor.type'].sudo() - else: - # perform a search to filter on existing / valid tags implicitly - sponsorships = request.env['event.sponsor.type'].sudo().search([('id', 'in', sponsorship_ids)]) - return sponsorships + pass + # perform a search to filter on existing / valid tags implicitly + return request.env['event.sponsor.type'].sudo().search([('id', 'in', list(sponsorship_ids))]) diff --git a/addons/website_event_exhibitor/models/event_sponsor.py b/addons/website_event_exhibitor/models/event_sponsor.py index 8d3798283fa..10a7d047d33 100644 --- a/addons/website_event_exhibitor/models/event_sponsor.py +++ b/addons/website_event_exhibitor/models/event_sponsor.py @@ -31,7 +31,7 @@ class Sponsor(models.Model): event_id = fields.Many2one('event.event', 'Event', required=True) sponsor_type_id = fields.Many2one( 'event.sponsor.type', 'Sponsoring Level', - default=lambda self: self._default_sponsor_type_id(), required=True) + default=lambda self: self._default_sponsor_type_id(), required=True, auto_join=True) url = fields.Char('Sponsor Website', compute='_compute_url', readonly=False, store=True) sequence = fields.Integer('Sequence') active = fields.Boolean(default=True) diff --git a/addons/website_event_exhibitor/static/src/js/event_sponsor_search.js b/addons/website_event_exhibitor/static/src/js/event_sponsor_search.js new file mode 100644 index 00000000000..192ab4e77f1 --- /dev/null +++ b/addons/website_event_exhibitor/static/src/js/event_sponsor_search.js @@ -0,0 +1,69 @@ +odoo.define('website_event_exhibitor.event_sponsor_search', function (require) { +'use strict'; + +const publicWidget = require('web.public.widget'); +publicWidget.registry.websiteEventSearchSponsor = publicWidget.Widget.extend({ + + selector: '.o_wesponsor_index', + events: { + 'click .o_wevent_event_search_box .btn': '_onSearch', + 'click .o_search_tag .btn': '_onTagRemove', + 'click .o_dropdown_reset_tags': '_onTagReset', + 'change .o_wevent_event_tags_form input': '_onTagAdd', + }, + + start: function () { + this.form = this.$el.find('.o_wevent_event_tags_form'); + return this._super.apply(this, arguments); + }, + + _onSearch: function () { + const input = this.$el.find('.o_wevent_event_search_box input'); + const params = new URLSearchParams(window.location.search); + params.set('search', input.val()); + const url = window.location.pathname + '?' + params.toString(); + this.form.attr('action', url); + this.form.submit(); + }, + + _onTagAdd: function () { + this.form.submit(); + }, + + _onTagRemove: function (event) { + const tag = $(event.target).parent(); + const data = tag.data(); + const selector = 'input[name="' + data.field + '"][value="' + data.value + '"]'; + this._updateFormActionURL(data); + this.form.find(selector).prop('checked', false); + this.form.submit(); + }, + + _onTagReset: function (event) { + const dropdown = $(event.target).parent(); + dropdown.find('input').prop('checked', false); + this.form.submit(); + }, + + _updateFormActionURL: function (data) { + const mapping = new Map([ + ['sponsor_country', 'countries'], + ['sponsor_type', 'sponsorships'] + ]); + if (!mapping.has(data.field)) { + return + } + const name = mapping.get(data.field); + const params = new URLSearchParams(window.location.search); + try { + const ids = JSON.parse(params.get(name)); + params.set(name, JSON.stringify(ids.filter(id => id !== data.value))); + this.form.attr('action', `${window.location.href.split('?')[0]}?${params.toString()}`); + } catch (e) { + return; + } + }, +}); + +return publicWidget.registry.websiteEventSearchSponsor; +}); diff --git a/addons/website_event_exhibitor/static/src/scss/event_exhibitor_templates.scss b/addons/website_event_exhibitor/static/src/scss/event_exhibitor_templates.scss index 86836d3b0c9..6e2d39536fb 100644 --- a/addons/website_event_exhibitor/static/src/scss/event_exhibitor_templates.scss +++ b/addons/website_event_exhibitor/static/src/scss/event_exhibitor_templates.scss @@ -9,6 +9,10 @@ opacity: 0.8; } + .o_wesponsor_topbar_filters .dropdown-item { + cursor: pointer; + } + /* * MAIN PAGE: LIST */ diff --git a/addons/website_event_exhibitor/views/event_exhibitor_templates_list.xml b/addons/website_event_exhibitor/views/event_exhibitor_templates_list.xml index 04f898482ee..52423d57acc 100644 --- a/addons/website_event_exhibitor/views/event_exhibitor_templates_list.xml +++ b/addons/website_event_exhibitor/views/event_exhibitor_templates_list.xml @@ -30,17 +30,18 @@ -