186 lines
7.6 KiB
Python
186 lines
7.6 KiB
Python
# Part of Flectra See LICENSE file for full copyright and licensing details.
|
|
|
|
from flectra import api, fields, models, _
|
|
|
|
|
|
class HelpdeskTicket(models.Model):
|
|
_name = 'helpdesk.ticket'
|
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
|
_order = 'id desc'
|
|
_description = 'Helpdesk Ticket'
|
|
|
|
@api.model
|
|
def _get_default_state(self):
|
|
if self.team_id and self.team_id.stage_ids:
|
|
return self.team_id.stage_ids[0]
|
|
|
|
active = fields.Boolean('Active', default=True)
|
|
color = fields.Integer(string='Color Index')
|
|
name = fields.Char('Name', translate=True)
|
|
sequence = fields.Char('Sequence', default='New', copy=False)
|
|
priority = fields.Selection([('1', 'Low'), ('2', 'Medium'),
|
|
('3', 'High')], default='1')
|
|
user_id = fields.Many2one('res.users', string='Created By',
|
|
track_visibility='onchange')
|
|
partner_id = fields.Many2one(
|
|
'res.partner', store=True, related='user_id.partner_id',
|
|
string='Related Partner', track_visibility='onchange')
|
|
email = fields.Char(
|
|
string='Email',
|
|
default=lambda s: s.env.user.partner_id.email or False)
|
|
issue_type_id = fields.Many2one('issue.type', string='Issue Type',
|
|
track_visibility='onchange')
|
|
team_id = fields.Many2one('helpdesk.team', 'Team',
|
|
track_visibility='onchange')
|
|
assigned_to_id = fields.Many2one('res.users', string='Assigned To',
|
|
track_visibility='onchange')
|
|
tag_ids = fields.Many2many('helpdesk.tag', string='Tag(s)')
|
|
start_date = fields.Datetime(
|
|
string='Start Date', default=fields.Datetime.now,
|
|
track_visibility='onchange')
|
|
end_date = fields.Datetime(
|
|
string='End Date', default=fields.Datetime.now,
|
|
track_visibility='onchange')
|
|
description = fields.Text(string='Description', size=128, translate=True,
|
|
track_visibility='onchange')
|
|
attachment_ids = fields.One2many(
|
|
'ir.attachment', compute='_compute_attachments',
|
|
string="Main Attachments",
|
|
help="Attachment that don't come from message.")
|
|
attachments_count = fields.Integer(compute='_compute_attachments',
|
|
string='Add Attachments')
|
|
is_accessible = fields.Boolean('Is Accessible',
|
|
compute='_compute_is_accessible')
|
|
is_assigned = fields.Boolean('Is Accessible',
|
|
compute='_compute_is_accessible')
|
|
stage_id = fields.Many2one('helpdesk.stage', string='Stage',
|
|
default=_get_default_state,
|
|
track_visibility='onchange')
|
|
|
|
@api.multi
|
|
def _track_subtype(self, init_values):
|
|
self.ensure_one()
|
|
if 'assigned_to_id' in init_values and self.assigned_to_id:
|
|
# assigned -> new
|
|
return 'helpdesk_basic.mt_issue_new'
|
|
elif 'stage_id' in init_values and self.stage_id and \
|
|
self.stage_id.sequence <= 1: # start stage -> new
|
|
return 'helpdesk_basic.mt_issue_new'
|
|
elif 'stage_id' in init_values:
|
|
return 'helpdesk_basic.mt_issue_stage'
|
|
return super(HelpdeskTicket, self)._track_subtype(init_values)
|
|
|
|
def add_followers(self):
|
|
followers = []
|
|
followers.append(self.assigned_to_id.id)
|
|
followers.append(self.user_id.id)
|
|
self.message_subscribe_users(user_ids=followers)
|
|
|
|
@api.model
|
|
def create(self, values):
|
|
if not values.get('user_id'):
|
|
values.update({'user_id': self.env.user.id})
|
|
if 'sequence' not in values or values['sequence'] == _('New'):
|
|
values['sequence'] = self.env['ir.sequence'].next_by_code(
|
|
'helpdesk.ticket') or _('New')
|
|
if values.get('team_id'):
|
|
team = self.team_id.browse(values.get('team_id'))
|
|
values.update(
|
|
{'stage_id': team.stage_ids and team.stage_ids[0].id or False})
|
|
res = super(HelpdeskTicket, self).create(values)
|
|
if not res.stage_id and res.team_id and res.team_id.stage_ids:
|
|
res.stage_id = res.team_id.stage_ids[0]
|
|
res.add_followers()
|
|
return res
|
|
|
|
@api.multi
|
|
def write(self, vals):
|
|
if vals.get('partner_id', False) or vals.get('assigned_to_id', False):
|
|
self.add_followers()
|
|
return super(HelpdeskTicket, self).write(vals)
|
|
|
|
@api.onchange('team_id')
|
|
def onchange_team_id(self):
|
|
self.assigned_to_id = False
|
|
if self.team_id:
|
|
self.stage_id = \
|
|
self.team_id.stage_ids and self.team_id.stage_ids.ids[0]
|
|
return {'domain': {
|
|
'assigned_to_id':
|
|
[('id', 'in', self.team_id.member_ids and
|
|
self.team_id.member_ids.ids or [])],
|
|
'stage_id':
|
|
[('id', 'in', self.team_id.stage_ids and
|
|
self.team_id.stage_ids.ids or [])]
|
|
}}
|
|
|
|
@api.onchange('issue_type_id')
|
|
def onchange_issue_type_id(self):
|
|
self.team_id = False
|
|
if self.issue_type_id:
|
|
self.description = self.issue_type_id.reporting_template or ''
|
|
return {'domain': {'team_id': [('issue_type_ids', 'in',
|
|
self.issue_type_id.id)]}}
|
|
|
|
@api.multi
|
|
def _compute_is_accessible(self):
|
|
has_group = self.env.user.has_group('base.group_no_one')
|
|
for ticket in self:
|
|
if self.env.user.partner_id.id == ticket.partner_id.id or \
|
|
has_group:
|
|
ticket.is_accessible = True
|
|
if self.env.user.id == ticket.assigned_to_id.id or has_group:
|
|
ticket.is_assigned = True
|
|
|
|
@api.multi
|
|
def _compute_attachments(self):
|
|
for ticket in self:
|
|
attachment_ids = self.env['ir.attachment'].search(
|
|
[('res_model', '=', ticket._name),
|
|
('res_id', '=', ticket.id)])
|
|
ticket.attachments_count = len(attachment_ids.ids)
|
|
ticket.attachment_ids = attachment_ids
|
|
|
|
@api.multi
|
|
def action_get_attachments(self):
|
|
self.ensure_one()
|
|
return {
|
|
'name': _('Attachments'),
|
|
'res_model': 'ir.attachment',
|
|
'type': 'ir.actions.act_window',
|
|
'view_mode': 'kanban,form',
|
|
'view_type': 'form',
|
|
'domain': [('res_model', '=', self._name),
|
|
('res_id', '=', self.id)],
|
|
'context': "{'default_res_model': '%s','default_res_id': %d}" % (
|
|
self._name, self.id),
|
|
}
|
|
|
|
@api.multi
|
|
def action_get_issue_type(self):
|
|
form_id = self.env.ref('helpdesk_basic.view_issue_type_form')
|
|
tree_id = self.env.ref('helpdesk_basic.view_issue_type_tree')
|
|
return {
|
|
'name': 'Issue Types',
|
|
'type': 'ir.actions.act_window',
|
|
'view_type': 'form',
|
|
'view_mode': 'tree,form',
|
|
'res_model': 'issue.type',
|
|
'views': [(tree_id.id, 'tree'), (form_id.id, 'form'), ],
|
|
'domain': [('id', '=', self.issue_type_id.id)],
|
|
}
|
|
|
|
@api.multi
|
|
def action_get_team(self):
|
|
form_id = self.env.ref('helpdesk_basic.helpdesk_team_form_view')
|
|
tree_id = self.env.ref('helpdesk_basic.helpdesk_team_tree_view')
|
|
return {
|
|
'name': 'Helpdesk Teams',
|
|
'type': 'ir.actions.act_window',
|
|
'view_type': 'form',
|
|
'view_mode': 'tree,form',
|
|
'res_model': 'helpdesk.team',
|
|
'views': [(tree_id.id, 'tree'), (form_id.id, 'form'), ],
|
|
'domain': [('id', '=', self.team_id.id)],
|
|
}
|