MDL-57411 groups: New helper functions

- groups_get_groups_members
- groups_get_activity_shared_group_members
This commit is contained in:
Juan Leyva
2017-03-31 09:04:58 +02:00
parent b0f3e6d618
commit a7d9c5373e
3 changed files with 181 additions and 8 deletions
+45 -4
View File
@@ -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);
}
+134
View File
@@ -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);
}
}
+2 -4
View File
@@ -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);
}
}