Odoo18-Base/enterprise-17.0/helpdesk_fsm/models/project_task.py
2025-01-06 10:57:38 +07:00

77 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details
from odoo import api, models, fields
class Task(models.Model):
_inherit = 'project.task'
helpdesk_ticket_id = fields.Many2one('helpdesk.ticket', string='Original Ticket', index='btree_not_null', readonly=True)
# Project Sharing fields
display_helpdesk_ticket_button = fields.Boolean('Display Ticket', compute='_compute_display_helpdesk_ticket_button')
@property
def SELF_READABLE_FIELDS(self):
return super().SELF_READABLE_FIELDS | {'helpdesk_ticket_id', 'display_helpdesk_ticket_button'}
@api.depends_context('uid')
@api.depends('helpdesk_ticket_id')
def _compute_display_helpdesk_ticket_button(self):
is_portal = self.user_has_groups('base.group_portal')
if is_portal:
tickets = self.env['helpdesk.ticket'].search([('id', 'in', self.helpdesk_ticket_id.ids)])
for task in self:
task.display_helpdesk_ticket_button = task.helpdesk_ticket_id in tickets if is_portal else bool(task.helpdesk_ticket_id)
def action_project_sharing_view_ticket(self):
self.ensure_one()
if not self.display_helpdesk_ticket_button:
return {}
return {
"name": "Portal Ticket",
"type": "ir.actions.act_url",
"url": self.helpdesk_ticket_id.get_portal_url(),
}
def write(self, vals):
previous_states_fsm_done = None
previous_states_state = None
if 'fsm_done' in vals:
previous_states_fsm_done = {task: task.fsm_done for task in self}
if 'state' in vals:
previous_states_state = {task: task.state for task in self}
res = super().write(vals)
if 'fsm_done' in vals:
tracked_tasks = self.filtered(
lambda t: t.fsm_done and t.helpdesk_ticket_id.use_fsm and previous_states_fsm_done[t] != t.fsm_done)
subtype = self.env.ref('helpdesk_fsm.mt_ticket_task_done')
for task in tracked_tasks:
task.helpdesk_ticket_id.sudo().message_post(
body=task._get_html_link(),
subtype_id=subtype.id,
)
return res
if vals.get('state', False) in ['1_done', '1_canceled']:
tracked_tasks = self.filtered(
lambda t: t.helpdesk_ticket_id.use_fsm and previous_states_state[t] != t.state)
for task in tracked_tasks:
subtype = self.env.ref('helpdesk_fsm.mt_ticket_task_{}'.format(task.state[2:]))
task.helpdesk_ticket_id.sudo().message_post(
body=task._get_html_link(),
subtype_id=subtype.id,
)
return res
@api.model_create_multi
def create(self, vals_list):
tasks = super().create(vals_list)
for task in tasks.filtered('helpdesk_ticket_id'):
task.message_post_with_source(
'helpdesk.ticket_creation',
render_values={'self': task, 'ticket': task.helpdesk_ticket_id},
subtype_xmlid='mail.mt_note',
)
return tasks