diff --git a/grade/lib.php b/grade/lib.php index 8bf3c0e6b88..b439a6e6916 100644 --- a/grade/lib.php +++ b/grade/lib.php @@ -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']; - if (!isset($grades_by_student["$student"]["$category"]['stats']['points'])) { - $grades_by_student["$student"]["$category"]['stats']['points'] = '-'; + + 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'] = '-'; + + } + 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; }