From 66a9262009ab7b062bc2a1c4965ed3d2c837434c Mon Sep 17 00:00:00 2001 From: luve-odoo Date: Mon, 8 May 2023 09:31:05 +0200 Subject: [PATCH] [IMP] project: sub-tasks/task convertion action Before this commit, the conversion from a subtask to a standalone task or the opposite was possible in debug mode. In order to provide for users a way to convert task to subtask or the opposite without polluting the interface, a action is added. Also, when the user clicks on search more on a many2one field pointing on `project.task`, if the active_model and the active_id are defined then if we will try to load the last update status by using `active_id` even if `active_model` is not the `project.project` model. This commit adds a action that opens a form dialog. The user can choose to put a parent task or not. If not, the task becomes a standalone task. Otherwise, the selected parent task becomes the parent. This commit adds also an additional check before loading and displaying the last update status of the project active to be sure the `active_id` is the id of a project, that is, `active_model` has to be equal to `project.project` to be able to load the last project update status. Moreover, a UI change in the stat button showing the number of subtask is modified in order to display also the number of closed sub tasks. task-3251617 closes odoo/odoo#120911 Signed-off-by: Xavier Bol (xbo) --- addons/project/models/project_task.py | 22 +++++++++- addons/project/views/project_task_views.xml | 47 ++++++++++++++++++++- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/addons/project/models/project_task.py b/addons/project/models/project_task.py index 01360b31fdb..657a4158dca 100644 --- a/addons/project/models/project_task.py +++ b/addons/project/models/project_task.py @@ -190,7 +190,7 @@ class Task(models.Model): # In the domain of displayed_image_id, we couln't use attachment_ids because a one2many is represented as a list of commands so we used res_model & res_id displayed_image_id = fields.Many2one('ir.attachment', domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]", string='Cover Image') - parent_id = fields.Many2one('project.task', string='Parent Task', index=True, domain="['!', ('id', 'child_of', id)]") + parent_id = fields.Many2one('project.task', string='Parent Task', index=True, domain="['!', ('id', 'child_of', id)]", tracking=True) child_ids = fields.One2many('project.task', 'parent_id', string="Sub-tasks", domain="[('recurring_task', '=', False)]") subtask_count = fields.Integer("Sub-task Count", compute='_compute_subtask_count') closed_subtask_count = fields.Integer("Closed Sub-tasks Count", compute='_compute_subtask_count') @@ -1564,6 +1564,26 @@ class Task(models.Model): self.recurrence_id.task_ids.recurring_task = False self.recurrence_id.unlink() + def action_convert_to_subtask(self): + self.ensure_one() + if self.project_id: + return { + 'name': _('Convert to Task/Sub-Task'), + 'type': 'ir.actions.act_window', + 'res_model': 'project.task', + 'res_id': self.id, + 'views': [(self.env.ref('project.project_task_convert_to_subtask_view_form', False).id, 'form')], + 'target': 'new', + } + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'type': 'danger', + 'message': _('Private tasks cannot be converted into sub-tasks. Please set a project for the task to gain access to this feature.'), + } + } + # --------------------------------------------------- # Rating business # --------------------------------------------------- diff --git a/addons/project/views/project_task_views.xml b/addons/project/views/project_task_views.xml index b61e3054db6..62131f10958 100644 --- a/addons/project/views/project_task_views.xml +++ b/addons/project/views/project_task_views.xml @@ -291,7 +291,20 @@