From b4bfb2a0d2429f6bfd7859e1b6baa381ae3e2cea Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 19 Jul 2021 09:37:20 +0000 Subject: [PATCH] [ADD] base: missing raw preprocessing makes raw a bit more expensive than necessary on creation closes odoo/odoo#74132 X-original-commit: f9b12a59ea618fa598f0ffb6869f027c6a39bc2d Signed-off-by: Xavier Morel (xmo) --- odoo/addons/base/models/ir_attachment.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/odoo/addons/base/models/ir_attachment.py b/odoo/addons/base/models/ir_attachment.py index cfdea5e1f88..dd7a7c088a5 100644 --- a/odoo/addons/base/models/ir_attachment.py +++ b/odoo/addons/base/models/ir_attachment.py @@ -527,7 +527,7 @@ class IrAttachment(models.Model): # remove computed field depending of datas for field in ('file_size', 'checksum'): vals.pop(field, False) - if 'mimetype' in vals or 'datas' in vals: + if 'mimetype' in vals or 'datas' in vals or 'raw' in vals: vals = self._check_contents(vals) return super(IrAttachment, self).write(vals) @@ -559,9 +559,16 @@ class IrAttachment(models.Model): for field in ('file_size', 'checksum'): values.pop(field, False) values = self._check_contents(values) - if 'datas' in values: - data = values.pop('datas') - values.update(self._get_datas_related_values(base64.b64decode(data or b''), values['mimetype'])) + raw, datas = values.pop('raw', None), values.pop('datas', None) + if raw or datas: + if isinstance(raw, str): + # b64decode handles str input but raw needs explicit encoding + raw = raw.encode() + values.update(self._get_datas_related_values( + raw or base64.b64decode(datas or b''), + values['mimetype'] + )) + # 'check()' only uses res_model and res_id from values, and make an exists. # We can group the values by model, res_id to make only one query when # creating multiple attachments on a single record.