MDL-11718 partial cleanup in overview report - unfortunately the problems with hidden...
[moodle.git] / grade / report / overview / lib.php
index daf7ba9..d50bb1f 100644 (file)
@@ -49,6 +49,11 @@ class grade_report_overview extends grade_report {
      */
     var $table;
 
+    /**
+     * show student ranks
+     */
+    var $showrank;
+
     /**
      * Constructor. Sets local copies of user preferences and initialises grade_tree.
      * @param int $userid
@@ -59,6 +64,8 @@ class grade_report_overview extends grade_report {
         global $CFG, $COURSE;
         parent::grade_report($COURSE->id, $gpr, $context);
 
+        $this->showrank = grade_get_setting($this->courseid, 'report_overview_showrank', !empty($CFG->grade_report_overview_showrank));
+
         // get the user (for full name)
         $this->user = get_record('user', 'id', $userid);
 
@@ -74,16 +81,21 @@ class grade_report_overview extends grade_report {
      */
     function setup_table() {
         /*
-        * Table has 3 columns
-        *| course  | final grade | rank |
-        */
+         * Table has 3 columns
+         *| course  | final grade | rank (optional) |
+         */
 
         // setting up table headers
-        $tablecolumns = array('coursename', 'grade', 'rank');
-        $tableheaders = array($this->get_lang_string('coursename', 'grades'),
-                              $this->get_lang_string('grade'),
-                              $this->get_lang_string('rank', 'grades'));
-
+        if ($this->showrank) {
+            $tablecolumns = array('coursename', 'grade', 'rank');
+            $tableheaders = array($this->get_lang_string('coursename', 'grades'),
+                                  $this->get_lang_string('grade'),
+                                  $this->get_lang_string('rank', 'grades'));
+        } else {
+            $tablecolumns = array('coursename', 'grade');
+            $tableheaders = array($this->get_lang_string('coursename', 'grades'),
+                                  $this->get_lang_string('grade'));
+        }
         $this->table = new flexible_table('grade-report-overview-'.$this->user->id);
 
         $this->table->define_columns($tablecolumns);
@@ -99,45 +111,52 @@ class grade_report_overview extends grade_report {
 
     function fill_table() {
         global $CFG;
-        $numusers = $this->get_numusers();
 
-        // if ($courses = get_courses('all', null, 'c.id, c.shortname')) {
         // MDL-11679, only show 'mycourses' instead of all courses
         if ($courses = get_my_courses($this->user->id, 'c.sortorder ASC', 'id, shortname')) {
+            $numusers = $this->get_numusers();
+
             foreach ($courses as $course) {
+                $courselink = '<a href="'.$CFG->wwwroot.'/grade/report/user/index.php?id='.$course->id.'">'.$course->shortname.'</a>';
+
                 // Get course grade_item
-                if (!$grade_item = grade_item::fetch(array('itemtype' => 'course', 'courseid' => $course->id))) {
-                    // Create the course item if it doesn't already exist.
-                    $coursecat = grade_category::fetch_course_category($course->id);
-                    $grade_item = $coursecat->get_grade_item();
-                } 
+                $grade_item = grade_item::fetch_course_item($course->id);
 
                 // Get the grade
-                $finalgrade = get_field('grade_grades', 'finalgrade', 'itemid', $grade_item->id, 'userid', $this->user->id);
+                $grade = new grade_grade(array('itemid'=>$grade_item->id, 'userid'=>$this->user->id));
+                $grade->grade_item =& $grade_item;
+                $finalgrade = $grade->finalgrade;
+
+                // TODO: this DOES NOT work properly if there are any hidden grades,
+                //       rank might be wrong & totals might be different from user report!!!
+                if ($grade->is_hidden() and !has_capability('moodle/grade:viewhidden', get_context_instance(CONTEXT_COURSE, $course->id))) {
+                    $finalgrade = null;
+                }
+
+                $data = array($courselink, grade_format_gradevalue($finalgrade, $grade_item, true));
 
-                /// prints rank
-                if ($finalgrade) {
+                if (!$this->showrank) {
+                    //nothing to do
+
+                } else if (!is_null($finalgrade)) {
                     /// find the number of users with a higher grade
                     $sql = "SELECT COUNT(DISTINCT(userid))
-                            FROM {$CFG->prefix}grade_grades
-                            WHERE finalgrade > $finalgrade
-                            AND itemid = $grade_item->id";
+                              FROM {$CFG->prefix}grade_grades
+                             WHERE finalgrade IS NOT NULL AND finalgrade > $finalgrade
+                                   AND itemid = {$grade_item->id}";
                     $rank = count_records_sql($sql) + 1;
 
-                    $rankdata = "$rank/$numusers";
+                    $data[] = "$rank/$numusers";
+
                 } else {
                     // no grade, no rank
-                    $rankdata = "-";
+                    $data[] = '-';
                 }
 
-                $courselink = '<a href="' . $CFG->wwwroot . '/grade/report/user/index.php?id=' . $course->id . '">' . $course->shortname . '</a>';
-
-                $this->table->add_data(array($courselink,
-                                             round(grade_to_percentage($finalgrade, $grade_item->grademin, $grade_item->grademax), 1) . '%',
-                                             $rankdata));
+                $this->table->add_data($data);
             }
-
             return true;
+
         } else {
             notify(get_string('nocourses', 'grades'));
             return false;
@@ -167,6 +186,24 @@ class grade_report_overview extends grade_report {
      */
     function process_data($data) {
     }
+}
 
+function grade_report_overview_settings_definition(&$mform) {
+    global $CFG;
+
+    $options = array(-1 => get_string('default', 'grades'),
+                      0 => get_string('hide'),
+                      1 => get_string('show'));
+
+    if (empty($CFG->grade_overviewreport_showrank)) {
+        $options[-1] = get_string('defaultprev', 'grades', $options[0]);
+    } else {
+        $options[-1] = get_string('defaultprev', 'grades', $options[1]);
+    }
+
+    $mform->addElement('select', 'report_overview_showrank', get_string('showrank', 'grades'), $options);
+    $mform->setHelpButton('report_overview_showrank', array(false, get_string('showrank', 'grades'),
+                          false, true, false, get_string('configshowrank', 'grades')));
 }
+
 ?>