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 1a1754b8e..28c173e88 100644 --- a/addons_extensions/project_task_timesheet_extended/models/project_task.py +++ b/addons_extensions/project_task_timesheet_extended/models/project_task.py @@ -198,7 +198,7 @@ class projectTask(models.Model): all_internal_users = Users.search([('share', '=', False)]) for task in self: - # no project → all internal + # no project → all internal if not task.project_id: task.assignee_domain_ids = all_internal_users continue @@ -841,7 +841,7 @@ class projectTask(models.Model): task.stage_id = n_stage task.approval_status = "approved" - activity_log = "%s: ✅ approved by %s and moved to %s" % ( + activity_log = "%s: ✅ approved by %s and moved to %s" % ( current_stage.name, self.env.user.employee_id.name, n_stage.name) @@ -849,7 +849,7 @@ class projectTask(models.Model): # Use the helper method to add activity log task._add_activity_log(activity_log) - user_notes = "%s: ✅ moved to %s and awaiting your completion" % ( + user_notes = "%s: ✅ moved to %s and awaiting your completion" % ( task.sequence_name, n_stage.name ) @@ -882,9 +882,9 @@ class projectTask(models.Model): ) else: task.approval_status = "approved" - notes = "%s: ✅ Task approved and completed by %s" % (task.sequence_name, self.env.user.employee_id.name) + notes = "%s: ✅ Task approved and completed by %s" % (task.sequence_name, self.env.user.employee_id.name) - activity_log = "%s: ✅ approved by %s" % ( + activity_log = "%s: ✅ approved by %s" % ( current_stage.name, self.env.user.employee_id.name) @@ -920,9 +920,9 @@ class projectTask(models.Model): # Optional: find previous stage if you want to send back stage = task.assignees_timelines.filtered(lambda s: s.stage_id == task.stage_id) - notes = "%s: ❌ %s rejected by %s" % (task.sequence_name, current_stage.name, self.env.user.employee_id.name) + notes = "%s: ❌ %s rejected by %s" % (task.sequence_name, current_stage.name, self.env.user.employee_id.name) - activity_log = "%s: ❌ rejected by %s: %s" % ( + activity_log = "%s: ❌ rejected by %s: %s" % ( current_stage.name, self.env.user.employee_id.name, reason) @@ -1053,7 +1053,7 @@ class projectTask(models.Model): if reassignment: self._append_reassignment_history(stage, users, reason) - def _apply_task_stage_user_lines(self, lines, reason=False, reassignment=False): + def _apply_task_stage_user_lines(self, lines, reason=False, reassignment=False, update_assignees=True): self.ensure_one() self._ensure_task_timeline_rows() selected_users = self.env['res.users'] @@ -1061,6 +1061,7 @@ class projectTask(models.Model): for wizard_line in lines: stage = wizard_line.stage_id users = wizard_line.user_ids + responsible_user = getattr(wizard_line, 'responsible_user_id', False) if not stage or not users: continue selected_users |= users @@ -1069,7 +1070,7 @@ class projectTask(models.Model): if timeline: timeline.sudo().write({ 'assigned_to': primary_user.id, - 'responsible_lead': timeline.responsible_lead.id or primary_user.id, + 'responsible_lead': responsible_user.id if responsible_user else timeline.responsible_lead.id or primary_user.id, 'team_id': stage.team_id.id if stage.team_id else timeline.team_id.id, }) notes.append(_("%s: %s") % (stage.name, ", ".join(users.mapped('name')))) @@ -1080,7 +1081,8 @@ class projectTask(models.Model): if not selected_users: raise UserError(_("Please select at least one user.")) - self.sudo().write({'user_ids': [(6, 0, selected_users.ids)]}) + if update_assignees: + self.sudo().write({'user_ids': [(6, 0, selected_users.ids)]}) self.sudo().write({'involved_user_ids': [(6, 0, selected_users.ids)]}) action = _("Re-assigned") if reassignment else _("Timeline users selected") note = _("%s: %s") % (action, "; ".join(notes)) 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 981f3380b..a1871758c 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 @@ -84,6 +84,7 @@ class TaskRequestTimelinesWizard(models.TransientModel): values["line_ids"] = [ (0, 0, { "stage_id": line.stage_id.id, + "responsible_user_id": line.responsible_lead.id, "user_ids": [(6, 0, line.assigned_to.ids)], }) for line in task.assignees_timelines.sorted(lambda l: l.stage_sequence) @@ -97,7 +98,7 @@ class TaskRequestTimelinesWizard(models.TransientModel): if not selected_lines: raise UserError(_("Please select users for at least one stage.")) self.task_id.sudo().timelines_requested = True - self.task_id._apply_task_stage_user_lines(selected_lines, reassignment=False) + self.task_id._apply_task_stage_user_lines(selected_lines, reassignment=False, update_assignees=False) return {"type": "ir.actions.act_window_close"} @@ -107,8 +108,9 @@ class TaskRequestTimelinesWizardLine(models.TransientModel): wizard_id = fields.Many2one("task.request.timelines.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", required=True) - user_ids = fields.Many2many("res.users", string="Assigned To") + stage_id = fields.Many2one("project.task.type", string="Stage") + responsible_user_id = fields.Many2one("res.users", string="Responsible User") + user_ids = fields.Many2many("res.users", string="Assignees") available_user_ids = fields.Many2many("res.users", compute="_compute_available_user_ids") @api.depends("stage_id", "task_id") @@ -201,7 +203,7 @@ 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", required=True) + stage_id = fields.Many2one("project.task.type", string="Stage") user_ids = fields.Many2many("res.users", string="New Assignees") available_user_ids = fields.Many2many("res.users", compute="_compute_available_user_ids") 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 bee17f1ad..8cd260de3 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 @@ -77,9 +77,10 @@ - + + - +