Skip to content

Commit

Permalink
MDL-81007 tool_policy: Allow acceptance/decline of non-current policies
Browse files Browse the repository at this point in the history
  • Loading branch information
jleyva committed Feb 22, 2024
1 parent f8f04b6 commit 8dfef80
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 18 deletions.
17 changes: 10 additions & 7 deletions admin/tool/policy/classes/external/set_acceptances_status.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,18 +91,21 @@ public static function execute(array $policies, int $userid = 0): array {
}

// Split acceptances.
$allcurrentpolicies = api::list_current_versions(policy_version::AUDIENCE_LOGGEDIN);
$requestedpolicies = $agreepolicies = $declinepolicies = [];
foreach ($params['policies'] as $policy) {
$requestedpolicies[$policy['versionid']] = $policy['status'];
}

foreach ($allcurrentpolicies as $policy) {
if (isset($requestedpolicies[$policy->id])) {
if ($requestedpolicies[$policy->id] === 1) {
$agreepolicies[] = $policy->id;
} else if ($requestedpolicies[$policy->id] === 0) {
$declinepolicies[] = $policy->id;
// Retrieve all policies and their acceptances.
$allpolicies = api::get_policies_with_acceptances($user->id);
foreach ($allpolicies as $policy) {
foreach ($policy->versions as $version) {
if (isset($requestedpolicies[$version->id])) {
if ($requestedpolicies[$version->id] === 1) {
$agreepolicies[] = $version->id;
} else if ($requestedpolicies[$version->id] === 0) {
$declinepolicies[] = $version->id;
}
}
}
}
Expand Down
47 changes: 36 additions & 11 deletions admin/tool/policy/tests/externallib_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -260,12 +260,20 @@ public function test_external_get_user_acceptances() {
$formdata->content_editor = ['text' => 'content', 'format' => FORMAT_HTML, 'itemid' => 0];
$optionalpolicy = api::form_policydoc_add($formdata);
api::make_current($optionalpolicy->get('id'));
// Accept this version.
api::accept_policies([$optionalpolicy->get('id')], $user->id, null);
// Generate new version.
$formdata = api::form_policydoc_data($optionalpolicy);
$formdata->revision = 'v2';
$optionalpolicynew = api::form_policydoc_update_new($formdata);
api::make_current($optionalpolicynew->get('id'));

// Now return all policies the user should be able to see, including previous versions of existing policies, if accepted/declined.
$policies = \tool_policy\external\get_user_acceptances::execute();
$policies = \core_external\external_api::clean_returnvalue(
\tool_policy\external\get_user_acceptances::execute_returns(), $policies);

$this->assertCount(2, $policies['policies']);
$this->assertCount(3, $policies['policies']);
$this->assertCount(0, $policies['warnings']);
foreach ($policies['policies'] as $policy) {
if ($policy['versionid'] == $this->policy2->get('id')) {
Expand Down Expand Up @@ -329,9 +337,19 @@ public function test_external_set_acceptances_status() {
$formdata->content_editor = ['text' => 'content', 'format' => FORMAT_HTML, 'itemid' => 0];
$optionalpolicy = api::form_policydoc_add($formdata);
api::make_current($optionalpolicy->get('id'));
// Decline this version.
api::decline_policies([$optionalpolicy->get('id')], $user->id, null);
// Generate new version and make it current.
$formdata = api::form_policydoc_data($optionalpolicy);
$formdata->revision = 'v2';
$optionalpolicynew = api::form_policydoc_update_new($formdata);
api::make_current($optionalpolicynew->get('id'));

// Accept all the policies.
$ids = [['versionid' => $this->policy2->get('id'), 'status' => 1], ['versionid' => $optionalpolicy->get('id'), 'status' => 1]];
// Accept all the current policies.
$ids = [
['versionid' => $this->policy2->get('id'), 'status' => 1],
['versionid' => $optionalpolicynew->get('id'), 'status' => 1],
];

$policies = \tool_policy\external\set_acceptances_status::execute($ids);
$policies = \core_external\external_api::clean_returnvalue(
Expand All @@ -340,17 +358,24 @@ public function test_external_set_acceptances_status() {
$this->assertEquals(1, $policies['policyagreed']);
$this->assertCount(0, $policies['warnings']);

// And now accept and old one.
$ids = [['versionid' => $optionalpolicy->get('id'), 'status' => 1],];
$policies = \tool_policy\external\set_acceptances_status::execute($ids);
$policies = \core_external\external_api::clean_returnvalue(
\tool_policy\external\set_acceptances_status::execute_returns(), $policies);

// Retrieve and check all are accepted now.
$policies = \tool_policy\external\get_user_acceptances::execute();
$policies = \core_external\external_api::clean_returnvalue(
\tool_policy\external\get_user_acceptances::execute_returns(), $policies);

$this->assertCount(2, $policies['policies']);
$this->assertCount(3, $policies['policies']);
foreach ($policies['policies'] as $policy) {
$this->assertEquals(1, $policy['acceptance']['status']); // Check all accepted.
}

// Decline optional only.
$policies = \tool_policy\external\set_acceptances_status::execute([['versionid' => $optionalpolicy->get('id'), 'status' => 0]]);
$policies = \tool_policy\external\set_acceptances_status::execute([['versionid' => $optionalpolicynew->get('id'), 'status' => 0]]);
$policies = \core_external\external_api::clean_returnvalue(
\tool_policy\external\set_acceptances_status::execute_returns(), $policies);

Expand All @@ -361,19 +386,19 @@ public function test_external_set_acceptances_status() {
$policies = \core_external\external_api::clean_returnvalue(
\tool_policy\external\get_user_acceptances::execute_returns(), $policies);

$this->assertCount(2, $policies['policies']);
$this->assertCount(3, $policies['policies']);
foreach ($policies['policies'] as $policy) {
if ($policy['versionid'] == $this->policy2->get('id')) {
$this->assertEquals(1, $policy['acceptance']['status']); // Still accepted.
} else {
if ($policy['versionid'] == $optionalpolicynew->get('id')) {
$this->assertEquals(0, $policy['acceptance']['status']); // Not accepted.
} else {
$this->assertEquals(1, $policy['acceptance']['status']); // Accepted.
}
}

// Parent & child case now. Accept the optional ONLY on behalf of someone else.
$this->parent->policyagreed = 1;
$this->setUser($this->parent);
$policies = \tool_policy\external\set_acceptances_status::execute([['versionid' => $optionalpolicy->get('id'), 'status' => 1]], $this->child->id);
$policies = \tool_policy\external\set_acceptances_status::execute([['versionid' => $optionalpolicynew->get('id'), 'status' => 1]], $this->child->id);
$policies = \core_external\external_api::clean_returnvalue(
\tool_policy\external\set_acceptances_status::execute_returns(), $policies);

Expand All @@ -395,7 +420,7 @@ public function test_external_set_acceptances_status() {

// Try to accept on behalf of other user with no permissions.
$this->expectException(\required_capability_exception::class);
$policies = \tool_policy\external\set_acceptances_status::execute([['versionid' => $optionalpolicy->get('id'), 'status' => 1]], $user->id);
$policies = \tool_policy\external\set_acceptances_status::execute([['versionid' => $optionalpolicynew->get('id'), 'status' => 1]], $user->id);
}

/**
Expand Down

0 comments on commit 8dfef80

Please sign in to comment.