From ae3629e6b9b45a47b3c93f34d79c6babea1dd4ed Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 20 Jan 2022 09:49:12 +0000 Subject: [PATCH] [FIX] base: better copy of attachment It was not possible to set a different value via the field datas Add tests closes odoo/odoo#83175 X-original-commit: b1f047430c97ad4c0da028c1654ce640378e2f51 Signed-off-by: Martin Trigaux (mat) --- odoo/addons/base/models/ir_attachment.py | 4 +++- odoo/addons/base/tests/test_ir_attachment.py | 25 ++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/odoo/addons/base/models/ir_attachment.py b/odoo/addons/base/models/ir_attachment.py index e9c74a48dab..c1229d50ba3 100644 --- a/odoo/addons/base/models/ir_attachment.py +++ b/odoo/addons/base/models/ir_attachment.py @@ -577,7 +577,9 @@ class IrAttachment(models.Model): def copy(self, default=None): self.check('write') - default = dict(default or {}, datas=self.datas) + if not (default or {}).keys() & {'datas', 'db_datas', 'raw'}: + # ensure the content is kept and recomputes checksum/store_fname + default = dict(default or {}, raw=self.raw) return super(IrAttachment, self).copy(default) def unlink(self): diff --git a/odoo/addons/base/tests/test_ir_attachment.py b/odoo/addons/base/tests/test_ir_attachment.py index 134abd001c7..f9acb35f7a7 100644 --- a/odoo/addons/base/tests/test_ir_attachment.py +++ b/odoo/addons/base/tests/test_ir_attachment.py @@ -23,11 +23,12 @@ class TestIrAttachment(TransactionCase): # Blob1 self.blob1 = b'blob1' self.blob1_b64 = base64.b64encode(self.blob1) - blob1_hash = hashlib.sha1(self.blob1).hexdigest() - self.blob1_fname = blob1_hash[:HASH_SPLIT] + '/' + blob1_hash + self.blob1_hash = hashlib.sha1(self.blob1).hexdigest() + self.blob1_fname = self.blob1_hash[:HASH_SPLIT] + '/' + self.blob1_hash # Blob2 self.blob2 = b'blob2' + self.blob2_b64 = base64.b64encode(self.blob2) def assertApproximately(self, value, expectedSize, delta=1): # we don't used bin_size in context, because on write, the cached value is the data and not @@ -238,3 +239,23 @@ class TestIrAttachment(TransactionCase): self.env['ir.config_parameter'].set_param('base.image_autoresize_max_px', '0') attach.raw = img_bin self.assertApproximately(attach.raw, fullsize) + + def test_11_copy(self): + """ + Copying an attachment preserves the data + """ + document = self.Attachment.create({'name': 'document', 'datas': self.blob2_b64}) + document2 = document.copy({'name': "document (copy)"}) + self.assertEqual(document2.name, "document (copy)") + self.assertEqual(document2.datas, document.datas) + self.assertEqual(document2.db_datas, document.db_datas) + self.assertEqual(document2.store_fname, document.store_fname) + self.assertEqual(document2.checksum, document.checksum) + + document3 = document.copy({'datas': self.blob1_b64}) + self.assertEqual(document3.datas, self.blob1_b64) + self.assertEqual(document3.raw, self.blob1) + self.assertTrue(self.filestore) # no data in db but has a store_fname + self.assertEqual(document3.db_datas, False) + self.assertEqual(document3.store_fname, self.blob1_fname) + self.assertEqual(document3.checksum, self.blob1_hash)