MDL-57411 groups: New helper functions
- groups_get_groups_members - groups_get_activity_shared_group_members
This commit is contained in:
+45
-4
@@ -426,10 +426,7 @@ function groups_has_membership($cm, $userid=null) {
|
||||
function groups_get_members($groupid, $fields='u.*', $sort='lastname ASC') {
|
||||
global $DB;
|
||||
|
||||
return $DB->get_records_sql("SELECT $fields
|
||||
FROM {user} u, {groups_members} gm
|
||||
WHERE u.id = gm.userid AND gm.groupid = ?
|
||||
ORDER BY $sort", array($groupid));
|
||||
return groups_get_groups_members([$groupid], $fields, $sort);
|
||||
}
|
||||
|
||||
|
||||
@@ -1133,3 +1130,47 @@ function groups_user_groups_visible($course, $userid, $cm = null) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the users in the specified groups.
|
||||
*
|
||||
* @param array $groupsids The list of groups ids to check
|
||||
* @param int $fields The fields to return
|
||||
* @param int $sort optional sorting of returned users
|
||||
* @return array|bool Returns an array of the users for the specified group or false if no users or an error returned.
|
||||
* @since Moodle 3.3
|
||||
*/
|
||||
function groups_get_groups_members($groupsids, $fields='u.*', $sort='lastname ASC') {
|
||||
global $DB;
|
||||
|
||||
list($insql, $params) = $DB->get_in_or_equal($groupsids);
|
||||
|
||||
return $DB->get_records_sql("SELECT $fields
|
||||
FROM {user} u, {groups_members} gm
|
||||
WHERE u.id = gm.userid AND gm.groupid $insql
|
||||
GROUP BY u.id
|
||||
ORDER BY $sort", $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns users who share group membership with the specified user in the given actiivty.
|
||||
*
|
||||
* @param stdClass|cm_info $cm course module
|
||||
* @param int $userid user id (empty for current user)
|
||||
* @return array a list of user
|
||||
* @since Moodle 3.3
|
||||
*/
|
||||
function groups_get_activity_shared_group_members($cm, $userid = null) {
|
||||
global $USER;
|
||||
|
||||
if (empty($userid)) {
|
||||
$userid = $USER;
|
||||
}
|
||||
|
||||
$groupsids = array_keys(groups_get_activity_allowed_groups($cm, $userid));
|
||||
// No groups no users.
|
||||
if (empty($groupsids)) {
|
||||
return [];
|
||||
}
|
||||
return groups_get_groups_members($groupsids);
|
||||
}
|
||||
|
||||
@@ -1388,4 +1388,138 @@ class core_grouplib_testcase extends advanced_testcase {
|
||||
$result = groups_user_groups_visible($course, $user1->id, $cm);
|
||||
$this->assertTrue($result); // Cm with visible groups.
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests for groups_get_groups_members() method.
|
||||
*/
|
||||
public function test_groups_get_groups_members() {
|
||||
$this->resetAfterTest(true);
|
||||
$generator = $this->getDataGenerator();
|
||||
|
||||
// Create courses.
|
||||
$course1 = $generator->create_course();
|
||||
$course2 = $generator->create_course();
|
||||
|
||||
// Create users.
|
||||
$user1 = $generator->create_user();
|
||||
$user2 = $generator->create_user();
|
||||
$user3 = $generator->create_user();
|
||||
|
||||
// Enrol users.
|
||||
$generator->enrol_user($user1->id, $course1->id);
|
||||
$generator->enrol_user($user1->id, $course2->id);
|
||||
$generator->enrol_user($user2->id, $course2->id);
|
||||
$generator->enrol_user($user3->id, $course2->id);
|
||||
|
||||
// Create groups.
|
||||
$group1 = $generator->create_group(array('courseid' => $course1->id));
|
||||
$group2 = $generator->create_group(array('courseid' => $course2->id));
|
||||
$group3 = $generator->create_group(array('courseid' => $course2->id));
|
||||
|
||||
// Assign users to groups.
|
||||
$this->assertTrue($generator->create_group_member(array('groupid' => $group1->id, 'userid' => $user1->id)));
|
||||
$this->assertTrue($generator->create_group_member(array('groupid' => $group2->id, 'userid' => $user1->id)));
|
||||
$this->assertTrue($generator->create_group_member(array('groupid' => $group2->id, 'userid' => $user2->id)));
|
||||
|
||||
// Test get_groups_members.
|
||||
$members = groups_get_groups_members([$group1->id, $group2->id], 'u.*', 'id ASC');
|
||||
$this->assertCount(2, $members);
|
||||
$this->assertEquals([$user1->id, $user2->id], array_keys($members));
|
||||
|
||||
// Group with just one.
|
||||
$members = groups_get_groups_members([$group1->id]);
|
||||
$this->assertCount(1, $members);
|
||||
$this->assertEquals($user1->id, $members[$user1->id]->id);
|
||||
|
||||
// Group with just one plus empty group.
|
||||
$members = groups_get_groups_members([$group1->id, $group3->id]);
|
||||
$this->assertCount(1, $members);
|
||||
$this->assertEquals($user1->id, $members[$user1->id]->id);
|
||||
|
||||
// Empty group.
|
||||
$members = groups_get_groups_members([$group3->id]);
|
||||
$this->assertCount(0, $members);
|
||||
|
||||
// Test groups_get_members.
|
||||
$members = groups_get_members($group2->id, 'u.*', 'id ASC');
|
||||
$this->assertCount(2, $members);
|
||||
$this->assertEquals([$user1->id, $user2->id], array_keys($members));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests for groups_get_activity_shared_group_members() method.
|
||||
*/
|
||||
public function test_groups_get_activity_shared_group_members() {
|
||||
$this->resetAfterTest(true);
|
||||
$generator = $this->getDataGenerator();
|
||||
|
||||
// Create courses.
|
||||
$course = $generator->create_course();
|
||||
|
||||
// Create cm.
|
||||
$assign = $generator->create_module("assign", array('course' => $course->id));
|
||||
$cm = get_coursemodule_from_instance("assign", $assign->id);
|
||||
|
||||
// Create users.
|
||||
$user1 = $generator->create_user();
|
||||
$user2 = $generator->create_user();
|
||||
$user3 = $generator->create_user();
|
||||
$user4 = $generator->create_user();
|
||||
|
||||
// Enrol users.
|
||||
$generator->enrol_user($user1->id, $course->id);
|
||||
$generator->enrol_user($user2->id, $course->id);
|
||||
$generator->enrol_user($user3->id, $course->id);
|
||||
$generator->enrol_user($user4->id, $course->id);
|
||||
|
||||
// Create groups.
|
||||
$group1 = $generator->create_group(array('courseid' => $course->id));
|
||||
$group2 = $generator->create_group(array('courseid' => $course->id));
|
||||
$group3 = $generator->create_group(array('courseid' => $course->id));
|
||||
|
||||
// Assign users to groups.
|
||||
$generator->create_group_member(array('groupid' => $group1->id, 'userid' => $user1->id));
|
||||
$generator->create_group_member(array('groupid' => $group2->id, 'userid' => $user1->id));
|
||||
$generator->create_group_member(array('groupid' => $group2->id, 'userid' => $user2->id));
|
||||
$generator->create_group_member(array('groupid' => $group3->id, 'userid' => $user3->id));
|
||||
|
||||
// Retrieve users sharing groups with user1.
|
||||
$members = groups_get_activity_shared_group_members($cm, $user1->id);
|
||||
$this->assertCount(2, $members);
|
||||
$this->assertEquals([$user1->id, $user2->id], array_keys($members), '', 0.0, 10, true);
|
||||
|
||||
// Retrieve users sharing groups with user2.
|
||||
$members = groups_get_activity_shared_group_members($cm, $user2->id);
|
||||
$this->assertCount(2, $members);
|
||||
$this->assertEquals([$user1->id, $user2->id], array_keys($members), '', 0.0, 10, true);
|
||||
|
||||
// Retrieve users sharing groups with user3.
|
||||
$members = groups_get_activity_shared_group_members($cm, $user3->id);
|
||||
$this->assertCount(1, $members);
|
||||
$this->assertEquals($user3->id, $members[$user3->id]->id);
|
||||
|
||||
// Retrieve users sharing groups with user without groups (user4).
|
||||
$members = groups_get_activity_shared_group_members($cm, $user4->id);
|
||||
$this->assertCount(0, $members);
|
||||
|
||||
// Now, create a different activity using groupings.
|
||||
$grouping = $generator->create_grouping(array('courseid' => $course->id, 'name' => 'Grouping 1'));
|
||||
// Skip group 2.
|
||||
groups_assign_grouping($grouping->id, $group1->id);
|
||||
groups_assign_grouping($grouping->id, $group3->id);
|
||||
|
||||
$assign = $generator->create_module("assign", array('course' => $course->id, 'groupingid' => $grouping->id));
|
||||
$cm = get_coursemodule_from_instance("assign", $assign->id);
|
||||
|
||||
// Since the activity is forced to groupings (groups 1 and 3), I don't see members of group 2.
|
||||
$members = groups_get_activity_shared_group_members($cm, $user1->id);
|
||||
$this->assertCount(1, $members);
|
||||
$this->assertEquals($user1->id, $members[$user1->id]->id);
|
||||
|
||||
// Add user1 to group 3 (in the grouping).
|
||||
$generator->create_group_member(array('groupid' => $group3->id, 'userid' => $user1->id));
|
||||
$members = groups_get_activity_shared_group_members($cm, $user1->id);
|
||||
$this->assertCount(2, $members); // Now I see members of group 3.
|
||||
$this->assertEquals([$user1->id, $user3->id], array_keys($members), '', 0.0, 10, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5543,10 +5543,8 @@ class assign {
|
||||
public function get_shared_group_members($cm, $userid) {
|
||||
if (!isset($this->sharedgroupmembers[$userid])) {
|
||||
$this->sharedgroupmembers[$userid] = array();
|
||||
$groupsids = array_keys(groups_get_activity_allowed_groups($cm, $userid));
|
||||
foreach ($groupsids as $groupid) {
|
||||
$members = array_keys(groups_get_members($groupid, 'u.id'));
|
||||
$this->sharedgroupmembers[$userid] = array_merge($this->sharedgroupmembers[$userid], $members);
|
||||
if ($members = groups_get_activity_shared_group_members($cm, $userid)) {
|
||||
$this->sharedgroupmembers[$userid] = array_keys($members);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user