diff --git a/admin/tool/cohortroles/classes/api.php b/admin/tool/cohortroles/classes/api.php index b3f0e541e0538..e94710feb1094 100644 --- a/admin/tool/cohortroles/classes/api.php +++ b/admin/tool/cohortroles/classes/api.php @@ -222,6 +222,48 @@ public static function sync_all_cohort_roles() { } } + // Clean the legacy role assignments which are stale. + $paramsclean['usercontext'] = CONTEXT_USER; + $paramsclean['component'] = 'tool_cohortroles'; + $sql = 'SELECT DISTINCT(ra.id), ra.roleid, ra.userid, ra.contextid, ctx.instanceid + FROM {role_assignments} ra + JOIN {context} ctx ON ctx.id = ra.contextid AND ctx.contextlevel = :usercontext + JOIN {cohort_members} cm ON cm.userid = ctx.instanceid + LEFT JOIN {tool_cohortroles} tc ON tc.cohortid = cm.cohortid + AND tc.userid = ra.userid + AND tc.roleid = ra.roleid + WHERE ra.component = :component + AND tc.id is null'; + if ($candidatelegacyassignments = $DB->get_records_sql($sql, $paramsclean)) { + $sql = 'SELECT DISTINCT(ra.id) + FROM {role_assignments} ra + JOIN {context} ctx ON ctx.id = ra.contextid AND ctx.contextlevel = :usercontext + JOIN {cohort_members} cm ON cm.userid = ctx.instanceid + JOIN {tool_cohortroles} tc ON tc.cohortid = cm.cohortid AND tc.userid = ra.userid + WHERE ra.component = :component'; + if ($currentvalidroleassignments = $DB->get_records_sql($sql, $paramsclean)) { + foreach ($candidatelegacyassignments as $candidate) { + if (!array_key_exists($candidate->id, $currentvalidroleassignments)) { + role_unassign($candidate->roleid, $candidate->userid, $candidate->contextid, 'tool_cohortroles'); + $rolesremoved[] = array( + 'useridassignedto' => $candidate->userid, + 'useridassignedover' => $candidate->instanceid, + 'roleid' => $candidate->roleid + ); + } + } + } else { + foreach ($candidatelegacyassignments as $candidate) { + role_unassign($candidate->roleid, $candidate->userid, $candidate->contextid, 'tool_cohortroles'); + $rolesremoved[] = array( + 'useridassignedto' => $candidate->userid, + 'useridassignedover' => $candidate->instanceid, + 'roleid' => $candidate->roleid + ); + } + } + } + return array('rolesadded' => $rolesadded, 'rolesremoved' => $rolesremoved); } diff --git a/admin/tool/cohortroles/classes/cohort_role_assignment.php b/admin/tool/cohortroles/classes/cohort_role_assignment.php index 08ac464107621..08255cfb119a3 100644 --- a/admin/tool/cohortroles/classes/cohort_role_assignment.php +++ b/admin/tool/cohortroles/classes/cohort_role_assignment.php @@ -103,5 +103,4 @@ protected function validate_cohortid($value) { return true; } - } diff --git a/admin/tool/cohortroles/tests/api_test.php b/admin/tool/cohortroles/tests/api_test.php index d276a2f13ed07..9127e5f985708 100644 --- a/admin/tool/cohortroles/tests/api_test.php +++ b/admin/tool/cohortroles/tests/api_test.php @@ -50,8 +50,6 @@ class tool_cohortroles_api_testcase extends advanced_testcase { * Setup function- we will create a course and add an assign instance to it. */ protected function setUp() { - global $DB; - $this->resetAfterTest(true); // Create some users. @@ -133,14 +131,36 @@ public function test_delete_cohort_role_assignment_with_invalid_data() { public function test_delete_cohort_role_assignment() { $this->setAdminUser(); - $params = (object) array( + // Create a cohort role assigment. + $params = (object) [ 'userid' => $this->userassignto->id, 'roleid' => $this->roleid, 'cohortid' => $this->cohort->id - ); - $result = api::create_cohort_role_assignment($params); - $worked = api::delete_cohort_role_assignment($result->get('id')); - $this->assertTrue($worked); + ]; + $cohortroleassignment = api::create_cohort_role_assignment($params); + $sync = api::sync_all_cohort_roles(); + $rolesadded = [ + [ + 'useridassignedto' => $this->userassignto->id, + 'useridassignedover' => $this->userassignover->id, + 'roleid' => $this->roleid + ] + ]; + $expected = [ + 'rolesadded' => $rolesadded, + 'rolesremoved' => [] + ]; + $this->assertEquals($sync, $expected); + + // Delete the cohort role assigment and confirm the roles are removed. + $result = api::delete_cohort_role_assignment($cohortroleassignment->get('id')); + $this->assertTrue($result); + $sync = api::sync_all_cohort_roles(); + $expected = [ + 'rolesadded' => [], + 'rolesremoved' => $rolesadded + ]; + $this->assertEquals($expected, $sync); } public function test_list_cohort_role_assignments() {