diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml
index dda2fe05c90..dc477e723f6 100644
--- a/addons/website/data/website_data.xml
+++ b/addons/website/data/website_data.xml
@@ -707,6 +707,8 @@
/website/static/src/img/snippets_demo/s_popup.jpg
+
+
Countries
@@ -769,9 +771,6 @@
Countries
-
-
-
Multi-website
diff --git a/addons/website/models/website_snippet_filter.py b/addons/website/models/website_snippet_filter.py
index 6bdd648f1fd..6613a80ff45 100644
--- a/addons/website/models/website_snippet_filter.py
+++ b/addons/website/models/website_snippet_filter.py
@@ -5,6 +5,7 @@ from collections import OrderedDict
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from odoo.osv import expression
+from odoo.tools import html_escape as escape
from lxml import etree as ET
@@ -21,6 +22,10 @@ class WebsiteSnippetFilter(models.Model):
limit = fields.Integer(help='The limit is the maximum number of records retrieved', required=True)
website_id = fields.Many2one('website', string='Website', ondelete='cascade', required=True)
+ @api.model
+ def escape_falsy_as_empty(self, s):
+ return escape(s) if s else ''
+
@api.constrains('action_server_id', 'filter_id')
def _check_data_source_is_provided(self):
for record in self:
@@ -115,9 +120,9 @@ class WebsiteSnippetFilter(models.Model):
field = model._fields.get(field_name)
field_widget = field_widget or field.type
if field.type == 'binary':
- data['image_fields'][field_name] = Website.image_url(record, field_name)
+ data['image_fields'][field_name] = self.escape_falsy_as_empty(Website.image_url(record, field_name))
elif field_widget == 'image':
- data['image_fields'][field_name] = record[field_name]
+ data['image_fields'][field_name] = self.escape_falsy_as_empty(record[field_name])
elif field_widget == 'monetary':
FieldMonetary = self.env['ir.qweb.field.monetary']
model_currency = None
@@ -137,11 +142,11 @@ class WebsiteSnippetFilter(models.Model):
{'display_currency': website_currency}
)
else:
- data['fields'][field_name] = record[field_name]
+ data['fields'][field_name] = self.escape_falsy_as_empty(record[field_name])
elif ('ir.qweb.field.%s' % field_widget) in self.env:
data['fields'][field_name] = self.env[('ir.qweb.field.%s' % field_widget)].record_to_html(record, field_name, {})
else:
- data['fields'][field_name] = record[field_name]
+ data['fields'][field_name] = self.escape_falsy_as_empty(record[field_name])
data['fields']['call_to_action_url'] = 'website_url' in record and record['website_url']
values.append(data)
diff --git a/addons/website_sale/data/data.xml b/addons/website_sale/data/data.xml
index fdef0bf6ae0..c3e23f32161 100644
--- a/addons/website_sale/data/data.xml
+++ b/addons/website_sale/data/data.xml
@@ -46,6 +46,8 @@
+
+
Products Dynamic Snippet
@@ -60,6 +62,7 @@ dynamic_filter = model.env.context.get('dynamic_filter')
limit = model.env.context.get('limit')
search_domain = model.env.context.get('search_domain')
get_rendering_data_structure = model.env.context.get('get_rendering_data_structure')
+escape = dynamic_filter.escape_falsy_as_empty
domain = [('website_published', '=', True)] + website.website_domain() + (search_domain or [])
products = ProductProduct.search(domain, limit=limit)
@@ -82,12 +85,12 @@ for product in products:
for field_name in dynamic_filter.field_names.split(","):
field = ProductProduct._fields.get(field_name)
if field and field.type == 'binary':
- res_product[field_name] = website.image_url(product, field_name)
- data_type = 'image_fields'
+ data['image_fields'][field_name] = escape(website.image_url(product, field_name))
+ elif field_name == 'list_price':
+ data['fields'][field_name] = res_product[field_name]
else:
- data_type = 'fields'
- data[data_type][field_name] = res_product[field_name]
- data['fields']['call_to_action_url'] = product['website_url']
+ data['fields'][field_name] = escape(res_product[field_name])
+ data['fields']['call_to_action_url'] = escape(product['website_url'])
res_products.append(data)
response = res_products
@@ -101,8 +104,6 @@ response = res_products
Products
-
-
sale.order