diff --git a/awx/main/access.py b/awx/main/access.py index 8a5d647f6d..460dfe7b4c 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -1625,11 +1625,11 @@ class WorkflowJobAccess(BaseAccess): def can_change(self, obj, data): return False + @check_superuser def can_delete(self, obj): - if obj.workflow_job_template is None: - # only superusers can delete orphaned workflow jobs - return self.user.is_superuser - return self.user in obj.workflow_job_template.admin_role + return (obj.workflow_job_template and + obj.workflow_job_template.organization and + self.user in obj.workflow_job_template.organization.admin_role) def get_method_capability(self, method, obj, parent_obj): if method == 'start': diff --git a/awx/main/tests/functional/test_rbac_workflow.py b/awx/main/tests/functional/test_rbac_workflow.py index f2ce04404f..8d363305d5 100644 --- a/awx/main/tests/functional/test_rbac_workflow.py +++ b/awx/main/tests/functional/test_rbac_workflow.py @@ -86,11 +86,15 @@ class TestWorkflowJobTemplateNodeAccess: @pytest.mark.django_db class TestWorkflowJobAccess: - def test_wfjt_admin_delete(self, wfjt, workflow_job, rando): - wfjt.admin_role.members.add(rando) - access = WorkflowJobAccess(rando) + def test_org_admin_can_delete_workflow_job(self, workflow_job, org_admin): + access = WorkflowJobAccess(org_admin) assert access.can_delete(workflow_job) + def test_wfjt_admin_can_delete_workflow_job(self, workflow_job, rando): + workflow_job.workflow_job_template.admin_role.members.add(rando) + access = WorkflowJobAccess(rando) + assert not access.can_delete(workflow_job) + def test_cancel_your_own_job(self, wfjt, workflow_job, rando): wfjt.execute_role.members.add(rando) workflow_job.created_by = rando