summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2020-10-06 12:11:48 +0000
committerRaphael Collet <rco@odoo.com>2020-10-13 17:05:19 +0000
commit9b71458937fd15f357923434b41f95eb95af57a1 (patch)
tree190ca49a59ca79f4713651deed98167abc0a9bd9
parentc107edf7077399c2ffa60b85a291ec3830d8432d (diff)
[FIX] core: assignment of size to new records
Upon onchange, the web client sends unchanged image fields on one2many lines as "bin size" values, while changed image fields are sent as their full value. As the value is not base64-encoded, the assignment of that value crashes. Fix it by making assignment on new records not crash when decoding the image: the value is simply not assigned to the field. In the situation described above, the record being assigned is a new record with a real record as origin. Because the field is actually not assigned, its value is implicitly the value of the field on the origin record, which is consistent with the fact that the field was not modified in the form. X-original-commit: 4442d6f0f29a2bf6e992515cd535c88215855a36
-rw-r--r--odoo/addons/test_new_api/tests/test_new_fields.py9
-rw-r--r--odoo/fields.py13
2 files changed, 20 insertions, 2 deletions
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 10993c52668..441362e7038 100644
--- a/odoo/addons/test_new_api/tests/test_new_fields.py
+++ b/odoo/addons/test_new_api/tests/test_new_fields.py
@@ -1953,11 +1953,18 @@ class TestFields(TransactionCaseWithUserDemo):
self.assertEqual(image_data_uri(record.image_256)[:30], 'data:image/png;base64,iVBORw0K')
# ensure invalid image raises
- with self.assertRaises(UserError):
+ with self.assertRaises(UserError), self.cr.savepoint():
record.write({
'image': 'invalid image',
})
+ # assignment of invalid image on new record does nothing, the value is
+ # taken from origin instead (use-case: onchange)
+ new_record = record.new(origin=record)
+ new_record.image = '31.54 Kb'
+ self.assertEqual(record.image, image_h)
+ self.assertEqual(new_record.image, image_h)
+
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 7656b279004..324450bf80e 100644
--- a/odoo/fields.py
+++ b/odoo/fields.py
@@ -2113,7 +2113,18 @@ class Image(Binary):
super(Image, self).create(new_record_values)
def write(self, records, value):
- new_value = self._image_process(value)
+ try:
+ new_value = self._image_process(value)
+ except UserError:
+ if not any(records._ids):
+ # Some crap is assigned to a new record. This can happen in an
+ # onchange, where the client sends the "bin size" value of the
+ # field instead of its full value (this saves bandwidth). In
+ # this case, we simply don't assign the field: its value will be
+ # taken from the records' origin.
+ return
+ raise
+
super(Image, self).write(records, new_value)
cache_value = self.convert_to_cache(value if self.related else new_value, records)
records.env.cache.update(records, self, [cache_value] * len(records))