summaryrefslogtreecommitdiff
path: root/addons/website/models
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 /addons/website/models
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>
Diffstat (limited to 'addons/website/models')
-rw-r--r--addons/website/models/website_snippet_filter.py58
1 files changed, 46 insertions, 12 deletions
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