diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index 805688f45ed..674dd0a029f 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -13,6 +13,7 @@ from odoo.exceptions import AccessError, UserError, ValidationError from odoo.tests import common from odoo.tools import mute_logger, float_repr from odoo.tools.date_utils import add, subtract, start_of, end_of +from odoo.tools.image import image_data_uri class TestFields(common.TransactionCase): @@ -1503,6 +1504,10 @@ class TestFields(common.TransactionCase): self.assertEqual(record_bin_size.image_512, b'1.02 Kb') self.assertEqual(record_bin_size.image_256, b'424.00 bytes') + # ensure image_data_uri works (value must be bytes and not string) + self.assertEqual(record.image_256[:8], b'iVBORw0K') + self.assertEqual(image_data_uri(record.image_256)[:30], 'data:image/png;base64,iVBORw0K') + def test_95_binary_bin_size(self): binary_value = base64.b64encode(b'content') binary_size = b'7.00 bytes' diff --git a/odoo/fields.py b/odoo/fields.py index 4abdc9dcf1f..f753371719a 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -1895,7 +1895,9 @@ class Binary(Field): # If the client requests only the size of the field, we return that # instead of the content. Presumably a separate request will be done # to read the actual content, if necessary. - return human_size(value) + value = human_size(value) + # human_size can return False (-> None) or a string (-> encoded) + return value.encode() if value else None return None if value is False else value def convert_to_record(self, value, record): @@ -2029,13 +2031,15 @@ class Image(Binary): # does not resize the same way as its related field new_value = self._image_process(value) new_record_values.append((record, new_value)) - record.env.cache.update(record, self, [value if self.related else new_value] * len(record)) + cache_value = self.convert_to_cache(value if self.related else new_value, record) + record.env.cache.update(record, self, [cache_value] * len(record)) super(Image, self).create(new_record_values) def write(self, records, value): new_value = self._image_process(value) super(Image, self).write(records, new_value) - records.env.cache.update(records, self, [value if self.related else new_value] * len(records)) + cache_value = self.convert_to_cache(value if self.related else new_value, records) + records.env.cache.update(records, self, [cache_value] * len(records)) def _image_process(self, value): if value and (self.max_width or self.max_height):