Odoo18-Base/extra-addons/website_helpdesk/models/helpdesk.py

158 lines
6.6 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime, timedelta
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class HelpdeskTeam(models.Model):
_name = "helpdesk.team"
_inherit = ['helpdesk.team', 'website.published.mixin', 'website.seo.metadata']
feature_form_url = fields.Char('URL to Submit Issue', readonly=True, compute='_compute_form_url', export_string_translation=False)
website_id = fields.Many2one('website', domain="[('company_id', '=?', company_id)]", compute='_compute_website_id', store=True, readonly=False)
website_menu_id = fields.Many2one('website.menu', export_string_translation=False)
website_form_view_id = fields.Many2one('ir.ui.view', export_string_translation=False)
@api.constrains('use_website_helpdesk_form', 'website_id', 'company_id')
def _check_website_company(self):
if any(t.use_website_helpdesk_form and t.website_id and t.website_id.company_id != t.company_id for t in self):
raise ValidationError(_('The companies of the team and the website should match.'))
@api.depends('company_id')
def _compute_website_id(self):
for team in self:
team.website_id = team.company_id.website_id
@api.model
def _get_knowledge_base_fields(self):
return []
@api.depends(lambda self: ['use_website_helpdesk_form'] + [f for f in self._get_knowledge_base_fields()])
def _compute_show_knowledge_base(self):
kb_fields = self._get_knowledge_base_fields()
for team in self:
team.show_knowledge_base = team.use_website_helpdesk_form and any(team[field] for field in kb_fields)
def _compute_website_url(self):
super(HelpdeskTeam, self)._compute_website_url()
for team in self:
team.website_url = "/helpdesk/%s" % self.env['ir.http']._slug(team)
@api.onchange('use_website_helpdesk_form', 'use_website_helpdesk_forum', 'use_website_helpdesk_slides', 'use_website_helpdesk_knowledge')
def _onchange_use_website_helpdesk(self):
if not (self.use_website_helpdesk_form or self.use_website_helpdesk_forum or self.use_website_helpdesk_slides or self.use_website_helpdesk_knowledge) and self.website_published:
self.is_published = False
elif self.use_website_helpdesk_form and not self.website_published:
self.is_published = True
def write(self, vals):
if 'active' in vals and not vals['active']:
vals['is_published'] = False
res = super(HelpdeskTeam, self).write(vals)
if 'use_website_helpdesk_form' in vals and vals['use_website_helpdesk_form']:
self._ensure_submit_form_view()
if {'use_website_helpdesk_form', 'is_published'} & vals.keys():
self._ensure_website_menu()
return res
@api.model_create_multi
def create(self, vals_list):
teams = super(HelpdeskTeam, self).create(vals_list)
teams.filtered('use_website_helpdesk_form')._ensure_submit_form_view()
teams._ensure_website_menu()
return teams
def unlink(self):
self.website_menu_id.unlink()
return super(HelpdeskTeam, self).unlink()
def _ensure_submit_form_view(self):
teams = self.filtered('use_website_helpdesk_form')
if not teams:
return
default_form = self.env.ref('website_helpdesk.ticket_submit_form').sudo().arch
for team in teams:
if not team.website_form_view_id:
xmlid = 'website_helpdesk.team_form_' + str(team.id)
form_template = self.env['ir.ui.view'].sudo().create({
'type': 'qweb',
'arch': default_form,
'name': xmlid,
'key': xmlid
})
self.env['ir.model.data'].sudo().create({
'module': 'website_helpdesk',
'name': xmlid.split('.')[1],
'model': 'ir.ui.view',
'res_id': form_template.id,
'noupdate': True
})
team.website_form_view_id = form_template.id
def _ensure_website_menu(self):
with_website = self.filtered_domain([('use_website_helpdesk_form', '=', True)])
without_website = self - with_website
without_website.website_menu_id.unlink()
team_count = self.env['helpdesk.team'].search_count([
('use_website_helpdesk_form', '=', True),
('website_id', '=', with_website.website_id.id)
])
if not team_count > 1 and not with_website.website_menu_id:
parent_menu = with_website.website_id.menu_id
if parent_menu:
menu = self.env['website.menu'].sudo().create({
'name': _('Help'),
'url': '/helpdesk',
'parent_id': parent_menu.id,
'sequence': 50,
'website_id': with_website.website_id.id,
})
with_website.website_menu_id = menu.id
@api.depends('name', 'use_website_helpdesk_form', 'company_id')
def _compute_form_url(self):
for team in self:
base_url = team.get_base_url()
team.feature_form_url = (team.use_website_helpdesk_form and team.name and team.id) and (base_url + '/helpdesk/' + self.env['ir.http']._slug(team)) or False
def _helpcenter_filter_types(self):
return {}
def _helpcenter_filter_tags(self, search_type):
return []
def _helpcenter_date_from_search(self, searches):
if not searches.get('date'):
return False
delta = {'7days': 7, '30days': 30, '365days': 365}.get(searches['date'])
if not delta:
return False
today = datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
return today - timedelta(days=delta)
def get_knowledge_base_url(self):
self.ensure_one()
return self.feature_form_url
def _get_search_options(self, searches):
return {
'displayDescription': True,
'displayDetail': True,
'displayExtraDetail': True,
'displayExtraLink': True,
'displayImage': False,
'allowFuzzy': True,
'helpdesk': self.env['ir.http']._slug(self),
'max_date': self._helpcenter_date_from_search(searches),
'tag': searches.get('tag', False),
}
def open_website_url(self):
return self.env['website'].get_client_action(self.website_url, website_id=self.website_id.id)