mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 16:36:37 +02:00
MDL-46524: Auto-create groups from existing group or grouping membership
This commit is contained in:
parent
40f0ad21a3
commit
e4ebf7ef0f
6 changed files with 165 additions and 11 deletions
|
@ -85,7 +85,17 @@ if ($editform->is_cancelled()) {
|
|||
default:
|
||||
print_error('unknoworder');
|
||||
}
|
||||
$users = groups_get_potential_members($data->courseid, $data->roleid, $data->cohortid, $orderby, !empty($data->notingroup));
|
||||
$source = array();
|
||||
if ($data->cohortid) {
|
||||
$source['cohortid'] = $data->cohortid;
|
||||
}
|
||||
if ($data->groupingid) {
|
||||
$source['groupingid'] = $data->groupingid;
|
||||
}
|
||||
if ($data->groupid) {
|
||||
$source['groupid'] = $data->groupid;
|
||||
}
|
||||
$users = groups_get_potential_members($data->courseid, $data->roleid, $source, $orderby, !empty($data->notingroup));
|
||||
$usercnt = count($users);
|
||||
|
||||
if ($data->allocateby == 'random') {
|
||||
|
|
|
@ -99,6 +99,37 @@ class autogroup_form extends moodleform {
|
|||
$mform->setType('cohortid', PARAM_INT);
|
||||
$mform->setConstant('cohortid', '0');
|
||||
}
|
||||
|
||||
if ($groupings = groups_get_all_groupings($COURSE->id)) {
|
||||
$options = array();
|
||||
$options[0] = get_string('none');
|
||||
foreach ($groupings as $grouping) {
|
||||
$options[$grouping->id] = format_string($grouping->name);
|
||||
}
|
||||
$mform->addElement('select', 'groupingid', get_string('selectfromgrouping', 'group'), $options);
|
||||
$mform->setDefault('groupingid', 0);
|
||||
$mform->disabledIf('groupingid', 'notingroup', 'checked');
|
||||
} else {
|
||||
$mform->addElement('hidden', 'groupingid');
|
||||
$mform->setType('groupingid', PARAM_INT);
|
||||
$mform->setConstant('groupingid', 0);
|
||||
}
|
||||
|
||||
if ($groups = groups_get_all_groups($COURSE->id)) {
|
||||
$options = array();
|
||||
$options[0] = get_string('none');
|
||||
foreach ($groups as $group) {
|
||||
$options[$group->id] = format_string($group->name);
|
||||
}
|
||||
$mform->addElement('select', 'groupid', get_string('selectfromgroup', 'group'), $options);
|
||||
$mform->setDefault('groupid', 0);
|
||||
$mform->disabledIf('groupid', 'notingroup', 'checked');
|
||||
} else {
|
||||
$mform->addElement('hidden', 'groupid');
|
||||
$mform->setType('groupid', PARAM_INT);
|
||||
$mform->setConstant('groupid', 0);
|
||||
}
|
||||
|
||||
$options = array('no' => get_string('noallocation', 'group'),
|
||||
'random' => get_string('random', 'group'),
|
||||
'firstname' => get_string('byfirstname', 'group'),
|
||||
|
@ -111,6 +142,8 @@ class autogroup_form extends moodleform {
|
|||
$mform->disabledIf('nosmallgroups', 'groupby', 'noteq', 'members');
|
||||
|
||||
$mform->addElement('checkbox', 'notingroup', get_string('notingroup', 'group'));
|
||||
$mform->disabledIf('notingroup', 'groupingid', 'neq', 0);
|
||||
$mform->disabledIf('notingroup', 'groupid', 'neq', 0);
|
||||
|
||||
$mform->addElement('header', 'groupinghdr', get_string('grouping', 'group'));
|
||||
|
||||
|
@ -156,7 +189,17 @@ class autogroup_form extends moodleform {
|
|||
$errors = parent::validation($data, $files);
|
||||
|
||||
if ($data['allocateby'] != 'no') {
|
||||
if (!$users = groups_get_potential_members($data['courseid'], $data['roleid'], $data['cohortid'])) {
|
||||
$source = array();
|
||||
if ($data['cohortid']) {
|
||||
$source['cohortid'] = $data['cohortid'];
|
||||
}
|
||||
if ($data['groupingid']) {
|
||||
$source['groupingid'] = $data['groupingid'];
|
||||
}
|
||||
if ($data['groupid']) {
|
||||
$source['groupid'] = $data['groupid'];
|
||||
}
|
||||
if (!$users = groups_get_potential_members($data['courseid'], $data['roleid'], $source)) {
|
||||
$errors['roleid'] = get_string('nousersinrole', 'group');
|
||||
}
|
||||
|
||||
|
|
|
@ -707,12 +707,12 @@ function groups_get_possible_roles($context) {
|
|||
*
|
||||
* @param int $courseid The id of the course
|
||||
* @param int $roleid The role to select users from
|
||||
* @param int $cohortid restrict to cohort id
|
||||
* @param mixed $source restrict to cohort, grouping or group id
|
||||
* @param string $orderby The column to sort users by
|
||||
* @param int $notingroup restrict to users not in existing groups
|
||||
* @return array An array of the users
|
||||
*/
|
||||
function groups_get_potential_members($courseid, $roleid = null, $cohortid = null,
|
||||
function groups_get_potential_members($courseid, $roleid = null, $source = null,
|
||||
$orderby = 'lastname ASC, firstname ASC',
|
||||
$notingroup = null) {
|
||||
global $DB;
|
||||
|
@ -749,18 +749,34 @@ function groups_get_potential_members($courseid, $roleid = null, $cohortid = nul
|
|||
$where = "";
|
||||
}
|
||||
|
||||
if ($cohortid) {
|
||||
$cohortjoin = "JOIN {cohort_members} cm ON (cm.userid = u.id AND cm.cohortid = :cohortid)";
|
||||
$params['cohortid'] = $cohortid;
|
||||
$sourcejoin = "";
|
||||
if (is_int($source)) {
|
||||
$sourcejoin .= "JOIN {cohort_members} cm ON (cm.userid = u.id AND cm.cohortid = :cohortid) ";
|
||||
$params['cohortid'] = $source;
|
||||
} else {
|
||||
$cohortjoin = "";
|
||||
// Auto-create groups from an existing cohort membership.
|
||||
if (isset($source['cohortid'])) {
|
||||
$sourcejoin .= "JOIN {cohort_members} cm ON (cm.userid = u.id AND cm.cohortid = :cohortid) ";
|
||||
$params['cohortid'] = $source['cohortid'];
|
||||
}
|
||||
// Auto-create groups from an existing group membership.
|
||||
if (isset($source['groupid'])) {
|
||||
$sourcejoin .= "JOIN {groups_members} gp ON (gp.userid = u.id AND gp.groupid = :groupid) ";
|
||||
$params['groupid'] = $source['groupid'];
|
||||
}
|
||||
// Auto-create groups from an existing grouping membership.
|
||||
if (isset($source['groupingid'])) {
|
||||
$sourcejoin .= "JOIN {groupings_groups} gg ON gg.groupingid = :groupingid ";
|
||||
$sourcejoin .= "JOIN {groups_members} gm ON (gm.userid = u.id AND gm.groupid = gg.groupid) ";
|
||||
$params['groupingid'] = $source['groupingid'];
|
||||
}
|
||||
}
|
||||
|
||||
$allusernamefields = get_all_user_name_fields(true, 'u');
|
||||
$sql = "SELECT u.id, u.username, $allusernamefields, u.idnumber
|
||||
$sql = "SELECT DISTINCT u.id, u.username, $allusernamefields, u.idnumber
|
||||
FROM {user} u
|
||||
JOIN ($esql) e ON e.id = u.id
|
||||
$cohortjoin
|
||||
$sourcejoin
|
||||
$where
|
||||
ORDER BY $orderby";
|
||||
|
||||
|
|
|
@ -109,3 +109,33 @@ Feature: Automatic creation of groups
|
|||
And I press "Submit"
|
||||
And the "groups" select box should contain "Group A (3)"
|
||||
And the "groups" select box should contain "Group B (3)"
|
||||
|
||||
@javascript
|
||||
Scenario: Split users into groups based on existing groups or groupings
|
||||
Given I set the following fields to these values:
|
||||
| Naming scheme | Group @ |
|
||||
| Auto create based on | Number of groups |
|
||||
| Group/member count | 2 |
|
||||
| Grouping of auto-created groups | No grouping |
|
||||
And I press "Submit"
|
||||
And I press "Auto-create groups"
|
||||
And I set the following fields to these values:
|
||||
| Naming scheme | Test @ |
|
||||
| Auto create based on | Number of groups |
|
||||
| Group/member count | 2 |
|
||||
| groupid | Group A |
|
||||
| Grouping of auto-created groups | New grouping |
|
||||
| Grouping name | Sub Grouping |
|
||||
And I press "Submit"
|
||||
And the "groups" select box should contain "Test A (3)"
|
||||
And the "groups" select box should contain "Test B (2)"
|
||||
And I press "Auto-create groups"
|
||||
And I set the following fields to these values:
|
||||
| Naming scheme | Test # |
|
||||
| Auto create based on | Number of groups |
|
||||
| Group/member count | 2 |
|
||||
| Select members from grouping | Sub Grouping |
|
||||
| Grouping of auto-created groups | No grouping |
|
||||
And I press "Submit"
|
||||
And the "groups" select box should contain "Test 1 (3)"
|
||||
And the "groups" select box should contain "Test 2 (2)"
|
|
@ -406,4 +406,57 @@ class core_group_lib_testcase extends advanced_testcase {
|
|||
$this->assertTrue($DB->record_exists('groupings', array('id' => $grouping1c2->id, 'courseid' => $course2->id)));
|
||||
$this->assertFalse($DB->record_exists('groupings_groups', array('groupid' => $group1->id, 'groupingid' => $grouping1->id)));
|
||||
}
|
||||
|
||||
public function test_groups_create_autogroups () {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$group1 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
|
||||
$group2 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
|
||||
$group3 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
|
||||
$grouping1 = $this->getDataGenerator()->create_grouping(array('courseid' => $course->id));
|
||||
$this->getDataGenerator()->create_grouping_group(array('groupid' => $group2->id, 'groupingid' => $grouping1->id));
|
||||
$this->getDataGenerator()->create_grouping_group(array('groupid' => $group3->id, 'groupingid' => $grouping1->id));
|
||||
$user1 = $this->getDataGenerator()->create_user();
|
||||
$user2 = $this->getDataGenerator()->create_user();
|
||||
$user3 = $this->getDataGenerator()->create_user();
|
||||
$user4 = $this->getDataGenerator()->create_user();
|
||||
$this->getDataGenerator()->enrol_user($user1->id, $course->id);
|
||||
$this->getDataGenerator()->enrol_user($user2->id, $course->id);
|
||||
$this->getDataGenerator()->enrol_user($user3->id, $course->id);
|
||||
$this->getDataGenerator()->enrol_user($user4->id, $course->id);
|
||||
$this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $user1->id));
|
||||
$this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $user2->id));
|
||||
$this->getDataGenerator()->create_group_member(array('groupid' => $group2->id, 'userid' => $user3->id));
|
||||
$this->getDataGenerator()->create_group_member(array('groupid' => $group3->id, 'userid' => $user4->id));
|
||||
|
||||
// Test autocreate group based on all course users.
|
||||
$users = groups_get_potential_members($course->id);
|
||||
$group4 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
|
||||
foreach ($users as $user) {
|
||||
$this->getDataGenerator()->create_group_member(array('groupid' => $group4->id, 'userid' => $user->id));
|
||||
}
|
||||
$this->assertEquals(4, $DB->count_records('groups_members', array('groupid' => $group4->id)));
|
||||
|
||||
// Test autocreate group based on existing group.
|
||||
$source = array();
|
||||
$source['groupid'] = $group1->id;
|
||||
$users = groups_get_potential_members($course->id, 0, $source);
|
||||
$group5 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
|
||||
foreach ($users as $user) {
|
||||
$this->getDataGenerator()->create_group_member(array('groupid' => $group5->id, 'userid' => $user->id));
|
||||
}
|
||||
$this->assertEquals(2, $DB->count_records('groups_members', array('groupid' => $group5->id)));
|
||||
|
||||
// Test autocreate group based on existing grouping.
|
||||
$source = array();
|
||||
$source['groupingid'] = $grouping1->id;
|
||||
$users = groups_get_potential_members($course->id, 0, $source);
|
||||
$group6 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
|
||||
foreach ($users as $user) {
|
||||
$this->getDataGenerator()->create_group_member(array('groupid' => $group6->id, 'userid' => $user->id));
|
||||
}
|
||||
$this->assertEquals(2, $DB->count_records('groups_members', array('groupid' => $group6->id)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -174,6 +174,8 @@ $string['removefromgroupconfirm'] = 'Do you really want to remove user "{$a->use
|
|||
$string['removegroupingsmembers'] = 'Remove all groups from groupings';
|
||||
$string['removegroupsmembers'] = 'Remove all group members';
|
||||
$string['removeselectedusers'] = 'Remove selected users';
|
||||
$string['selectfromgroup'] = 'Select members from group';
|
||||
$string['selectfromgrouping'] = 'Select members from grouping';
|
||||
$string['selectfromrole'] = 'Select members with role';
|
||||
$string['showgroupsingrouping'] = 'Show groups in grouping';
|
||||
$string['showmembersforgroup'] = 'Show members for group';
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue