diff --git a/mail_quoted_reply/__manifest__.py b/mail_quoted_reply/__manifest__.py index d4c898e560..29d055135e 100644 --- a/mail_quoted_reply/__manifest__.py +++ b/mail_quoted_reply/__manifest__.py @@ -10,7 +10,9 @@ "author": "Creu Blanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/social", "depends": ["mail"], - "data": [], + "data": [ + "views/mail_compose_message_views.xml", + ], "assets": { "web.assets_backend": [ "/mail_quoted_reply/static/src/models/*.js", diff --git a/mail_quoted_reply/models/mail_compose_message.py b/mail_quoted_reply/models/mail_compose_message.py index af50226357..5db25f84ea 100644 --- a/mail_quoted_reply/models/mail_compose_message.py +++ b/mail_quoted_reply/models/mail_compose_message.py @@ -1,19 +1,49 @@ from markupsafe import Markup -from odoo import api, models, tools +from odoo import api, fields, models, tools class MailComposeMessage(models.TransientModel): _inherit = "mail.compose.message" + is_reply_readonly = fields.Boolean(default=True, string="Reply Readonly") + reply_body = fields.Html(default="", string="Reply body") + is_separate_body = fields.Boolean(compute="_compute_is_separate_body") + @api.onchange("template_id") def _onchange_template_id_wrapper(self): super()._onchange_template_id_wrapper() context = self._context if "is_quoted_reply" in context.keys() and context["is_quoted_reply"]: - self.body += Markup(context["quote_body"]) + if self.is_separate_body: + self.reply_body = context["quote_body"] + else: + self.body += Markup(context["quote_body"]) return + @api.onchange("is_reply_readonly") + def _onchange_is_reply_readonly(self): + if self.reply_body: + self.reply_body = Markup(self.reply_body) + + @api.depends("reply_body") + def _compute_is_separate_body(self): + parameter_string = ( + self.env["ir.config_parameter"] + .sudo() + .get_param("mail_quoted_reply.separate_reply_body", "") + ) + self.is_separate_body = parameter_string.lower() not in ["", "false", "0"] + + def get_mail_values(self, res_ids): + results = super(MailComposeMessage, self).get_mail_values(res_ids) + if self.is_separate_body and self.reply_body: + for res_id in res_ids: + values = results.get(res_id) + reply_body = Markup(self.reply_body) + values.update({"body": values.get("body") + reply_body}) + return results + @api.model def get_record_data(self, values): result = super().get_record_data(values) diff --git a/mail_quoted_reply/tests/test_reply.py b/mail_quoted_reply/tests/test_reply.py index ef1f7c220f..1183cbe5b0 100644 --- a/mail_quoted_reply/tests/test_reply.py +++ b/mail_quoted_reply/tests/test_reply.py @@ -44,3 +44,32 @@ def test_reply(self): ) self.assertTrue(new_message) self.assertEqual(1, len(new_message)) + + def test_reply_separate_body(self): + self.env["ir.config_parameter"].sudo().create( + { + "key": "mail_quoted_reply.separate_reply_body", + "value": "True", + } + ) + partner = self.env["res.partner"].create({"name": "demo partner"}) + message = partner.message_post( + body="demo message", + message_type="email", + partner_ids=self.env.ref("base.partner_demo").ids, + ) + partner.invalidate_recordset() + action = message.reply_message() + wizard = ( + self.env[action["res_model"]].with_context(**action["context"]).create({}) + ) + wizard._onchange_template_id_wrapper() + self.assertTrue("
demo message
" in wizard.reply_body) + wizard.action_send_mail() + new_message = partner.message_ids.filtered( + lambda r: r.message_type != "notification" and r != message + ) + self.assertTrue(new_message) + self.assertEqual(1, len(new_message)) + new_message = new_message[0] + self.assertTrue("demo message
" in new_message.body) diff --git a/mail_quoted_reply/views/mail_compose_message_views.xml b/mail_quoted_reply/views/mail_compose_message_views.xml new file mode 100644 index 0000000000..2acc8f7b05 --- /dev/null +++ b/mail_quoted_reply/views/mail_compose_message_views.xml @@ -0,0 +1,26 @@ + +