MDL-27183 quiz reports: don't show data to users not in any group
authorTim Hunt <T.J.Hunt@open.ac.uk>
Wed, 7 Dec 2011 19:02:12 +0000 (19:02 +0000)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Fri, 9 Dec 2011 18:04:22 +0000 (18:04 +0000)
if the quiz is set to separate groups, and the user does not have access all groups.

mod/quiz/report/attemptsreport.php
mod/quiz/report/default.php
mod/quiz/report/grading/report.php
mod/quiz/report/overview/report.php
mod/quiz/report/responses/report.php
mod/quiz/report/statistics/report.php

index edc4ea4..e075eff 100644 (file)
@@ -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'),
index ad80e2e..1cbd44a 100644 (file)
@@ -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;
+    }
 }
index 05affcd..0ee9c33 100644 (file)
@@ -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');
index e863e45..a8cf7bc 100644 (file)
@@ -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;
index 9f9857e..8da9e64 100644 (file)
@@ -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;
index f29d220..5491804 100644 (file)
@@ -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'));