]> git.mjollnir.org Git - moodle.git/commitdiff
Fixed Bug #5354 - Gradebook [DropXLowest and Exclude]
authorvyshane <vyshane>
Tue, 16 May 2006 06:21:49 +0000 (06:21 +0000)
committervyshane <vyshane>
Tue, 16 May 2006 06:21:49 +0000 (06:21 +0000)
grade/lib.php

index 8bf3c0e6b888838336a01a04505dbcaae226c514..b439a6e6916d60ada5ad69444578e9706874246d 100644 (file)
@@ -97,6 +97,26 @@ function grade_get_exceptions($course) {
     return $temp;
 }
 
+function grade_get_exceptions_user($course, $userid) {
+    global $CFG;
+    $sql = "SELECT e.id, e.userid, gi.cminstance, gi.modid, c.name as catname, mm.name as modname
+            FROM {$CFG->prefix}grade_exceptions e, 
+                {$CFG->prefix}grade_item gi, 
+                {$CFG->prefix}grade_category c,
+                {$CFG->prefix}course_modules cm, 
+                {$CFG->prefix}modules mm
+            WHERE e.courseid=$course
+               AND e.userid=$userid 
+                AND gi.id = e.grade_itemid 
+                AND c.id = gi.category
+                AND cm.course=c.courseid 
+                AND cm.module=mm.id
+                AND gi.modid=mm.id";
+    
+    $temp = get_records_sql($sql);
+    return $temp;
+}
+
 function grade_letters_set($course) {
     global $CFG;
     $sql = "SELECT * FROM {$CFG->prefix}grade_letter WHERE courseid=$course";
@@ -183,7 +203,11 @@ function grade_get_formatted_grades() {
                                             $grades_by_student["$student"]["$cur_category"]['stats']['allgrades'] = $grade;
                                         }
                                     }
+                                       $currentgrades = $grades_by_student["$student"]["$cur_category"]['stats']['allgrades'];
                                 }
+
+                                           
+                        
                                 // set up a list of all categories and assignments (adjusting things for extra credit where necessary)
                                 $all_categories["$cur_category"]["$instance->name"]['hidden'] = $students_grade->hidden;
                                 $all_categories["$cur_category"]["$instance->name"]['sort_order'] = $students_grade->sort_order;
@@ -279,6 +303,7 @@ function grade_get_formatted_grades() {
                 }
             }
         }
