]> git.mjollnir.org Git - moodle.git/commitdiff
groups/autogroup: Allocate members to groups more fairly
authormattc-catalyst <mattc-catalyst>
Thu, 18 Oct 2007 00:40:04 +0000 (00:40 +0000)
committermattc-catalyst <mattc-catalyst>
Thu, 18 Oct 2007 00:40:04 +0000 (00:40 +0000)
Author: Matt Clarkson <mattc@catalyst.net.nz>

group/autogroup.php
lang/en_utf8/group.php

index 4e0b3fa2ca3ae826dfd25f7b3278d8200901308a..c6a9e49cfff367b3032614061e874308e65a36cd 100644 (file)
@@ -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 {
index 57d32ebdeeadf147ee4b85e83556337a61860b30..2d80da7bfd9fc796a249bda61963502093df7dc5 100644 (file)
@@ -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';
 ?>