From 8740681210ec30f4cf357c2d976632f5f039b29e Mon Sep 17 00:00:00 2001 From: Abdellatif Benzbiria Date: Wed, 16 Sep 2026 16:56:10 +0100 Subject: [PATCH 1/2] [14.0][IMP] project_worksheet : Customize Emails and Subscribers --- project_worksheet/models/project_worksheet.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/project_worksheet/models/project_worksheet.py b/project_worksheet/models/project_worksheet.py index 9758537f..34f4a397 100644 --- a/project_worksheet/models/project_worksheet.py +++ b/project_worksheet/models/project_worksheet.py @@ -204,8 +204,12 @@ def _generate_timesheets_if_empty(self): self._generate_timesheets() def _send_approval_email(self): - template = self.env.ref("project_worksheet.email_template_worksheet_approval") - template.send_mail(self.id, force_send=True) + template_id = self.env.ref("project_worksheet.email_template_worksheet_approval").id + self.message_post_with_template( + template_id, + composition_mode="comment", + message_type="comment", + ) def _get_remind_client_action(self): template = self.env.ref("project_worksheet.email_template_worksheet_approval") @@ -239,9 +243,13 @@ def _confirm_worksheet(self, source): self._send_confirmation_email() def _send_confirmation_email(self): - template = self.env.ref("project_worksheet.email_template_worksheet_confirmed") + template_id = self.env.ref("project_worksheet.email_template_worksheet_confirmed").id for worksheet in self: - template.send_mail(worksheet.id, force_send=True) + worksheet.message_post_with_template( + template_id, + composition_mode="comment", + message_type="comment", + ) def _generate_timesheets(self): timesheet_model = self.env["account.analytic.line"] From ff6987593897f36ed99c066110ac36f36ece4923 Mon Sep 17 00:00:00 2001 From: Abdellatif Benzbiria Date: Thu, 17 Sep 2026 11:58:33 +0100 Subject: [PATCH 2/2] [14.0][IMP] project_worksheet : Customize Emails and Subscribers --- project_worksheet/data/mail_template_data.xml | 2 +- project_worksheet/models/project_worksheet.py | 30 +++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/project_worksheet/data/mail_template_data.xml b/project_worksheet/data/mail_template_data.xml index 2c117bed..3ce00449 100644 --- a/project_worksheet/data/mail_template_data.xml +++ b/project_worksheet/data/mail_template_data.xml @@ -5,7 +5,7 @@ Worksheet: Approval Request Worksheet ${object.name} - project ${object.project_id.name} - approval required - ${object.partner_approver_id.email} + ${object.partner_approver_id.email},${object.supervisor_id.work_email}

diff --git a/project_worksheet/models/project_worksheet.py b/project_worksheet/models/project_worksheet.py index 34f4a397..28761dd1 100644 --- a/project_worksheet/models/project_worksheet.py +++ b/project_worksheet/models/project_worksheet.py @@ -243,13 +243,31 @@ def _confirm_worksheet(self, source): self._send_confirmation_email() def _send_confirmation_email(self): - template_id = self.env.ref("project_worksheet.email_template_worksheet_confirmed").id + template_id = self._get_confirmation_template_id() for worksheet in self: - worksheet.message_post_with_template( - template_id, - composition_mode="comment", - message_type="comment", - ) + worksheet._post_confirmation_message(template_id) + + def _get_confirmation_template_id(self): + return self.env.ref("project_worksheet.email_template_worksheet_confirmed").id + + def _post_confirmation_message(self, template_id): + # Post the message using the appropriate user context + record = self._get_mail_sender_record() + record.message_post_with_template( + template_id, + composition_mode="comment", + message_type="comment", + ) + + def _get_mail_sender_record(self): + # Use root user (OdooBot) if the client is the one confirming the worksheet + if self.approval_source == "client": + return self._get_root_user_record() + return self + + def _get_root_user_record(self): + root_user = self.env.ref("base.user_root") + return self.with_user(root_user) def _generate_timesheets(self): timesheet_model = self.env["account.analytic.line"]