1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/website_helpdesk_forum/models/helpdesk.py
2024-12-10 09:04:09 +07:00

109 lines
5.1 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class HelpdeskTeam(models.Model):
_inherit = "helpdesk.team"
show_knowledge_base_forum = fields.Boolean(compute="_compute_show_knowledge_base_forum")
website_forum_ids = fields.Many2many('forum.forum', string='Forums', help="In the help center, customers will only be able to see posts from the selected forums.")
top_forum_posts = fields.Many2many('forum.post', string='Top Posts', help="These are the top posts in the forums associated with this helpdesk team", compute="_compute_top_forum_posts")
@api.depends('website_forum_ids')
def _compute_show_knowledge_base_forum(self):
# 'show_knowledge_base_forum' determines whether the help page of the website displays a link to forums.
# It should be true
# if the team has forums and the user has access to at least one of them,
# or the team has no forum and the user has access to at least one of all.
accessible_forums = self.env['forum.forum'].search_count([], limit=1)
accessible_all_teams_forums = set(self.sudo().website_forum_ids.sudo(False)._filter_access_rules_python('read').ids)
for team in self:
team_sudo = team.sudo()
if not team_sudo.use_website_helpdesk_forum:
team_sudo.sudo().show_knowledge_base_forum = False
continue
team_forums = set(team_sudo.sudo().website_forum_ids.ids)
accessible_team_forums = team_forums & accessible_all_teams_forums
team_sudo.sudo().show_knowledge_base_forum =\
bool(team_forums and accessible_team_forums) or bool(not team_forums and accessible_forums)
def _ensure_help_center_is_activated(self):
self.ensure_one()
if not self.show_knowledge_base_forum:
raise UserError(_('Help Center not active for this team.'))
return True
@api.model
def _get_knowledge_base_fields(self):
return super()._get_knowledge_base_fields() + ['show_knowledge_base_forum']
def _helpcenter_filter_types(self):
res = super()._helpcenter_filter_types()
if not self.show_knowledge_base_forum:
return res
res['forum_posts_only'] = _('Forum Posts')
return res
def _helpcenter_filter_tags(self, search_type):
res = super()._helpcenter_filter_tags(search_type)
if not self.show_knowledge_base_forum or (search_type and search_type != 'forum_posts_only'):
return res
tags = self.env['forum.tag'].search([
('posts_count', '>', 0),
], order='posts_count desc', limit=20)
return res + tags.mapped(lambda t: t.name and t.name.lower())
def _compute_top_forum_posts(self):
for team in self:
search_domain = [('parent_id', '=', False)]
if team.website_forum_ids:
search_domain.append(('forum_id', 'in', team.website_forum_ids.ids))
team.top_forum_posts = self.env['forum.post'].search(search_domain, order='vote_count desc, last_activity_date desc', limit=5)
class HelpdeskTicket(models.Model):
_inherit = "helpdesk.ticket"
forum_post_ids = fields.Many2many('forum.post', string="Forum Posts", copy=False)
forum_post_count = fields.Integer(compute='_compute_forum_post_count')
use_website_helpdesk_forum = fields.Boolean(related='team_id.use_website_helpdesk_forum', string='Help Center Active', readonly=True)
can_share_forum = fields.Boolean(compute='_compute_can_share_forum')
@api.depends_context('uid')
@api.depends('use_website_helpdesk_forum')
def _compute_can_share_forum(self):
forum_count = self.env['forum.forum'].search_count([])
for ticket in self:
ticket.can_share_forum = ticket.use_website_helpdesk_forum and forum_count
@api.depends_context('uid')
@api.depends('forum_post_ids')
def _compute_forum_post_count(self):
rg = self.env['forum.post']._read_group([('can_view', '=', True), ('id', 'in', self.forum_post_ids.ids)], ['ticket_id'], ['__count'])
posts_count = {ticket.id: count for ticket, count in rg}
for ticket in self:
ticket.forum_post_count = posts_count.get(ticket.id, 0)
def action_share_ticket_on_forum(self):
self.ensure_one()
self.team_id._ensure_help_center_is_activated()
return self.env['ir.actions.actions']._for_xml_id('website_helpdesk_forum.helpdesk_ticket_select_forum_wizard_action')
def action_open_forum_posts(self, edit=False):
self.ensure_one()
self.team_id._ensure_help_center_is_activated()
if not self.forum_post_ids:
raise UserError(_('No posts associated to this ticket.'))
if len(self.forum_post_ids) > 1:
action = self.env['ir.actions.actions']._for_xml_id('website_forum.forum_post_action_forum_main')
action['domain'] = [('id', 'in', self.forum_post_ids.ids)]
return action
return self.forum_post_ids.open_forum_post(edit)