bemade-addons/nuke_mid_task/models/project_task.py
2025-09-10 10:35:23 -04:00

75 lines
2.6 KiB
Python

from odoo import models, api, fields, _
from odoo.exceptions import UserError
class ProjectTask(models.Model):
_inherit = 'project.task'
can_be_nuked = fields.Boolean(
compute='_compute_can_be_nuked',
help="Technical field to determine if task can be nuked"
)
@api.depends('parent_id', 'child_ids')
def _compute_can_be_nuked(self):
"""Compute if the task can be nuked based on parent and children presence"""
for task in self:
task.can_be_nuked = bool(task.parent_id and task.child_ids)
def action_nuke_task(self):
"""
Nuke the current task:
1. Verify the task can be nuked
2. Get parent and children
3. Reassign all children to the parent
4. Update children names to include nuked task name
5. Post messages in the chatter
6. Delete the current task
7. Return action to redirect to parent task
"""
self.ensure_one()
if not self.can_be_nuked:
raise UserError(_("This task cannot be nuked. It must have both a parent and child tasks."))
parent = self.parent_id
children = self.child_ids
nuked_name = self.name
# Post message to parent about the upcoming changes
parent.message_post(
body=_(
"The following task has been nuked: %(task)s\n"
"%(count)d child tasks have been reassigned to this task."
) % {
'task': nuked_name,
'count': len(children)
}
)
# Reassign all children to the parent, update their names and notify them
for child in children:
old_name = child.name
# Update name to include nuked task's name
child.write({
'name': f"[{nuked_name}] {old_name}",
'parent_id': parent.id
})
child.message_post(
body=_("This task has been reassigned to %(new_parent)s due to the removal of %(old_parent)s.\nTask name updated from '%(old_name)s' to '%(new_name)s'") % {
'new_parent': parent.name,
'old_parent': nuked_name,
'old_name': old_name,
'new_name': child.name
}
)
# Delete the current task
self.unlink()
# Return action to redirect to parent task
return {
'type': 'ir.actions.act_window',
'res_model': 'project.task',
'res_id': parent.id,
'view_mode': 'form',
'target': 'current',
}