Skip to content

Commit

Permalink
groups/autogroup: Allocate members to groups more fairly
Browse files Browse the repository at this point in the history
Author: Matt Clarkson <mattc@catalyst.net.nz>
  • Loading branch information
mattc-catalyst committed Oct 18, 2007
1 parent b89a70c commit e34f620
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 7 deletions.
34 changes: 27 additions & 7 deletions group/autogroup.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down Expand Up @@ -93,37 +95,55 @@
$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 {
Expand Down
2 changes: 2 additions & 0 deletions lang/en_utf8/group.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,4 +125,6 @@
$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';
?>

0 comments on commit e34f620

Please sign in to comment.