diff --git a/addons/website_forum/controllers/website_forum.py b/addons/website_forum/controllers/website_forum.py
index 994939bbcc1..0ce1ff935ed 100644
--- a/addons/website_forum/controllers/website_forum.py
+++ b/addons/website_forum/controllers/website_forum.py
@@ -36,6 +36,21 @@ class WebsiteForum(WebsiteProfile):
values['forum'] = kwargs.get('forum')
elif kwargs.get('forum_id'):
values['forum'] = request.env['forum.forum'].browse(int(kwargs.pop('forum_id')))
+ forum = values.get('forum')
+ if forum and forum is not True and not request.env.user._is_public():
+ def _get_my_other_forums():
+ post_domain = expression.OR(
+ [[('create_uid', '=', request.uid)],
+ [('favourite_ids', '=', request.uid)]]
+ )
+ return request.env['forum.forum'].search(expression.AND([
+ request.website.website_domain(),
+ [('id', '!=', forum.id)],
+ [('post_ids', 'any', post_domain)]
+ ]))
+ values['my_other_forums'] = tools.lazy(_get_my_other_forums)
+ else:
+ values['my_other_forums'] = request.env['forum.forum']
return values
def _prepare_mark_as_offensive_values(self, post, **kwargs):
diff --git a/addons/website_forum/tests/__init__.py b/addons/website_forum/tests/__init__.py
index 19b53cb2ec1..eb576b9e6b9 100644
--- a/addons/website_forum/tests/__init__.py
+++ b/addons/website_forum/tests/__init__.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from . import common
+from . import test_forum_controller
from . import test_forum_internals
from . import test_forum_karma_access
from . import test_forum_tag
diff --git a/addons/website_forum/tests/common.py b/addons/website_forum/tests/common.py
index a53fba76075..268b13f136a 100644
--- a/addons/website_forum/tests/common.py
+++ b/addons/website_forum/tests/common.py
@@ -44,6 +44,13 @@ class TestForumCommon(common.TransactionCase):
'karma': 0,
'groups_id': [(6, 0, [group_employee_id])]
})
+ cls.user_employee_2 = cls.env['res.users'].create({
+ 'name': 'Merlin Employee',
+ 'login': 'Merlin',
+ 'email': 'merlin.employee@example.com',
+ 'karma': KARMA['ask'],
+ 'groups_id': [(6, 0, [cls.env.ref('base.group_user').id])],
+ })
cls.user_portal = TestUsersEnv.create({
'name': 'Beatrice Portal',
'login': 'Beatrice',
@@ -58,6 +65,7 @@ class TestForumCommon(common.TransactionCase):
'karma': 0,
'groups_id': [(6, 0, [group_public_id])]
})
+ cls.user_admin = cls.env.ref('base.user_admin')
# Test forum
cls.forum = Forum.create({
diff --git a/addons/website_forum/tests/test_forum_controller.py b/addons/website_forum/tests/test_forum_controller.py
new file mode 100644
index 00000000000..72a8ab56f77
--- /dev/null
+++ b/addons/website_forum/tests/test_forum_controller.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.addons.website.tools import MockRequest
+from odoo.addons.website_forum.controllers.website_forum import WebsiteForum
+from odoo.addons.website_forum.tests.common import KARMA, TestForumCommon
+
+
+class TestForumController(TestForumCommon):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls._activate_multi_website()
+ cls.minimum_karma_allowing_to_post = KARMA['ask']
+ cls.forums = cls.env['forum.forum'].create([{
+ 'name': f'Forum {idx + 2}',
+ 'karma_ask': cls.minimum_karma_allowing_to_post,
+ 'website_id': website.id,
+ } for idx, website in enumerate(
+ (cls.base_website, cls.base_website, cls.base_website, cls.website_2, cls.website_2))])
+ cls.forum_1, cls.forum_2, cls.forum_3, cls.forum_1_website_2, cls.forum_2_website_2 = cls.forums
+ cls.controller = WebsiteForum()
+
+ def _get_my_other_forums(self, forum):
+ """ Get user other forums limited to the forums of the test (self.forums). """
+ return self.forums & self.controller._prepare_user_values(forum=forum).get('my_other_forums')
+
+ def forum_post(self, user, forum):
+ return self.env['forum.post'].with_user(user).create({
+ 'content': 'A post ...',
+ 'forum_id': forum.id,
+ 'name': 'Post...',
+ })
+
+ def test_prepare_user_values_my_other_forum(self):
+ """ Test user other forums values (my_other_forums) in various contexts. """
+ employee_2_forum_2_post = self.forum_post(self.user_employee_2, self.forum_2)
+ employee_2_website_2_forum_2_post = self.forum_post(self.user_employee_2, self.forum_2_website_2)
+ for user in (self.user_admin, self.user_employee, self.user_portal, self.user_public):
+ with self.with_user(user.login), MockRequest(self.env, website=self.base_website):
+ self.assertFalse(self._get_my_other_forums(self.forum_1))
+ self.assertFalse(self._get_my_other_forums(None))
+ self.assertFalse(self._get_my_other_forums(True))
+ if user != self.user_public:
+ self.env.user.karma = self.minimum_karma_allowing_to_post
+ # Like a post on forum 2 and verify that forum 2 is now in "my other forum"
+ employee_2_forum_2_post.favourite_ids += self.env.user
+ self.assertEqual(self._get_my_other_forums(self.forum_1), self.forum_2)
+ self.assertFalse(self._get_my_other_forums(self.forum_2))
+ # Check similarly with posting and also checking that we don't see forum of website 2
+ self.forum_post(self.env.user, self.forum_3)
+ self.forum_post(self.env.user, self.forum_1_website_2)
+ self.assertEqual(self._get_my_other_forums(self.forum_1), self.forum_2 + self.forum_3)
+ self.assertEqual(self._get_my_other_forums(self.forum_2), self.forum_3)
+ self.assertEqual(self._get_my_other_forums(self.forum_3), self.forum_2)
+ with self.with_user(user.login), MockRequest(self.env, website=self.website_2):
+ self.assertFalse(self._get_my_other_forums(None))
+ self.assertFalse(self._get_my_other_forums(True))
+ if user != self.user_public:
+ self.assertFalse(self._get_my_other_forums(self.forum_1_website_2))
+ self.assertEqual(self._get_my_other_forums(self.forum_2_website_2), self.forum_1_website_2)
+ employee_2_website_2_forum_2_post.favourite_ids += self.env.user
+ self.assertEqual(self._get_my_other_forums(self.forum_1_website_2), self.forum_2_website_2)
diff --git a/addons/website_forum/views/forum_forum_templates_layout.xml b/addons/website_forum/views/forum_forum_templates_layout.xml
index 6a9d5860150..bb3f061a5c9 100644
--- a/addons/website_forum/views/forum_forum_templates_layout.xml
+++ b/addons/website_forum/views/forum_forum_templates_layout.xml
@@ -338,6 +338,15 @@