mirror of
https://github.com/moodle/moodle.git
synced 2025-04-14 13:02:07 +02:00
groups/autogroup: Allocate members to groups more fairly
Author: Matt Clarkson <mattc@catalyst.net.nz>
This commit is contained in:
parent
b89a70ce8a
commit
e34f620386
@ -11,6 +11,8 @@
|
||||
require_once('../config.php');
|
||||
require_once('autogroup_form.php');
|
||||
|
||||
define('AUTOGROUP_MIN_RATIO', 0.7);
|
||||
|
||||
$courseid = required_param('courseid', PARAM_INT);
|
||||
|
||||
if (!$course = get_record('course', 'id',$courseid)) {
|
||||
@ -93,37 +95,55 @@ if ($editform->is_cancelled()) {
|
||||
$groups = array();
|
||||
$i = 0;
|
||||
$cnt = 0;
|
||||
|
||||
|
||||
// Plan the allocation
|
||||
if ($data->groupby == 'groups') {
|
||||
$numgrps = $data->number;
|
||||
$userpergrp = ceil($usercnt/$numgrps);
|
||||
} else {
|
||||
$numgrps = ceil($data->number/$usercnt);
|
||||
$userpergrp = $data->number;
|
||||
$numgrps = ceil($usercnt/$data->number);
|
||||
$userpergrp = $data->number > $usercnt ? $usercnt : $data->number;
|
||||
|
||||
// If there would be one group with a small number of member reduce the number of groups
|
||||
$remainder = $userpergrp - ($userpergrp * $numgrps - $usercnt);
|
||||
if ($remainder && $remainder < $userpergrp * AUTOGROUP_MIN_RATIO) {
|
||||
$numgrps--;
|
||||
}
|
||||
}
|
||||
|
||||
// Do the allocation
|
||||
$remainggroups = $numgrps;
|
||||
$remaingusers = $usercnt;
|
||||
|
||||
foreach($users as $id => $user) {
|
||||
if (!isset($groups[$i])) { // Create a new group
|
||||
$groups[$i]['name'] = groups_parse_name($data->namingschemegrp['namingscheme'], $i);
|
||||
}
|
||||
@$groups[$i]['members'][] = &$users[$id];
|
||||
$cnt++;
|
||||
if ($cnt == $userpergrp) {
|
||||
|
||||
if ($cnt >= round($usercnt / $remainggroups)) {
|
||||
$usercnt -= $cnt;
|
||||
$cnt = 0;
|
||||
$i++;
|
||||
$remainggroups--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (isset($data->preview)) {
|
||||
/// Print the groups preview
|
||||
$preview = '<ul>';
|
||||
$preview = '';
|
||||
if (isset($remainder) && $remainder != $userpergrp && $data->groupby == 'members') {
|
||||
$preview .= '<p>'.get_string('evenallocation', 'group').'</p>';
|
||||
}
|
||||
$preview .= '<ul>';
|
||||
foreach ($groups as $group) {
|
||||
$preview .= "<li>$group[name]\n<ul>";
|
||||
$preview .= "<li>$group[name] (".count($group['members'])." ".get_string('membersingroup', 'group').")\n<ul>";
|
||||
foreach ($group['members'] as $member) {
|
||||
$preview .= '<li>'.fullname($member).'</li>';
|
||||
}
|
||||
$preview .= "</ul>\n</li>\n";
|
||||
$preview .= "</ul><br />\n</li>\n";
|
||||
}
|
||||
$preview .= '</ul>';
|
||||
} else {
|
||||
|
@ -125,4 +125,6 @@ $string['badnamingscheme'] = 'Must contain exactly one \'@\' or one \'#\' chara
|
||||
$string['groupspreview'] = 'Groups preview';
|
||||
$string['nousersinrole'] = 'There are no suitable users in the selected role';
|
||||
$string['nogroupsassigned'] = 'No groups assigned';
|
||||
$string['evenallocation'] = 'Note: To keep group allocation even, the actual number of members per group differs from the number you specified.';
|
||||
$string['membersingroup'] = 'members';
|
||||
?>
|
||||
|
Loading…
x
Reference in New Issue
Block a user