+       
 
         if (isset($_REQUEST['group'])) {
             $group = clean_param($_REQUEST['group'], PARAM_INT);
@@ -294,15 +319,52 @@ function grade_get_formatted_grades() {
             if (isset($grades_by_student)) {
                 foreach($grades_by_student as $student=>$categories) {
                     if ( (isset($groupmembers) && isset($groupmembers[$student])) || !isset($groupmembers)) {
+                           
                         $grades_by_student["$student"]["$category"]['stats']['totalpoints'] = $main_category['stats']['totalpoints'];
                         $grades_by_student["$student"]["$category"]['stats']['weight'] = $main_category['stats']['weight'];
                         $grades_by_student["$student"]["$category"]['stats']['grade_items'] = $main_category['stats']['grade_items'];
+
+                        foreach($main_category as $assignment => $items) {
+                            if ($assignment != 'stats') {
+                                if(!isset($grades_by_student["$student"]["$category"]["$assignment"]['grade'])) {
+                                    $grades_by_student["$student"]["$category"]['stats']['allgrades'] .= ',0';
+                                }
+                            }            
+                        }
+                       
                         if (!isset($grades_by_student["$student"]["$category"]['stats']['points'])) {
-                            $grades_by_student["$student"]["$category"]['stats']['points'] = '-';
+                           $grades_by_student["$student"]["$category"]['stats']['points'] = '-';
+                          
                         }
+               
                         else {
                             // points are set... see if the current category is using drop the x lowest and do so
+                            // also drop exceptions first, so then this grades(s) won't be recoqnized as the x lowest
+                           // Get exception scores and assign them in the array
                             if ($main_category['stats']['drop'] != 0) {
+                                $exceptions = grade_get_exceptions_user($course->id, $student);
+                                if (isset($exceptions) && $exceptions) {
+                                    foreach($exceptions as $exception) {
+                                        if (isset($grades_by_student["$exception->userid"])) {
+                                            if ($grades_by_student["$exception->userid"]["$exception->catname"]) {
+                                                $assgn = get_record($exception->modname, 'id', $exception->cminstance, 'course', $course->id);
+                                                $grade = $grades_by_student["$exception->userid"]["$exception->catname"]["$assgn->name"]['grade'];
+                                               if (isset($grade)) {
+                                                   if (!isset($grades_by_student["$exception->userid"]["$exception->catname"]['stats']['exceptions'])) {
+                                                             $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['exceptions'] = $grade;
+                                                    }
+                                                    elseif (isset($grades_by_student["$exception->userid"]["$exception->catname"]['stats']['exceptions'])) {
+                                                             $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['exceptions'] .= ','. $grade;
+                                                   }
+                                               }
+                                            }
+                                        }
+                                    }
+                               }
+                                if (isset($grades_by_student["$student"]["$category"]['stats']['exceptions'])) {
+                                    $grades_by_student["$student"]["$category"]['stats']['allgrades'] = grade_drop_exceptions($grades_by_student["$student"]["$category"]['stats']['allgrades'], $grades_by_student["$student"]["$category"]['stats']['exceptions']);
+                                }
+                               
                                 $grades_by_student["$student"]["$category"]['stats']['allgrades'] = grade_drop_lowest($grades_by_student["$student"]["$category"]['stats']['allgrades'], $main_category['stats']['drop'], $main_category['stats']['grade_items']);
                                 if ($grades_by_student["$student"]["$category"]['stats']['points'] != '-') {
                                     $cat_points = 0;
@@ -314,7 +376,7 @@ function grade_get_formatted_grades() {
                                 }
                             }
                         }
-        
+       
                         // add any bonus points for the category
                         if ($all_categories["$category"]['stats']['bonus_points'] != 0) {
                             $grades_by_student["$student"]["$category"]['stats']['points'] = $grades_by_student["$student"]["$category"]['stats']['points'] + $all_categories["$category"]['stats']['bonus_points'];
@@ -339,7 +401,6 @@ function grade_get_formatted_grades() {
                 }
             }
         }
-
         // set the total coursepoints
         $all_categories['stats']['weight'] = 0;
         $all_categories['stats']['totalpoints'] = 0;
@@ -361,7 +422,7 @@ function grade_get_formatted_grades() {
                 $grades_by_student["$student"]['student_data']['totalpoints'] = $all_categories['stats']['totalpoints'];
             }
         }
-
+        
         // take into account any excluded grade_items
         $strexcluded = get_string('excluded', 'grades');
         $exceptions = grade_get_exceptions($course->id);
@@ -371,12 +432,17 @@ function grade_get_formatted_grades() {
                     if ($grades_by_student["$exception->userid"]["$exception->catname"]) {
                         $assgn = get_record($exception->modname, 'id', $exception->cminstance, 'course', $course->id);
                         $grades_by_student["$exception->userid"]['student_data']['totalpoints'] = $grades_by_student["$exception->userid"]['student_data']['totalpoints'] - $all_categories["$exception->catname"]["$assgn->name"]['maxgrade'];
-                        $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['totalpoints'] = $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['totalpoints'] - $all_categories["$exception->catname"]["$assgn->name"]['grade_against'];
+                       //total point should not be smaller than grade against
+                       if ($grades_by_student["$exception->userid"]["$exception->catname"]['stats']['totalpoints'] - $all_categories["$exception->catname"]["$assgn->name"]['grade_against'] != 0 ) {
+                            $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['totalpoints'] = $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['totalpoints'] - $all_categories["$exception->catname"]["$assgn->name"]['grade_against'];
+                       }
                         $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['grade_items'] = $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['grade_items'] - 1;
                         if ($grades_by_student["$exception->userid"]["$exception->catname"]['stats']['grade_items'] < 0) {
                             $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['grade_items'] = 0;
+                       }
+                        if ($all_categories["$exception->catname"]['stats']['drop'] == 0) {
+                            $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['points'] = $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['points'] - $grades_by_student["$exception->userid"]["$exception->catname"]["$assgn->name"]['grade'];
                         }
-                        $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['points'] = $grades_by_student["$exception->userid"]["$exception->catname"]['stats']['points'] - $grades_by_student["$exception->userid"]["$exception->catname"]["$assgn->name"]['grade'];
                         $grades_by_student["$exception->userid"]["$exception->catname"]["$assgn->name"]['maxgrade'] = $strexcluded;
                         $grades_by_student["$exception->userid"]["$exception->catname"]["$assgn->name"]['grade'] = $strexcluded;
                         // see if they are excluded entirely from a category
@@ -394,7 +460,7 @@ function grade_get_formatted_grades() {
                 }
             }
         }
-
+                        
         if (isset($grades_by_student)) {
             foreach($grades_by_student as $student => $categories) {
                 $grades_by_student["$student"]['student_data']['points'] = '-';
@@ -408,7 +474,7 @@ function grade_get_formatted_grades() {
                             if ($grades_by_student["$student"]["$category"]['stats']['points'] != '-') {
                                 $grades_by_student["$student"]['student_data']['points'] = $grades_by_student["$student"]['student_data']['points'] + $grades_by_student["$student"]["$category"]['stats']['points'];
                             }
-                            $grades_by_student["$student"]['student_data']['totalpoints'] = $grades_by_student["$student"]['student_data']['totalpoints'] + $grades_by_student["$student"]["$category"]['stats']['totalpoints'];
+                        $grades_by_student["$student"]['student_data']['totalpoints'] = $grades_by_student["$student"]['student_data']['totalpoints'] + $grades_by_student["$student"]["$category"]['stats']['totalpoints'];
                         }
                 
                         // set percents and weights for each assignment
@@ -453,7 +519,7 @@ function grade_get_formatted_grades() {
                                 $grades_by_student["$student"]["$category"]['stats']['weighted'] = 0.00;
                             }
                         }
-                        
+                                       
                         // set students overall weight (this is what percent they will be graded against)
                         if ($grades_by_student["$student"]["$category"]['stats']['weight'] != $strexcluded) {
                             $grades_by_student["$student"]['student_data']['weight'] = $grades_by_student["$student"]['student_data']['weight'] + $grades_by_student["$student"]["$category"]['stats']['weight'];
@@ -468,7 +534,7 @@ function grade_get_formatted_grades() {
                     
     
                 }
-    
+                
                 // set the percent and weight overall
                 if ($grades_by_student["$student"]['student_data']['totalpoints'] != 0 && $grades_by_student["$student"]['student_data']['totalpoints'] != $strexcluded) {
                     $grades_by_student["$student"]['student_data']['percent'] = round($grades_by_student["$student"]['student_data']['points']/$grades_by_student["$student"]['student_data']['totalpoints']*100,2);
@@ -544,8 +610,6 @@ function grade_get_formatted_grades() {
         else {
             $grades_by_student = 0;
         }        
-        //print_object($grades_by_student);
-        //print_object($all_categories);
         $retval = array($grades_by_student, $all_categories);
     }
     else {
@@ -555,25 +619,42 @@ function grade_get_formatted_grades() {
     return $retval;
 }
 
+function grade_drop_exceptions($grades, $grades_exceptions) {
+    $grade_array = explode(',',$grades);
+    $grade_exception_array = explode(',',$grades_exceptions);
+    $ret_grades = Array(); 
+    foreach ($grade_array as $key => $val) {
+        $posb = array_search($val,$grade_exception_array);
+        if (is_integer($posb)) {
+            unset($grade_exception_array[$posb]);
+        } else {
+        
+            $ret_grades[] = $val;
+        }
+    }
+    $grades = implode(',', $ret_grades);
+    return $grades;
+}
+
 function grade_drop_lowest($grades, $drop, $total) {
     // drops the lowest $drop numbers from the comma seperated $grades making sure that if $grades has 
     // fewer items than $total that we don't drop too many
     $grade_array = explode(',',$grades);
-
-    $actually_drop = (count($grade_array) - $total);
-    if ($actually_drop > 0) {
+    if (count($grade_array) == 1) {
+       $grades = implode('', $grade_array);
+    }
+    else if ($drop > 0 AND (count($grade_array) > $drop)) {
         rsort($grade_array);
 
-        for($i=0; $i < (count($grade_array) - $actually_drop); $i++) {
+        for($i=0; $i < (count($grade_array) - $drop); $i++) {
             $ret_grades["$i"] = $grade_array["$i"];
         }
-        if ($ret_grades) {
+        if (isset($ret_grades)) {
             $grades = implode(',',$ret_grades);
         }
-        else {
-            // set grades to 0... they decided to drop too many
-            $grades = 0;
-        }
+    }
+    else {
+        $grades = 0;
     }
     return $grades;    
 }