158 lines
6.6 KiB
Python
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)
|