summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Stukkens (LTU) <ltu@odoo.com>2020-09-08 14:48:27 +0000
committerLaurent Stukkens (LTU) <ltu@odoo.com>2020-09-11 08:46:09 +0000
commit18d4e3327c7152b4c3a86ba377e3357f213b703c (patch)
tree81f78f3b5077c4a88304a4b480df7147d2b63488
parent00c1c9a7258cf53f1a40938e3a928151b188de64 (diff)
[IMP] website: add image widget support for urls char fields
* Prior to this commit, images were only managed when being an image field. No widget were used either. * After this commit, image stored in model as url (as res.country.image_url) can be used when specifying ':image' after the field name. The fields are now rendered using their corresponding default widget. If there is a need to force another widget and if the developer is sure that it is compatible, he/she can specify it using the notation: 'field_name:widget_name'. closes odoo/odoo#57482 Signed-off-by: Jérémy Kersten (jke) <jke@openerp.com>
-rw-r--r--addons/website/data/website_data.xml2
-rw-r--r--addons/website/models/website_snippet_filter.py58
-rw-r--r--addons/website_sale/data/data.xml9
-rw-r--r--addons/website_sale/models/__init__.py1
-rw-r--r--addons/website_sale/models/website_snippet_filter.py12
5 files changed, 68 insertions, 14 deletions
diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml
index c7ed6fa16b8..5dc7556d2db 100644
--- a/addons/website/data/website_data.xml
+++ b/addons/website/data/website_data.xml
@@ -763,7 +763,7 @@
</template>
<!-- Dynamic Snippet Data Source -->
<record id="dynamic_snippet_data_source_country" model="website.snippet.filter">
- <field name="field_names">name,code,image,phone_code</field>
+ <field name="field_names">name,code,image_url:image,phone_code:char</field>
<field name="filter_id" ref="website.dynamic_snippet_country_filter"/>
<field name="limit" eval="16"/>
<field name="name">Countries</field>
diff --git a/addons/website/models/website_snippet_filter.py b/addons/website/models/website_snippet_filter.py
index 3bd3556c011..6bdd648f1fd 100644
--- a/addons/website/models/website_snippet_filter.py
+++ b/addons/website/models/website_snippet_filter.py
@@ -71,14 +71,21 @@ class WebsiteSnippetFilter(models.Model):
order=','.join(literal_eval(filter_sudo.sort)) or None,
limit=limit
)
+ return self._filter_records_to_dict_values(records)
elif self.action_server_id:
- records = self.action_server_id.with_context(
+ return self.action_server_id.with_context(
dynamic_filter=self,
limit=limit,
search_domain=search_domain,
+ get_rendering_data_structure=self._get_rendering_data_structure,
).sudo().run()
- return self._filter_records_to_dict_values(records)
+ @api.model
+ def _get_rendering_data_structure(self):
+ return {
+ 'fields': OrderedDict({}),
+ 'image_fields': OrderedDict({}),
+ }
def _filter_records_to_dict_values(self, records):
"""Extract the fields from the data source and put them into a dictionary of values
@@ -99,21 +106,48 @@ class WebsiteSnippetFilter(models.Model):
self.ensure_one()
values = []
- model = self.env[self.filter_id.model_id] if self.filter_id else self.env[self.action_server_id.model_id.model]
+ model = self.env[self.filter_id.model_id]
+ Website = self.env['website']
for record in records:
- data = {
- 'fields': OrderedDict({}),
- 'image_fields': OrderedDict({}),
- }
-
+ data = self._get_rendering_data_structure()
for field_name in self.field_names.split(","):
+ field_name, _, field_widget = field_name.partition(":")
field = model._fields.get(field_name)
- data_type = 'image_fields' if field.type == 'binary' else 'fields'
- if data_type == 'image_fields' and self.filter_id:
- data[data_type][field_name] = self.env['website'].image_url(record, field_name)
+ field_widget = field_widget or field.type
+ if field.type == 'binary':
+ data['image_fields'][field_name] = Website.image_url(record, field_name)
+ elif field_widget == 'image':
+ data['image_fields'][field_name] = record[field_name]
+ elif field_widget == 'monetary':
+ FieldMonetary = self.env['ir.qweb.field.monetary']
+ model_currency = None
+ if field.type == 'monetary':
+ model_currency = record[record[field_name].currency_field]
+ elif 'currency_id' in model._fields:
+ model_currency = record['currency_id']
+ if model_currency:
+ website_currency = self._get_website_currency()
+ data['fields'][field_name] = FieldMonetary.value_to_html(
+ model_currency._convert(
+ record[field_name],
+ website_currency,
+ Website.get_current_website().company_id,
+ fields.Date.today()
+ ),
+ {'display_currency': website_currency}
+ )
+ else:
+ data['fields'][field_name] = 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[data_type][field_name] = record[field_name]
+ data['fields'][field_name] = record[field_name]
data['fields']['call_to_action_url'] = 'website_url' in record and record['website_url']
values.append(data)
return values
+
+ @api.model
+ def _get_website_currency(self):
+ company = self.env['website'].get_current_website().company_id
+ return company.currency_id
diff --git a/addons/website_sale/data/data.xml b/addons/website_sale/data/data.xml
index 88291c2a23f..fdef0bf6ae0 100644
--- a/addons/website_sale/data/data.xml
+++ b/addons/website_sale/data/data.xml
@@ -59,6 +59,7 @@ website = request.website.get_current_website()
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')
domain = [('website_published', '=', True)] + website.website_domain() + (search_domain or [])
products = ProductProduct.search(domain, limit=limit)
@@ -77,11 +78,17 @@ for product in products:
if res_product['description_sale'] and len(res_product['description_sale']) > max_nb_chars:
res_product['description_sale'] = "%s ..." % res_product['description_sale'][:max_nb_chars]
res_product['list_price'] = FieldMonetary.value_to_html(res_product['price'], monetary_options)
+ data = get_rendering_data_structure()
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)
- res_products.append(res_product)
+ data_type = 'image_fields'
+ else:
+ data_type = 'fields'
+ data[data_type][field_name] = res_product[field_name]
+ data['fields']['call_to_action_url'] = product['website_url']
+ res_products.append(data)
response = res_products
</field>
diff --git a/addons/website_sale/models/__init__.py b/addons/website_sale/models/__init__.py
index c5fdb9f6e57..d7863895db7 100644
--- a/addons/website_sale/models/__init__.py
+++ b/addons/website_sale/models/__init__.py
@@ -17,3 +17,4 @@ from . import res_company
from . import product_attribute
from . import website_page
from . import website_visitor
+from . import website_snippet_filter
diff --git a/addons/website_sale/models/website_snippet_filter.py b/addons/website_sale/models/website_snippet_filter.py
new file mode 100644
index 00000000000..7b8206b1928
--- /dev/null
+++ b/addons/website_sale/models/website_snippet_filter.py
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+
+from odoo import models, fields, api, _
+
+
+class WebsiteSnippetFilter(models.Model):
+ _inherit = 'website.snippet.filter'
+
+ @api.model
+ def _get_website_currency(self):
+ pricelist = self.env['website'].get_current_website().get_current_pricelist()
+ return pricelist.currency_id