diff --git a/mod/quiz/report/attemptsreport.php b/mod/quiz/report/attemptsreport.php index edc4ea4fc33..e075eff01b9 100644 --- a/mod/quiz/report/attemptsreport.php +++ b/mod/quiz/report/attemptsreport.php @@ -72,6 +72,7 @@ abstract class quiz_attempt_report extends quiz_default_report { /** * Get information about which students to show in the report. * @param object $cm the coures module. + * @param object $course the course settings. * @return an array with four elements: * 0 => integer the current group id (0 for none). * 1 => array ids of all the students in this course. @@ -79,8 +80,12 @@ abstract class quiz_attempt_report extends quiz_default_report { * 3 => array ids of all the students to show in the report. Will be the * same as either element 1 or 2. */ - protected function load_relevant_students($cm) { - $currentgroup = groups_get_activity_group($cm, true); + protected function load_relevant_students($cm, $course = null) { + $currentgroup = $this->get_current_group($cm, $course, $this->context); + + if ($currentgroup == self::NO_GROUPS_ALLOWED) { + return array($currentgroup, array(), array(), array()); + } if (!$students = get_users_by_capability($this->context, array('mod/quiz:reviewmyattempts', 'mod/quiz:attempt'), diff --git a/mod/quiz/report/default.php b/mod/quiz/report/default.php index ad80e2ea5f9..1cbd44a0893 100644 --- a/mod/quiz/report/default.php +++ b/mod/quiz/report/default.php @@ -43,6 +43,8 @@ defined('MOODLE_INTERNAL') || die(); * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class quiz_default_report { + const NO_GROUPS_ALLOWED = -2; + /** * Override this function to displays the report. * @param $cm the course-module for this quiz. @@ -51,6 +53,14 @@ abstract class quiz_default_report { */ public abstract function display($cm, $course, $quiz); + /** + * Initialise some parts of $PAGE and start output. + * + * @param object $cm the course_module information. + * @param object $coures the course settings. + * @param object $quiz the quiz settings. + * @param string $reportmode the report name. + */ public function print_header_and_tabs($cm, $course, $quiz, $reportmode = 'overview') { global $PAGE, $OUTPUT; @@ -59,4 +69,24 @@ abstract class quiz_default_report { $PAGE->set_heading($course->fullname); echo $OUTPUT->header(); } + + /** + * Get the current group for the user user looking at the report. + * + * @param object $cm the course_module information. + * @param object $coures the course settings. + * @param context $context the quiz context. + * @return int the current group id, if applicable. 0 for all users, + * NO_GROUPS_ALLOWED if the user cannot see any group. + */ + public function get_current_group($cm, $course, $context) { + $groupmode = groups_get_activity_groupmode($cm, $course); + $currentgroup = groups_get_activity_group($cm, true); + + if ($groupmode == SEPARATEGROUPS && !$currentgroup && !has_capability('moodle/site:accessallgroups', $context)) { + $currentgroup = self::NO_GROUPS_ALLOWED; + } + + return $currentgroup; + } } diff --git a/mod/quiz/report/grading/report.php b/mod/quiz/report/grading/report.php index 05affcd09b9..0ee9c33a5ec 100644 --- a/mod/quiz/report/grading/report.php +++ b/mod/quiz/report/grading/report.php @@ -117,10 +117,14 @@ class quiz_grading_report extends quiz_default_report { } // Get the group, and the list of significant users. - $this->currentgroup = groups_get_activity_group($this->cm, true); - $this->users = get_users_by_capability($this->context, - array('mod/quiz:reviewmyattempts', 'mod/quiz:attempt'), '', '', '', '', - $this->currentgroup, '', false); + $this->currentgroup = $this->get_current_group($cm, $course, $this->context); + if ($this->currentgroup == self::NO_GROUPS_ALLOWED) { + $this->users = array(); + } else { + $this->users = get_users_by_capability($this->context, + array('mod/quiz:reviewmyattempts', 'mod/quiz:attempt'), '', '', '', '', + $this->currentgroup, '', false); + } // Start output. $this->print_header_and_tabs($cm, $course, $quiz, 'grading'); diff --git a/mod/quiz/report/overview/report.php b/mod/quiz/report/overview/report.php index e863e45fa5e..a8cf7bca92b 100644 --- a/mod/quiz/report/overview/report.php +++ b/mod/quiz/report/overview/report.php @@ -47,7 +47,7 @@ class quiz_overview_report extends quiz_attempt_report { $download = optional_param('download', '', PARAM_ALPHA); list($currentgroup, $students, $groupstudents, $allowed) = - $this->load_relevant_students($cm); + $this->load_relevant_students($cm, $course); $pageoptions = array(); $pageoptions['id'] = $cm->id; diff --git a/mod/quiz/report/responses/report.php b/mod/quiz/report/responses/report.php index 9f9857e4f0f..8da9e642771 100644 --- a/mod/quiz/report/responses/report.php +++ b/mod/quiz/report/responses/report.php @@ -55,7 +55,7 @@ class quiz_responses_report extends quiz_attempt_report { $download = optional_param('download', '', PARAM_ALPHA); list($currentgroup, $students, $groupstudents, $allowed) = - $this->load_relevant_students($cm); + $this->load_relevant_students($cm, $course); $pageoptions = array(); $pageoptions['id'] = $cm->id; diff --git a/mod/quiz/report/statistics/report.php b/mod/quiz/report/statistics/report.php index f29d2205ee6..54918044303 100644 --- a/mod/quiz/report/statistics/report.php +++ b/mod/quiz/report/statistics/report.php @@ -85,13 +85,16 @@ class quiz_statistics_report extends quiz_default_report { } // Find out current groups mode - $groupmode = groups_get_activity_groupmode($cm); - $currentgroup = groups_get_activity_group($cm, true); + $currentgroup = $this->get_current_group($cm, $course, $context); $nostudentsingroup = false; // True if a group is selected and there is no one in it. if (empty($currentgroup)) { $currentgroup = 0; $groupstudents = array(); + } else if ($currentgroup == self::NO_GROUPS_ALLOWED) { + $groupstudents = array(); + $nostudentsingroup = true; + } else { // All users who can attempt quizzes and who are in the currently selected group $groupstudents = get_users_by_capability($context, @@ -152,7 +155,7 @@ class quiz_statistics_report extends quiz_default_report { if (!$this->table->is_downloading()) { $this->print_header_and_tabs($cm, $course, $quiz, 'statistics'); - if ($groupmode) { + if (groups_get_activity_groupmode($cm)) { groups_print_activity_menu($cm, $reporturl->out()); if ($currentgroup && !$groupstudents) { $OUTPUT->notification(get_string('nostudentsingroup', 'quiz_statistics'));