Permalink
Browse files

Changed the grading algorithm. Now it divides points earned by total …

…points possible. Before was dividing points earned by max grade. Also updated essay grading to work much more reliably and fixed some formatting problems with essay emails.
  • Loading branch information...
1 parent 1b4002e commit 8bca120ff0810fa244c5a22b55e0a8b7fca5e073 michaelpenne committed Nov 17, 2004
Showing with 68 additions and 67 deletions.
  1. +68 −67 mod/lesson/view.php
View
@@ -901,69 +901,72 @@
} else {
$score = 0;
+ $essayquestions = 0;
+ $essayquestionpoints = 0;
+
if ($useranswers = get_records_select("lesson_attempts", "lessonid = $lesson->id AND
userid = $USER->id AND retry = $ntries", "timeseen")) {
-
+ // group each try with its page
foreach ($useranswers as $useranswer) {
- if (@!array_key_exists($useranswer->pageid, $temp)) {
- $temp[$useranswer->pageid] = array($useranswer->answerid, 1);
- } else {
- if ($temp[$useranswer->pageid][1] < $lesson->maxattempts) {
- $n = $temp[$useranswer->pageid][1] + 1;
- $temp[$useranswer->pageid] = array($useranswer->answerid, $n);
- }
- }
- }
- if ($answervalues = get_records_select("lesson_answers", "lessonid = $lesson->id")) {
- if ($pages = get_records_select("lesson_pages", "lessonid = $lesson->id")) {
- foreach ($pages as $page) {
- $questions[$page->id] = $page->qtype;
- }
- } else {
- $questions = array();
- }
- $tempmaxgrade = $lesson->grade;
- $essayquestions = 0;
- foreach ($answervalues as $answervalue) {
- if (array_key_exists($answervalue->pageid, $temp)) {
- if ($temp[$answervalue->pageid][0] == $answervalue->id) {
- if ($questions[$answervalue->pageid] == LESSON_ESSAY) {
- $tempmaxgrade = $tempmaxgrade - $answervalue->score;
- $essayquestions++;
- } else {
- $score = $score + $answervalue->score;
- }
- }
- }
- }
- } else {
- error("Error: Could not find answers!");
- }
- }
- if ($score > $lesson->grade) {
- $thegrade = 100;
- $score = $lesson->grade;
- } elseif ($score < 0) {
- $thegrade = 0;
- $score = 0;
- } else {
- $thegrade = intval(100 * $score / $lesson->grade);
- }
+ $attemptset[$useranswer->pageid][] = $useranswer;
+ }
+
+ $pageids = array_keys($attemptset);
+ $pageids = implode(",", $pageids);
+
+ // get only the pages and their answers that the user answered
+ $answeredpages = get_records_select("lesson_pages", "lessonid = $lesson->id AND id IN($pageids)");
+ $pageanswers = get_records_select("lesson_answers", "lessonid = $lesson->id AND pageid IN($pageids)");
+ foreach ($attemptset as $attempts) {
+ if(count($attempts) > $lesson->maxattempts) { // if there are more tries than the max that is allowed, grab the last "legal" attempt
+ $attempt = $attempts[$lesson->maxattempts - 1];
+ } else {
+ // else, user attempted the question less than the max, so grab the last one
+ $attempt = end($attempts);
+ }
+ // if essay question, handle it, otherwise add to score
+ if ($answeredpages[$attempt->pageid]->qtype == LESSON_ESSAY) {
+ $essayinfo = unserialize($attempt->useranswer);
+ $score += $essayinfo->score;
+ $essayquestions++;
+ $essayquestionpoints += $pageanswers[$attempt->answerid]->score;
+ } else {
+ $score += $pageanswers[$attempt->answerid]->score;
+ }
+ }
+ $bestscores = array();
+ // find the highest possible score per page
+ foreach ($pageanswers as $pageanswer) {
+ if(isset($bestscores[$pageanswer->pageid])) {
+ if ($bestscores[$pageanswer->pageid] < $pageanswer->score) {
+ $bestscores[$pageanswer->pageid] = $pageanswer->score;
+ }
+ } else {
+ $bestscores[$pageanswer->pageid] = $pageanswer->score;
+ }
+ }
+
+ $bestscore = array_sum($bestscores);
+ }
+
+ $thegrade = intval(100 * $score / $bestscore);
unset($a);
if ($essayquestions > 0) {
$a->score = $score;
- $a->tempmaxgrade = $tempmaxgrade;
+ $a->tempmaxgrade = $bestscore - $essayquestionpoints;
$a->essayquestions = $essayquestions;
- $a->grade = $lesson->grade;
- echo "<div align=\"center\">";
- echo get_string("displayscorewithessays", "lesson", $a);
- echo "</div>";
+ $a->grade = $bestscore;
+ echo "<div align=\"center\">".get_string("displayscorewithessays", "lesson", $a)."</div>";
} else {
$a->score = $score;
- $a->grade = $lesson->grade;
+ $a->grade = $bestscore;
echo "<div align=\"center\">".get_string("displayscorewithoutessays", "lesson", $a)."</div>";
}
+ echo "<p align=\"center\">".get_string("gradeis", "lesson",
+ number_format($thegrade * $lesson->grade / 100, 1)).
+ " (".get_string("outof", "lesson", $lesson->grade).")</p>\n";
+
}
/// CDC-FLAG ///
$grade->lessonid = $lesson->id;
@@ -1748,24 +1751,22 @@
$essayinfo = unserialize($essay->useranswer);
- $grade = current($grades);
-
- // I modded this function a bit so it would work here... :) ;) :P
- $score = lesson_calculate_ongoing_score($lesson, $essay->userid, $essay->retry, true); // this function ignores essay questions
- $score += $form->score;
- if ($score > $lesson->grade) {
- $score = $lesson->grade;
- } elseif ($score < 0) {
- $score = 0;
- }
- $updategrade->grade = intval(100 * $score / $lesson->grade);
- $updategrade->id = $grade->id;
-
$essayinfo->graded = 1;
$essayinfo->score = $form->score;
$essayinfo->response = $form->response;
$essayinfo->sent = 0;
+
$essay->useranswer = serialize($essayinfo);
+
+ if (!update_record("lesson_attempts", $essay)) {
+ error("Could not update essay score");
+ }
+
+ $grade = current($grades);
+
+ // I modded this function a bit so it would work here... :) ;) :P
+ $updategrade->grade = lesson_calculate_ongoing_score($lesson, $essay->userid, $essay->retry, true);
+ $updategrade->id = $grade->id;
if(update_record("lesson_attempts", $essay) && update_record("lesson_grades", $updategrade)) {
redirect("view.php?id=$cm->id&amp;action=essayview", get_string("updatesuccess", "lesson"));
@@ -1826,18 +1827,18 @@
if ($lesson->custom) {
$points->score = $essayinfo->score;
$points->outof = $essayanswers[$essay->pageid]->score;
- $message .= get_string("youhavereceived", "lesson", $points)."<br>";
+ $message .= get_string("youhavereceived", "lesson", $points);
} else {
$points->score = $essayinfo->score;
$points->outof = 1;
- $message .= get_string("youhavereceived", "lesson", $points)."<br>";
+ $message .= get_string("youhavereceived", "lesson", $points);
}
$message .= "<br><br>";
$message .= get_string("yourgradeisnow", "lesson", $grade->grade)."%.";
$plaintxt = format_text_email($message, FORMAT_HTML);
- if(email_to_user($users[$essay->userid], $USER, $subject, $message, $plaintxt)) {
+ if(email_to_user($users[$essay->userid], $USER, $subject, $plaintxt, $message)) {
$essayinfo->sent = 1;
$essay->useranswer = serialize($essayinfo);
update_record("lesson_attempts", $essay);

0 comments on commit 8bca120

Please sign in to comment.