forked from Mapan/odoo17e
109 lines
5.1 KiB
Python
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)
|