From c8c8413e3e86e2abc51ade48f11320de961e5e50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Bidoul=20=28ACSONE=29?=
 <stephane.bidoul@acsone.eu>
Date: Fri, 10 May 2019 17:19:55 +0000
Subject: [PATCH] [IMP] mail: enforce kw args for message_{post/notify/log}

Since there are message_post overrides using the form `def message_post(self,
**kwargs)` in some modules, this method is intended to be invoked with keyword
arguments only.

This commit enforces this behavior. Calls such as `message_post("body")` will
fail regardless of which addon is installed, forcing users to use
`message_post(body="body")`.

It also fixes a message_post override in hr, and applies the same
mechanism to message_notify, and _message_log.

closes odoo/odoo#33306

Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
---
 addons/hr/models/hr_employee.py               | 4 ++--
 addons/mail/models/mail_channel.py            | 2 +-
 addons/mail/models/mail_thread.py             | 7 ++++---
 addons/website_blog/models/website_blog.py    | 2 +-
 addons/website_forum/models/forum.py          | 2 +-
 addons/website_slides/models/slide_channel.py | 2 +-
 addons/website_slides/models/slide_slide.py   | 2 +-
 7 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py
index ad1f40a8e8af..c3d031e8c338 100644
--- a/addons/hr/models/hr_employee.py
+++ b/addons/hr/models/hr_employee.py
@@ -335,8 +335,8 @@ class HrEmployeePrivate(models.Model):
         return super(HrEmployeePrivate, self._post_author())._message_log(**kwargs)
 
     @api.returns('mail.message', lambda value: value.id)
-    def message_post(self, *args, **kwargs):
-        return super(HrEmployeePrivate, self._post_author()).message_post(*args, **kwargs)
+    def message_post(self, **kwargs):
+        return super(HrEmployeePrivate, self._post_author()).message_post(**kwargs)
 
     def _sms_get_partner_fields(self):
         return ['user_partner_id']
diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py
index 91d40bed9ded..d3d2b7e30949 100644
--- a/addons/mail/models/mail_channel.py
+++ b/addons/mail/models/mail_channel.py
@@ -355,7 +355,7 @@ class Channel(models.Model):
         return moderation_status, email
 
     @api.returns('mail.message', lambda value: value.id)
-    def message_post(self, message_type='notification', **kwargs):
+    def message_post(self, *, message_type='notification', **kwargs):
         moderation_status, email = self._extract_moderation_values(message_type, **kwargs)
         if moderation_status == 'rejected':
             return self.env['mail.message']
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index a1348504f27e..59a74eaf364f 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -1764,7 +1764,7 @@ class MailThread(models.AbstractModel):
         return return_values
 
     @api.returns('mail.message', lambda value: value.id)
-    def message_post(self,
+    def message_post(self, *,
                      body='', subject=None, message_type='notification',
                      email_from=None, author_id=None, parent_id=False,
                      subtype_id=False, subtype=None, partner_ids=None, channel_ids=None,
@@ -1954,7 +1954,8 @@ class MailThread(models.AbstractModel):
             composer.write(update_values)
         return composer.send_mail(auto_commit=auto_commit)
 
-    def message_notify(self, partner_ids=False, parent_id=False, model=False, res_id=False,
+    def message_notify(self, *,
+                       partner_ids=False, parent_id=False, model=False, res_id=False,
                        author_id=None, email_from=None, body='', subject=False, **kwargs):
         """ Shortcut allowing to notify partners of messages that shouldn't be 
         displayed on a document. It pushes notifications on inbox or by email depending
@@ -1997,7 +1998,7 @@ class MailThread(models.AbstractModel):
         MailThread._notify_thread(new_message, values, **notif_kwargs)
         return new_message
 
-    def _message_log(self, body='', author_id=None, email_from=None, subject=False, message_type='notification', **kwargs):
+    def _message_log(self, *, body='', author_id=None, email_from=None, subject=False, message_type='notification', **kwargs):
         """ Shortcut allowing to post note on a document. It does not perform
         any notification and pre-computes some values to have a short code
         as optimized as possible. This method is private as it does not check
diff --git a/addons/website_blog/models/website_blog.py b/addons/website_blog/models/website_blog.py
index b6e9abbe0ff3..47bff0f31aa0 100644
--- a/addons/website_blog/models/website_blog.py
+++ b/addons/website_blog/models/website_blog.py
@@ -37,7 +37,7 @@ class Blog(models.Model):
         return res
 
     @api.returns('mail.message', lambda value: value.id)
-    def message_post(self, parent_id=False, subtype=None, **kwargs):
+    def message_post(self, *, parent_id=False, subtype=None, **kwargs):
         """ Temporary workaround to avoid spam. If someone replies on a channel
         through the 'Presentation Published' email, it should be considered as a
         note as we don't want all channel followers to be notified of this answer. """
diff --git a/addons/website_forum/models/forum.py b/addons/website_forum/models/forum.py
index 12dc7fc57393..f3738eb07e2b 100644
--- a/addons/website_forum/models/forum.py
+++ b/addons/website_forum/models/forum.py
@@ -815,7 +815,7 @@ class Post(models.Model):
         return groups
 
     @api.returns('mail.message', lambda value: value.id)
-    def message_post(self, message_type='notification', **kwargs):
+    def message_post(self, *, message_type='notification', **kwargs):
         if self.ids and message_type == 'comment':  # user comments have a restriction on karma
             # add followers of comments on the parent post
             if self.parent_id:
diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py
index 449e7b313f0a..a6eaac7b9534 100644
--- a/addons/website_slides/models/slide_channel.py
+++ b/addons/website_slides/models/slide_channel.py
@@ -360,7 +360,7 @@ class Channel(models.Model):
         return res
 
     @api.returns('mail.message', lambda value: value.id)
-    def message_post(self, parent_id=False, subtype=None, **kwargs):
+    def message_post(self, *, parent_id=False, subtype=None, **kwargs):
         """ Temporary workaround to avoid spam. If someone replies on a channel
         through the 'Presentation Published' email, it should be considered as a
         note as we don't want all channel followers to be notified of this answer. """
diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py
index f62c6c09ce7e..9728e42aad71 100644
--- a/addons/website_slides/models/slide_slide.py
+++ b/addons/website_slides/models/slide_slide.py
@@ -434,7 +434,7 @@ class Slide(models.Model):
     # ---------------------------------------------------------
 
     @api.returns('mail.message', lambda value: value.id)
-    def message_post(self, message_type='notification', **kwargs):
+    def message_post(self, *, message_type='notification', **kwargs):
         self.ensure_one()
         if message_type == 'comment' and not self.channel_id.can_comment:  # user comments have a restriction on karma
             raise AccessError(_('Not enough karma to comment'))
-- 
GitLab