MDL-11576 grader report - if user can not see hidden grades they are treated as NULLs...
authorskodak <skodak>
Fri, 5 Oct 2007 09:47:31 +0000 (09:47 +0000)
committerskodak <skodak>
Fri, 5 Oct 2007 09:47:31 +0000 (09:47 +0000)
grade/report/grader/lib.php
lib/grade/grade_item.php

index 5a605b95f1cbbbd039a9f996cfca3d3eb8fc7710..497d55350939aeac7818c7f7f04f7068eb22b5fe 100644 (file)
@@ -797,6 +797,16 @@ class grade_report_grader extends grade_report {
 
         $canviewhidden = has_capability('moodle/grade:viewhidden', get_context_instance(CONTEXT_COURSE, $this->course->id));
 
+        if ($canviewhidden) {
+            $hidingsql1 = "";
+            $hidingsql2 = "";
+            
+        } else {
+            $now = round(time(), -2); //100 sec gradularity, we need some db caching speedup here
+            $hidingsql1 = "AND g.hidden!=1 AND (g.hidden=0 OR g.hidden<$now)";
+            $hidingsql2 = "OR (g.hidden!=1 AND (g.hidden=0 OR g.hidden<$now))";
+        }
+
         $avghtml = '';
         $avgcssclass = 'avg';
 
@@ -809,8 +819,8 @@ class grade_report_grader extends grade_report {
         } else {
             $straverage = get_string('overallaverage', 'grades');
             $showaverages = $this->get_pref('showaverages');
-            $groupsql = null;
-            $groupwheresql = null;
+            $groupsql = "";
+            $groupwheresql = "";
         }
 
         if ($shownumberofgrades) {
@@ -828,6 +838,7 @@ class grade_report_grader extends grade_report {
                      {$CFG->prefix}user u ON g.userid = u.id
                      $groupsql
                 WHERE gi.courseid = $this->courseid
+                     $hidingsql1
                      $groupwheresql
                      AND g.userid IN (
                         SELECT DISTINCT(u.id)
@@ -851,7 +862,7 @@ class grade_report_grader extends grade_report {
             foreach ($this->items as $item) {
                 // If the user shouldn't see this grade_item, hide the average as well
                 // MDL-11576 If any of the grades are hidden and the user doesn't have permission to view them, hide average as well
-                if (($item->is_hidden() || $item->has_hidden_grades($groupsql, $groupwheresql)) && !$canviewhidden) {
+                if (!$canviewhidden and $item->is_hidden()) {
                     $avghtml .= '<td class="cell c' . $columncount++.'"> - </td>';
                     continue;
                 }
@@ -859,20 +870,14 @@ class grade_report_grader extends grade_report {
                 if (empty($sum_array[$item->id])) {
                     $sum_array[$item->id] = 0;
                 }
-                if ($grouponly) {
-                    $groupsql = $this->groupsql;
-                    $groupwheresql = $this->groupwheresql;
-                } else {
-                    $groupsql = '';
-                    $groupwheresql = '';
-                }
                 // MDL-10875 Empty grades must be evaluated as grademin, NOT always 0
                 // This query returns a count of ungraded grades (NULL finalgrade OR no matching record in grade_grades table)
+                // optionally plus number of hidden grades
                 $SQL = "SELECT COUNT(*) AS count FROM {$CFG->prefix}user u
                          WHERE u.id NOT IN
-                           (SELECT userid FROM {$CFG->prefix}grade_grades
-                             WHERE itemid = $item->id
-                               AND finalgrade IS NOT NULL
+                           (SELECT userid FROM {$CFG->prefix}grade_grades g
+                             WHERE g.itemid = $item->id AND
+                               (g.finalgrade IS NOT NULL $hidingsql2)
                            )
                            AND u.id IN (
                              SELECT DISTINCT(u.id)
index 7dcea7a033ffd8c019e4865a6698be65531e911d..39a869bf65ed86796b5f90954fc25011fb6e14da 100644 (file)
@@ -569,10 +569,10 @@ class grade_item extends grade_object {
      * Returns the number of grades that are hidden.
      * @param return int Number of hidden grades
      */
-    function has_hidden_grades($groupsql = null, $groupwheresql = null) {
+    function has_hidden_grades($groupsql="", $groupwheresql="") {
         global $CFG;
         return get_field_sql("SELECT COUNT(*) FROM {$CFG->prefix}grade_grades g LEFT JOIN "
-                            ."{$CFG->prefix}user u ON g.userid = u.id$groupsql WHERE itemid = $this->id AND hidden = 1 $groupwheresql");
+                            ."{$CFG->prefix}user u ON g.userid = u.id $groupsql WHERE itemid = $this->id AND hidden = 1 $groupwheresql");
     }
 
     /**