diff --git a/admin/tool/policy/classes/external/get_user_acceptances.php b/admin/tool/policy/classes/external/get_user_acceptances.php index 227e22f6754..ba3f2541689 100644 --- a/admin/tool/policy/classes/external/get_user_acceptances.php +++ b/admin/tool/policy/classes/external/get_user_acceptances.php @@ -118,6 +118,11 @@ class get_user_acceptances extends external_api { [$policy['acceptance']['note']] = util::format_text($version->acceptance->note, FORMAT_MOODLE, $systemcontext); } } + // Return permission for actions for the current policy and user. + $policy['canaccept'] = api::can_accept_policies([$version->id], $user->id); + $policy['candecline'] = api::can_decline_policies([$version->id], $user->id); + $policy['canrevoke'] = api::can_revoke_policies([$version->id], $user->id); + $policies[] = $policy; } } @@ -157,6 +162,9 @@ class get_user_acceptances extends external_api { 'note' => new external_value(PARAM_TEXT, 'The policy note/remarks.', VALUE_OPTIONAL), 'modfullname' => new external_value(PARAM_NOTAGS, 'The fullname who accepted on behalf.', VALUE_OPTIONAL), ], 'Acceptance status for the given user.', VALUE_OPTIONAL), + 'canaccept' => new external_value(PARAM_BOOL, 'Whether the policy can be accepted.'), + 'candecline' => new external_value(PARAM_BOOL, 'Whether the policy can be declined.'), + 'canrevoke' => new external_value(PARAM_BOOL, 'Whether the policy can be revoked.'), ]), 'Policies and acceptance status for the given user.', VALUE_OPTIONAL ), 'warnings' => new external_warnings(), diff --git a/admin/tool/policy/tests/externallib_test.php b/admin/tool/policy/tests/externallib_test.php index 9796b2fae00..1d782741fad 100644 --- a/admin/tool/policy/tests/externallib_test.php +++ b/admin/tool/policy/tests/externallib_test.php @@ -271,9 +271,15 @@ class externallib_test extends externallib_advanced_testcase { if ($policy['versionid'] == $this->policy2->get('id')) { $this->assertEquals($this->policy2->get('name'), $policy['name']); $this->assertEquals(0, $policy['optional']); + $this->assertTrue($policy['canaccept']); + $this->assertFalse($policy['candecline']); // Cannot decline or revoke mandatory for myself. + $this->assertFalse($policy['canrevoke']); } else { $this->assertEquals($optionalpolicy->get('name'), $policy['name']); $this->assertEquals(1, $policy['optional']); + $this->assertTrue($policy['canaccept']); + $this->assertTrue($policy['candecline']); // Can decline or revoke optional for myself. + $this->assertTrue($policy['canrevoke']); } $this->assertNotContains('acceptance', $policy); // Nothing accepted yet. } @@ -285,6 +291,18 @@ class externallib_test extends externallib_advanced_testcase { $policies = \core_external\external_api::clean_returnvalue( \tool_policy\external\get_user_acceptances::execute_returns(), $policies); $this->assertCount(2, $policies['policies']); + foreach ($policies['policies'] as $policy) { + if ($policy['versionid'] == $this->policy2->get('id')) { + $this->assertTrue($policy['canaccept']); + $this->assertFalse($policy['candecline']); // Cannot decline mandatory in general. + $this->assertTrue($policy['canrevoke']); + } else { + $this->assertTrue($policy['canaccept']); + $this->assertTrue($policy['candecline']); + $this->assertTrue($policy['canrevoke']); + } + $this->assertNotContains('acceptance', $policy); // Nothing accepted yet. + } // Get other user acceptances without permission. $this->expectException(\required_capability_exception::class);