From 14bbac3f35e5bd3ff0d1b8464dbeb0273ed31373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 23 Dec 2021 12:50:14 +0100 Subject: [PATCH] [FIX] base: temporary files were not correctly attached --- addons/mail/wizard/mail_compose_message.py | 10 +++++++++- addons/test_mail/tests/test_mail_composer.py | 9 ++++++++- addons/test_mail/tests/test_mail_message.py | 4 +++- odoo/addons/base/models/ir_attachment.py | 4 ++-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index a91b0c4bd4c..c9f81f0c9c0 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -340,9 +340,17 @@ class MailComposer(models.TransientModel): 'subject': record.subject or False, 'body_html': record.body or False, 'model_id': model.id or False, - 'attachment_ids': [Command.set(record.attachment_ids.ids)], } template = self.env['mail.template'].create(values) + + if record.attachment_ids: + # transfer pending attachments to the new template + attachments = self.env['ir.attachment'].sudo().browse(record.attachment_ids).filtered( + lambda a: a.res_model == 'mail.compose.message' and a.create_uid.id == self._uid) + if attachments: + attachments.write({'res_model': template._name, 'res_id': template.id}) + template.attachment_ids |= record.attachment_ids + # generate the saved template record.write({'template_id': template.id}) record._onchange_template_id_wrapper() diff --git a/addons/test_mail/tests/test_mail_composer.py b/addons/test_mail/tests/test_mail_composer.py index 05449d3f0cb..6703ae4450f 100644 --- a/addons/test_mail/tests/test_mail_composer.py +++ b/addons/test_mail/tests/test_mail_composer.py @@ -69,10 +69,17 @@ class TestMailComposer(TestMailCommon, TestRecipients): 'auto_delete': True, }) - def _generate_attachments_data(self, count): + def _generate_attachments_data(self, count, res_model=None, res_id=None): + # attachment visibility depends on what they are attached to + if res_model is None: + res_model = self.template._name + if res_id is None: + res_id = self.template.id return [{ 'name': '%02d.txt' % x, 'datas': base64.b64encode(b'Att%02d' % x), + 'res_model': res_model, + 'res_id': res_id, } for x in range(count)] def _get_web_context(self, records, add_web=True, **values): diff --git a/addons/test_mail/tests/test_mail_message.py b/addons/test_mail/tests/test_mail_message.py index 946c42bbdae..f4bfe292a68 100644 --- a/addons/test_mail/tests/test_mail_message.py +++ b/addons/test_mail/tests/test_mail_message.py @@ -293,7 +293,9 @@ class TestMessageAccess(TestMailCommon): def test_mail_message_access_read_notification(self): attachment = self.env['ir.attachment'].create({ 'datas': base64.b64encode(b'My attachment'), - 'name': 'doc.txt'}) + 'name': 'doc.txt', + 'res_model': self.message._name, + 'res_id': self.message.id}) # attach the attachment to the message self.message.write({'attachment_ids': [(4, attachment.id)]}) self.message.write({'partner_ids': [(4, self.user_employee.partner_id.id)]}) diff --git a/odoo/addons/base/models/ir_attachment.py b/odoo/addons/base/models/ir_attachment.py index 0b036ddd7e2..a96af13a22d 100644 --- a/odoo/addons/base/models/ir_attachment.py +++ b/odoo/addons/base/models/ir_attachment.py @@ -437,10 +437,10 @@ class IrAttachment(models.Model): self.env['ir.attachment'].flush(['res_model', 'res_id', 'create_uid', 'public', 'res_field']) self._cr.execute('SELECT res_model, res_id, create_uid, public, res_field FROM ir_attachment WHERE id IN %s', [tuple(self.ids)]) for res_model, res_id, create_uid, public, res_field in self._cr.fetchall(): - if not self.env.is_system() and res_field: - raise AccessError(_("Sorry, you are not allowed to access this document.")) if public and mode == 'read': continue + if not self.env.is_system() and (res_field or (not res_id and create_uid != self.env.uid)): + raise AccessError(_("Sorry, you are not allowed to access this document.")) if not (res_model and res_id): continue model_ids[res_model].add(res_id)