diff --git a/addons/website_forum/controllers/website_forum.py b/addons/website_forum/controllers/website_forum.py index dbdb476ff5a..98b4c3d17ab 100644 --- a/addons/website_forum/controllers/website_forum.py +++ b/addons/website_forum/controllers/website_forum.py @@ -73,31 +73,39 @@ class WebsiteForum(WebsiteProfile): if not qs or qs.lower() in loc: yield {'loc': loc} - def _get_forum_port_search_options(self, forum=None, tag=None, filters=None, my=None, **post): + def _get_forum_post_search_options(self, forum=None, tag=None, filters=None, my=None, create_uid=False, include_answers=False, **post): return { + 'allowFuzzy': not post.get('noFuzzy'), + 'create_uid': create_uid, 'displayDescription': False, 'displayDetail': False, 'displayExtraDetail': False, 'displayExtraLink': False, 'displayImage': False, - 'allowFuzzy': not post.get('noFuzzy'), - 'forum': str(forum.id) if forum else None, - 'tag': str(tag.id) if tag else None, 'filters': filters, + 'forum': str(forum.id) if forum else None, + 'include_answers': include_answers, 'my': my, + 'tag': str(tag.id) if tag else None, } - @http.route(['/forum/', + @http.route(['/forum/all', + '/forum/all/page/', + '/forum/', '/forum//page/', '''/forum//tag//questions''', '''/forum//tag//questions/page/''', ], type='http', auth="public", website=True, sitemap=sitemap_forum) - def questions(self, forum, tag=None, page=1, filters='all', my=None, sorting=None, search='', **post): + def questions(self, forum=None, tag=None, page=1, filters='all', my=None, sorting=None, search='', create_uid=False, include_answers=False, **post): Post = request.env['forum.post'] + author = request.env['res.users'].browse(int(create_uid)) + + if author == request.env.user: + my = 'mine' if sorting: # check that sorting is valid - # retro-compatibily for V8 and google links + # retro-compatibility for V8 and google links try: sorting = werkzeug.urls.url_unquote_plus(sorting) Post._generate_order_by(sorting, None) @@ -105,13 +113,15 @@ class WebsiteForum(WebsiteProfile): sorting = False if not sorting: - sorting = forum.default_order + sorting = forum.default_order if forum else 'last_activity_date desc' - options = self._get_forum_port_search_options( + options = self._get_forum_post_search_options( forum=forum, tag=tag, filters=filters, my=my, + create_uid=author.id, + include_answers=include_answers, **post ) question_count, details, fuzzy_search_term = request.website._search_with_fuzzy( @@ -119,7 +129,11 @@ class WebsiteForum(WebsiteProfile): question_ids = details[0].get('results', Post) question_ids = question_ids[(page - 1) * self._post_per_page:page * self._post_per_page] - url = f"/forum/{slug(forum)}{f'/tag/{slug(tag)}/questions' if tag else ''}" + if not forum: + url = '/forum/all' + else: + url = f"/forum/{slug(forum)}{f'/tag/{slug(tag)}/questions' if tag else ''}" + url_args = {'sorting': sorting} for name, value in zip(['filters', 'search', 'my'], [filters, search, my]): @@ -132,7 +146,7 @@ class WebsiteForum(WebsiteProfile): values = self._prepare_user_values(forum=forum, searches=post) values.update({ - 'main_object': tag or forum, + 'author': author, 'edit_in_backend': True, 'question_ids': question_ids, 'question_count': question_count, @@ -145,6 +159,10 @@ class WebsiteForum(WebsiteProfile): 'search': fuzzy_search_term or search, 'original_search': fuzzy_search_term and search, }) + + if forum or tag: + values['main_object'] = tag or forum + return request.render("website_forum.forum_index", values) @http.route(['''/forum//faq'''], type='http', auth="public", website=True, sitemap=True) @@ -602,9 +620,10 @@ class WebsiteForum(WebsiteProfile): # Profile # ----------------------------------- - @http.route(['/forum//user/'], type='http', auth="public", website=True) - def view_user_forum_profile(self, forum, user_id, forum_origin='/forum', **post): - return request.redirect(f'/profile/user/{user_id}?forum_id={forum.id}&forum_origin={forum_origin}') + @http.route(['/forum/user/'], type='http', auth="public", website=True) + def view_user_forum_profile(self, user_id, forum_id='', forum_origin='/forum', **post): + forum_origin_query = f'?forum_origin={forum_origin}&forum_id={forum_id}' if forum_id else '' + return request.redirect(f'/profile/user/{user_id}{forum_origin_query}') def _prepare_user_profile_values(self, user, **post): values = super(WebsiteForum, self)._prepare_user_profile_values(user, **post) diff --git a/addons/website_forum/models/forum_post.py b/addons/website_forum/models/forum_post.py index f43f2096ca3..55461b5fb31 100644 --- a/addons/website_forum/models/forum_post.py +++ b/addons/website_forum/models/forum_post.py @@ -9,6 +9,7 @@ from datetime import datetime from odoo import api, fields, models, tools, _ from odoo.addons.http_routing.models.ir_http import slug, unslug from odoo.exceptions import UserError, ValidationError, AccessError +from odoo.osv import expression from odoo.tools import sql _logger = logging.getLogger(__name__) @@ -804,30 +805,36 @@ class Post(models.Model): } domain = website.website_domain() - domain += [('parent_id', '=', False), ('state', '=', 'active'), ('can_view', '=', True)] + domain = expression.AND([domain, [('state', '=', 'active'), ('can_view', '=', True)]]) + include_answers = options.get('include_answers', False) + if not include_answers: + domain = expression.AND([domain, [('parent_id', '=', False)]]) forum = options.get('forum') if forum: - domain += [('forum_id', '=', unslug(forum)[1])] + domain = expression.AND([domain, [('forum_id', '=', unslug(forum)[1])]]) tags = options.get('tag') if tags: - domain += [('tag_ids', 'in', [unslug(tag)[1] for tag in tags.split(',')])] + domain = expression.AND([domain, [('tag_ids', 'in', [unslug(tag)[1] for tag in tags.split(',')])]]) filters = options.get('filters') if filters == 'unanswered': - domain += [('child_ids', '=', False)] + domain = expression.AND([domain, [('child_ids', '=', False)]]) elif filters == 'solved': - domain += [('has_validated_answer', '=', True)] + domain = expression.AND([domain, [('has_validated_answer', '=', True)]]) elif filters == 'unsolved': - domain += [('has_validated_answer', '=', False)] + domain = expression.AND([domain, [('has_validated_answer', '=', False)]]) user = self.env.user my = options.get('my') - if my == 'mine': - domain += [('create_uid', '=', user.id)] - elif my == 'followed': - domain += [('message_partner_ids', '=', user.partner_id.id)] + create_uid = user.id if my == 'mine' else options.get('create_uid') + if create_uid: + domain = expression.AND([domain, [('create_uid', '=', create_uid)]]) + if my == 'followed': + domain = expression.AND([domain, [('message_partner_ids', '=', user.partner_id.id)]]) elif my == 'tagged': - domain += [('tag_ids.message_partner_ids', '=', user.partner_id.id)] + domain = expression.AND([domain, [('tag_ids.message_partner_ids', '=', user.partner_id.id)]]) elif my == 'favourites': - domain += [('favourite_ids', '=', user.id)] + domain = expression.AND([domain, [('favourite_ids', '=', user.id)]]) + elif my == 'upvoted': + domain = expression.AND([domain, [('vote_ids.user_id', '=', user.id)]]) # 'sorting' from the form's "Order by" overrides order during auto-completion order = options.get('sorting', order) diff --git a/addons/website_forum/views/forum_forum_templates.xml b/addons/website_forum/views/forum_forum_templates.xml index 6b1334196d4..664f1e7df43 100644 --- a/addons/website_forum/views/forum_forum_templates.xml +++ b/addons/website_forum/views/forum_forum_templates.xml @@ -23,17 +23,17 @@ - - Replies + + Replies - - Views + + Views - + Activity @@ -45,7 +45,8 @@ posts - + + diff --git a/addons/website_forum/views/forum_forum_templates_layout.xml b/addons/website_forum/views/forum_forum_templates_layout.xml index 1bd9211baf8..6a9d5860150 100644 --- a/addons/website_forum/views/forum_forum_templates_layout.xml +++ b/addons/website_forum/views/forum_forum_templates_layout.xml @@ -18,6 +18,9 @@