From d7dadb59743ae1ff5e78b588fbbd0e87d361734a Mon Sep 17 00:00:00 2001 From: karuna Date: Mon, 13 Jul 2026 18:14:19 +0530 Subject: [PATCH] enhancements of Reuqesttimelines --- .../models/project_task.py | 9 +-- .../models/task_stages.py | 16 +++++- .../wizards/task_reject_reason_wizard.py | 56 ++++--------------- .../wizards/task_reject_reason_wizard.xml | 3 +- 4 files changed, 31 insertions(+), 53 deletions(-) diff --git a/addons_extensions/project_task_timesheet_extended/models/project_task.py b/addons_extensions/project_task_timesheet_extended/models/project_task.py index db8703113..ea70716d9 100644 --- a/addons_extensions/project_task_timesheet_extended/models/project_task.py +++ b/addons_extensions/project_task_timesheet_extended/models/project_task.py @@ -506,6 +506,7 @@ class projectTask(models.Model): self.env.user.name, task.suggested_deadline.strftime('%Y-%m-%d %H:%M') if task.suggested_deadline else _('Not available') )) + task._sync_involved_assignees_from_timelines() @api.depends("project_id", "stage_id") def _compute_has_supervisor_access(self): @@ -541,13 +542,14 @@ class projectTask(models.Model): task.has_supervisor_access = True - @api.depends("project_id", "project_id.user_id", "project_id.project_lead") + @api.depends("project_id", "project_id.user_id", "project_id.project_lead", "timelines_requested") def _compute_show_reassign_button(self): current_user = self.env.user is_admin = current_user.has_group("base.group_system") or current_user.has_group("project.group_project_manager") for task in self: task.show_reassign_button = bool( task.project_id + and task.timelines_requested and ( is_admin or current_user == task.project_id.user_id @@ -1196,7 +1198,7 @@ class projectTask(models.Model): else: if update_assignees: self.sudo().write({'user_ids': [(6, 0, selected_users.ids)]}) - self.sudo().write({'involved_user_ids': [(6, 0, selected_users.ids)]}) + self._sync_involved_assignees_from_timelines() action = _("Re-assigned") if reassignment else _("Timeline users selected") note = _("%s: %s") % (action, "; ".join(notes)) if reason: @@ -1325,8 +1327,7 @@ class projectTask(models.Model): + task.assignees_timelines.assigned_to.ids + task.assignees_timelines.team_id.team_lead.ids ) - existing_user_ids = set(task.involved_user_ids.ids) - involved_users = list((existing_user_ids | timeline_user_ids) - set(task.user_ids.ids)) + involved_users = list(timeline_user_ids - set(task.user_ids.ids)) task.involved_user_ids = [(6, 0, involved_users)] @api.model diff --git a/addons_extensions/project_task_timesheet_extended/models/task_stages.py b/addons_extensions/project_task_timesheet_extended/models/task_stages.py index 3792c12ea..655d6ac8e 100644 --- a/addons_extensions/project_task_timesheet_extended/models/task_stages.py +++ b/addons_extensions/project_task_timesheet_extended/models/task_stages.py @@ -16,7 +16,11 @@ class TaskStages(models.Model): related='team_id.team_lead', readonly=True, ) - team_related_user_ids = fields.Many2many(related='team_id.all_members_ids', string='Team Users') + team_related_user_ids = fields.Many2many( + 'res.users', + string='Team Users', + compute='_compute_team_related_user_ids', + ) is_workflow_template = fields.Boolean( string='Workflow Template Stage', default=False, @@ -27,11 +31,17 @@ class TaskStages(models.Model): @api.onchange('team_id') def onchange_team_id(self): for rec in self: - if rec.team_id and rec.team_id.all_members_ids: - rec.involved_user_ids = [(6,0,rec.team_id.all_members_ids.ids)] + if rec.team_id and (rec.team_id.all_members_ids or rec.team_id.team_lead): + users = rec.team_id.all_members_ids | rec.team_id.team_lead + rec.involved_user_ids = [(6, 0, users.ids)] else: rec.involved_user_ids = [(5, 0, 0)] + @api.depends('team_id', 'team_id.all_members_ids', 'team_id.team_lead') + def _compute_team_related_user_ids(self): + for rec in self: + rec.team_related_user_ids = rec.team_id.all_members_ids | rec.team_id.team_lead + def _is_project_owned_stage(self, project): self.ensure_one() return ( diff --git a/addons_extensions/project_task_timesheet_extended/wizards/task_reject_reason_wizard.py b/addons_extensions/project_task_timesheet_extended/wizards/task_reject_reason_wizard.py index 0622c2039..1dd0191ac 100644 --- a/addons_extensions/project_task_timesheet_extended/wizards/task_reject_reason_wizard.py +++ b/addons_extensions/project_task_timesheet_extended/wizards/task_reject_reason_wizard.py @@ -119,32 +119,17 @@ class TaskRequestTimelinesWizardLine(models.TransientModel): def _get_project_involved_users(self): self.ensure_one() - users = self.env["res.users"] - task = self.task_id - project = task.project_id - if project: - users |= project.members_ids | project.user_id | project.project_lead | project.project_sponsor - if self.stage_id: - users |= self.stage_id.involved_user_ids - if self.stage_id.team_id: - users |= self.stage_id.team_id.team_lead | self.stage_id.team_id.all_members_ids - if task: - users |= task.user_ids | task.involved_user_ids + users = self.stage_id.involved_user_ids if self.stage_id else self.env["res.users"] + if self.stage_id and self.stage_id.team_id: + users |= self.stage_id.team_id.all_members_ids | self.stage_id.team_id.team_lead return users.filtered(lambda user: user.active and not user.share) @api.depends( "stage_id", "stage_id.involved_user_ids", "stage_id.team_id", - "stage_id.team_id.team_lead", "stage_id.team_id.all_members_ids", - "task_id", - "task_id.user_ids", - "task_id.involved_user_ids", - "task_id.project_id.members_ids", - "task_id.project_id.user_id", - "task_id.project_id.project_lead", - "task_id.project_id.project_sponsor", + "stage_id.team_id.team_lead", ) def _compute_available_user_ids(self): for line in self: @@ -172,7 +157,7 @@ class TaskReassignAssigneesWizard(models.TransientModel): values["line_ids"] = [ (0, 0, { "stage_id": stage.id, - "user_id": task.assignees_timelines.filtered(lambda line: line.stage_id == stage)[:1].assigned_to.id, + "responsible_user_id": task._get_stage_responsible_user(stage).id, }) for stage in default_stage ] @@ -195,11 +180,6 @@ class TaskReassignAssigneesWizard(models.TransientModel): users |= wizard.task_id.project_id.members_ids | wizard.task_id.project_id.user_id | wizard.task_id.project_id.project_lead | wizard.task_id.project_id.project_sponsor wizard.available_user_ids = [(6, 0, users.filtered(lambda u: u.active and not u.share).ids)] - def _get_default_user_for_stage(self, stage): - self.ensure_one() - timeline = self.task_id.assignees_timelines.filtered(lambda line: line.stage_id == stage)[:1] - return timeline.assigned_to.id if timeline else False - def _preferred_existing_line(self, stage): self.ensure_one() lines = self.line_ids.filtered(lambda line: line.stage_id == stage) @@ -217,7 +197,7 @@ class TaskReassignAssigneesWizard(models.TransientModel): else: lines |= Line.new({ "stage_id": stage.id, - "user_id": wizard._get_default_user_for_stage(stage), + "responsible_user_id": wizard.task_id._get_stage_responsible_user(stage).id, }) wizard.line_ids = lines @@ -239,38 +219,24 @@ class TaskReassignAssigneesWizardLine(models.TransientModel): wizard_id = fields.Many2one("task.reassign.assignees.wizard", required=True, ondelete="cascade") task_id = fields.Many2one(related="wizard_id.task_id", store=False) stage_id = fields.Many2one("project.task.type", string="Stage") + responsible_user_id = fields.Many2one("res.users", string="Responsible User") user_id = fields.Many2one("res.users", string="New Assignee") reason = fields.Text(string="Reason") available_user_ids = fields.Many2many("res.users", compute="_compute_available_user_ids") def _get_project_involved_users(self): self.ensure_one() - users = self.env["res.users"] - task = self.task_id - project = task.project_id - if project: - users |= project.members_ids | project.user_id | project.project_lead | project.project_sponsor - if self.stage_id: - users |= self.stage_id.involved_user_ids - if self.stage_id.team_id: - users |= self.stage_id.team_id.team_lead | self.stage_id.team_id.all_members_ids - if task: - users |= task.user_ids | task.involved_user_ids + users = self.stage_id.involved_user_ids if self.stage_id else self.env["res.users"] + if self.stage_id and self.stage_id.team_id: + users |= self.stage_id.team_id.all_members_ids | self.stage_id.team_id.team_lead return users.filtered(lambda user: user.active and not user.share) @api.depends( "stage_id", "stage_id.involved_user_ids", "stage_id.team_id", - "stage_id.team_id.team_lead", "stage_id.team_id.all_members_ids", - "task_id", - "task_id.user_ids", - "task_id.involved_user_ids", - "task_id.project_id.members_ids", - "task_id.project_id.user_id", - "task_id.project_id.project_lead", - "task_id.project_id.project_sponsor", + "stage_id.team_id.team_lead", ) def _compute_available_user_ids(self): for line in self: diff --git a/addons_extensions/project_task_timesheet_extended/wizards/task_reject_reason_wizard.xml b/addons_extensions/project_task_timesheet_extended/wizards/task_reject_reason_wizard.xml index 172787ec9..3086acdca 100644 --- a/addons_extensions/project_task_timesheet_extended/wizards/task_reject_reason_wizard.xml +++ b/addons_extensions/project_task_timesheet_extended/wizards/task_reject_reason_wizard.xml @@ -79,7 +79,7 @@ - + @@ -105,6 +105,7 @@ +