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 20ab811fb..7a8a939f7 100644
--- a/addons_extensions/project_task_timesheet_extended/models/project_task.py
+++ b/addons_extensions/project_task_timesheet_extended/models/project_task.py
@@ -165,6 +165,7 @@ class projectTask(models.Model):
has_supervisor_access = fields.Boolean(compute="_compute_has_supervisor_access")
+ show_reassign_button = fields.Boolean(compute="_compute_show_reassign_button")
actual_hours = fields.Float(
string="Actual Hours",
compute="_compute_actual_hours",
@@ -539,6 +540,20 @@ class projectTask(models.Model):
if current_user.has_group("project.group_project_manager") or current_user == task.project_id.user_id or current_user == task.project_id.project_lead or (current_user.id in list(set(create_access_users.ids)) and task.stage_id.id == first_stage.id):
task.has_supervisor_access = True
+
+ @api.depends("project_id", "project_id.user_id", "project_id.project_lead")
+ 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 (
+ is_admin
+ or current_user == task.project_id.user_id
+ or current_user == task.project_id.project_lead
+ )
+ )
@api.depends('assignees_timelines.estimated_time', 'show_approval_flow')
def _compute_estimated_hours(self):
for task in self:
@@ -702,6 +717,12 @@ class projectTask(models.Model):
key=lambda s: s.sequence)[:1]
approval_not_required = False
+ can_skip_approval_stage = (
+ user in task.involved_user_ids
+ or user in [project_manager, project_lead]
+ or user.has_group("project.group_project_manager")
+ or user.has_group("base.group_system")
+ )
# Compute buttons visibility
if current_timeline:
@@ -720,7 +741,7 @@ class projectTask(models.Model):
if (
approval_not_required
- and user in task.involved_user_ids
+ and can_skip_approval_stage
and task.approval_status != "submitted"
):
task.show_submission_button = True
@@ -749,7 +770,7 @@ class projectTask(models.Model):
else:
approval_not_required = True
- if user in task.involved_user_ids and task.approval_status != "submitted":
+ if can_skip_approval_stage and task.approval_status != "submitted":
task.show_submission_button = True
task.show_skip_approval_button = True
@@ -1203,9 +1224,10 @@ class projectTask(models.Model):
def _append_reassignment_history(self, stage, users, reason):
self.ensure_one()
formatted_datetime = self._get_current_datetime_formatted()
- entry = "[%s] Stage: %s | Users: %s | Reason: %s" % (
+ entry = "[%s] Stage: %s | Assigned By: %s | Assigned To: %s | Reason: %s" % (
formatted_datetime,
stage.name,
+ self.env.user.name,
", ".join(users.mapped('name')),
reason or "",
)
@@ -1216,6 +1238,8 @@ class projectTask(models.Model):
def action_open_reassign_wizard(self):
self.ensure_one()
+ if not self.show_reassign_button:
+ raise UserError(_("Only the project manager, project lead, or administrator can re-assign assignees."))
return {
"type": "ir.actions.act_window",
"name": _("Re-Assign Assignees"),
@@ -1903,3 +1927,4 @@ class projectTaskTimelines(models.Model):
+
diff --git a/addons_extensions/project_task_timesheet_extended/view/project_by_module.xml b/addons_extensions/project_task_timesheet_extended/view/project_by_module.xml
index 44add9dcc..995411bb9 100644
--- a/addons_extensions/project_task_timesheet_extended/view/project_by_module.xml
+++ b/addons_extensions/project_task_timesheet_extended/view/project_by_module.xml
@@ -40,6 +40,7 @@
project.task.search.project.by.module
project.task
+
@@ -82,3 +83,4 @@
+
diff --git a/addons_extensions/project_task_timesheet_extended/view/project_task.xml b/addons_extensions/project_task_timesheet_extended/view/project_task.xml
index d9af7df6e..929ee2850 100644
--- a/addons_extensions/project_task_timesheet_extended/view/project_task.xml
+++ b/addons_extensions/project_task_timesheet_extended/view/project_task.xml
@@ -29,7 +29,7 @@
-
+
@@ -120,6 +120,7 @@
+
show_approval_flow or state in ['1_canceled','04_waiting_normal'] or record_paused
@@ -213,7 +214,9 @@
-
+
+
+
@@ -308,3 +311,4 @@
+