From ef9ca1069921604be53a3f2561bed1f43eb64f54 Mon Sep 17 00:00:00 2001 From: Ankit Agarwal Date: Thu, 12 Sep 2013 10:08:48 +0800 Subject: [PATCH] MDL-21415 reports: We should fetch active group from session not page params Also donot allow active group to be set to something that user doesn't have access to --- lib/grouplib.php | 19 +++++++++++++++---- lib/tests/grouplib_test.php | 8 ++++++-- report/participation/index.php | 4 ++++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/grouplib.php b/lib/grouplib.php index b30dae5fab6..826d0c481db 100644 --- a/lib/grouplib.php +++ b/lib/grouplib.php @@ -581,13 +581,24 @@ function groups_allgroups_course_menu($course, $urlroot, $update = false, $activ $allowedgroups = groups_get_all_groups($course->id, $USER->id, $course->defaultgroupingid); } - if ($update) { - $SESSION->activegroup[$course->id][$groupmode][$course->defaultgroupingid] = $activegroup; - } - foreach ($allowedgroups as $group) { $groupsmenu[$group->id] = format_string($group->name); } + + if ($update) { + // Init activegroup array if necessary. + if (!isset($SESSION->activegroup)) { + $SESSION->activegroup = array(); + } + if (!isset($SESSION->activegroup[$course->id])) { + $SESSION->activegroup[$course->id] = array(SEPARATEGROUPS => array(), VISIBLEGROUPS => array(), 'aag' => array()); + } + if (empty($groupsmenu[$activegroup])) { + $activegroup = key($groupsmenu); // Force set to one of accessible groups. + } + $SESSION->activegroup[$course->id][$groupmode][$course->defaultgroupingid] = $activegroup; + } + $grouplabel = get_string('groups'); if (count($groupsmenu) == 0) { return ''; diff --git a/lib/tests/grouplib_test.php b/lib/tests/grouplib_test.php index f88c153bc1a..ada661631d2 100644 --- a/lib/tests/grouplib_test.php +++ b/lib/tests/grouplib_test.php @@ -713,10 +713,14 @@ class core_grouplib_testcase extends advanced_testcase { $this->assertContains(format_string($group2->name), $html); // Let us test activegroup changes now. + $this->setUser($user); $SESSION->activegroup[$course->id][VISIBLEGROUPS][$course->defaultgroupingid] = 5; groups_allgroups_course_menu($course, 'someurl.php', false); // Do not update session. $this->assertSame(5, $SESSION->activegroup[$course->id][VISIBLEGROUPS][$course->defaultgroupingid]); - groups_allgroups_course_menu($course, 'someurl.php', true, 2); // Update session. - $this->assertSame(2, $SESSION->activegroup[$course->id][VISIBLEGROUPS][$course->defaultgroupingid]); + groups_allgroups_course_menu($course, 'someurl.php', true, $group1->id); // Update session. + $this->assertSame($group1->id, $SESSION->activegroup[$course->id][VISIBLEGROUPS][$course->defaultgroupingid]); + // Try to update session with an invalid groupid. It should not accept the invalid id. + groups_allgroups_course_menu($course, 'someurl.php', true, 256); + $this->assertEquals($group1->id, $SESSION->activegroup[$course->id][VISIBLEGROUPS][$course->defaultgroupingid]); } } diff --git a/report/participation/index.php b/report/participation/index.php index 6b6a7ab361a..f64c1d3d44e 100644 --- a/report/participation/index.php +++ b/report/participation/index.php @@ -176,6 +176,10 @@ if (empty($select)) { echo $select; } +// Fetch current active group. +$groupmode = groups_get_course_groupmode($course); +$currentgroup = $SESSION->activegroup[$course->id][$groupmode][$course->defaultgroupingid]; + if (!empty($instanceid) && !empty($roleid)) { // from here assume we have at least the module we're using. $cm = $modinfo->cms[$instanceid];