MDL-81951 communication_matrix: Fix suspended users ignored bug
The implementation of this bug fix is slightly different on 403 branch compared to later branches due to major changes that were applied to communication with the addition of hooks and helpers.
This commit is contained in:
@@ -628,8 +628,9 @@ class communication_feature implements
|
||||
if (!empty($forceremoval)) {
|
||||
// Remove the users from the power levels if they are not admins.
|
||||
foreach ($forceremoval as $userid) {
|
||||
if ($newuserpowerlevels < matrix_constants::POWER_LEVEL_MAXIMUM) {
|
||||
unset($newuserpowerlevels[$userid]);
|
||||
$muid = matrix_user_manager::get_matrixid_from_moodle($userid);
|
||||
if (isset($newuserpowerlevels[$muid]) && $newuserpowerlevels[$muid] < matrix_constants::POWER_LEVEL_MAXIMUM) {
|
||||
unset($newuserpowerlevels[$muid]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -639,7 +640,6 @@ class communication_feature implements
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Update the power levels for the room.
|
||||
$this->matrixapi->update_room_power_levels(
|
||||
roomid: $this->get_room_id(),
|
||||
|
||||
@@ -568,4 +568,73 @@ class communication_feature_test extends \advanced_testcase {
|
||||
unset_config('matrixaccesstoken', 'communication_matrix');
|
||||
$this->assertFalse($communicationprocessor->get_room_provider()->is_configured());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test inactive users are not included when being mapped to a new communication instance.
|
||||
*/
|
||||
public function test_inactive_users_are_not_mapped_to_new_communication(): void {
|
||||
// Create a course without a communication provider set.
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
|
||||
// Enrol some users that are both active and inactive (suspended).
|
||||
$user1 = $this->getDataGenerator()->create_user();
|
||||
$user2 = $this->getDataGenerator()->create_user();
|
||||
$user3 = $this->getDataGenerator()->create_user();
|
||||
$user4 = $this->getDataGenerator()->create_user();
|
||||
|
||||
$this->getDataGenerator()->enrol_user(
|
||||
userid: $user1->id,
|
||||
courseid: $course->id,
|
||||
roleidorshortname: 'teacher',
|
||||
);
|
||||
|
||||
$this->getDataGenerator()->enrol_user(
|
||||
userid: $user2->id,
|
||||
courseid: $course->id,
|
||||
roleidorshortname: 'student',
|
||||
);
|
||||
|
||||
$this->getDataGenerator()->enrol_user(
|
||||
userid: $user3->id,
|
||||
courseid: $course->id,
|
||||
roleidorshortname: 'teacher',
|
||||
status: ENROL_USER_SUSPENDED,
|
||||
);
|
||||
|
||||
$this->getDataGenerator()->enrol_user(
|
||||
userid: $user4->id,
|
||||
courseid: $course->id,
|
||||
roleidorshortname: 'student',
|
||||
status: ENROL_USER_SUSPENDED,
|
||||
);
|
||||
|
||||
// Set Matrix as the communication provider and update.
|
||||
$course->selectedcommunication = 'communication_matrix';
|
||||
$course->communication_matrixroomname = 'testroom';
|
||||
update_course($course);
|
||||
|
||||
$communicationprocessor = processor::load_by_instance(
|
||||
context: \core\context\course::instance($course->id),
|
||||
component: 'core_course',
|
||||
instancetype: 'coursecommunication',
|
||||
instanceid: $course->id
|
||||
);
|
||||
|
||||
$userids = $communicationprocessor->get_all_userids_for_instance();
|
||||
|
||||
$this->assertEquals(
|
||||
expected: 2,
|
||||
actual: count($userids),
|
||||
);
|
||||
|
||||
$this->assertContains(
|
||||
needle: $user1->id,
|
||||
haystack: $userids,
|
||||
);
|
||||
|
||||
$this->assertContains(
|
||||
needle: $user2->id,
|
||||
haystack: $userids,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2562,6 +2562,12 @@ function update_course($data, $editoroptions = NULL) {
|
||||
// Newly created providers complete the user mapping but do not queue the task
|
||||
// (it will be handled by the room creation task).
|
||||
if ($addusersrequired) {
|
||||
// Ensure only active users are added to the room.
|
||||
$activeusers = array_column(
|
||||
enrol_get_course_users(courseid: $data->id, onlyactive: true),
|
||||
'id',
|
||||
);
|
||||
$enrolledusers = array_intersect($activeusers, $enrolledusers);
|
||||
$communication->add_members_to_room($enrolledusers, $instanceexists);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user