MDL-25523 Workshop: not-grouped users are excluded from allocation in visible group mode

There was a bug as these users were ignored only as squares but not as
circles. This patch makes sure that no new allocation are added to
not-grouped users in visible group mode. However, the options 'Remove current
allocations' and 'Add self-assessments' apply to them intentionally.

Also, the user is warned if there are some not-grouped users found in a
workshop in visible groups mode or separate groups mode.
This commit is contained in:
David Mudrak
2011-01-16 19:38:37 +01:00
parent 47ce9385e8
commit a1dc301ed5
3 changed files with 54 additions and 1 deletions
+48 -1
View File
@@ -178,10 +178,37 @@ class workshop_random_allocator implements workshop_allocator {
$this->mform->display();
$out .= ob_get_contents();
ob_end_clean();
$out .= $output->container_end();
// if there are some not-grouped participant in a group mode, warn the user
$gmode = groups_get_activity_groupmode($this->workshop->cm, $this->workshop->course);
if (VISIBLEGROUPS == $gmode or SEPARATEGROUPS == $gmode) {
$users = $this->workshop->get_potential_authors() + $this->workshop->get_potential_reviewers();
$users = $this->workshop->get_grouped($users);
if (isset($users[0])) {
$nogroupusers = $users[0];
foreach ($users as $groupid => $groupusers) {
if ($groupid == 0) {
continue;
}
foreach ($groupusers as $groupuserid => $groupuser) {
unset($nogroupusers[$groupuserid]);
}
}
if (!empty($nogroupusers)) {
$list = array();
foreach ($nogroupusers as $nogroupuser) {
$list[] = fullname($nogroupuser);
}
$a = implode(', ', $list);
$out .= $output->box(get_string('nogroupusers', 'workshopallocation_random', $a), 'generalbox warning nogroupusers');
}
}
}
// TODO $out .= $output->heading(get_string('stats', 'workshopallocation_random'));
$out .= $output->container_end();
return $out;
}
@@ -401,6 +428,22 @@ class workshop_random_allocator implements workshop_allocator {
} else {
throw new moodle_exception('unknownusertypepassed', 'workshop');
}
// get the users that are not in any group. in visible groups mode, these users are exluded
// from allocation by this method
// $nogroupcircles is array (int)$userid => undefined
if (isset($allcircles[0])) {
$nogroupcircles = array_flip(array_keys($allcircles[0]));
} else {
$nogroupcircles = array();
}
foreach ($allcircles as $circlegroupid => $circles) {
if ($circlegroupid == 0) {
continue;
}
foreach ($circles as $circleid => $circle) {
unset($nogroupcircles[$circleid]);
}
}
// $o[] = 'debug::circle links = ' . json_encode($circlelinks);
// $o[] = 'debug::square links = ' . json_encode($squarelinks);
$squareworkload = array(); // individual workload indexed by squareid
@@ -440,6 +483,10 @@ class workshop_random_allocator implements workshop_allocator {
$this->shuffle_assoc($circles);
$o[] = 'debug::iteration ' . $requiredreviews;
foreach ($circles as $circleid => $circle) {
if (VISIBLEGROUPS == $gmode and isset($nogroupcircles[$circleid])) {
$o[] = 'debug::skipping circle id ' . $circleid;
continue;
}
$o[] = 'debug::processing circle id ' . $circleid;
if (!isset($circlelinks[$circleid])) {
$circlelinks[$circleid] = array();