Manual regrading page implemented.

This commit is contained in:
mindforge
2005-06-04 10:58:31 +00:00
parent 3e41bf36a3
commit aee2784751
4 changed files with 112 additions and 7 deletions
+3
View File
@@ -310,8 +310,11 @@ $string['reattemptquiz'] = 'Re-attempt quiz';
$string['recentlyaddedquestion'] = 'Recently added question!';
$string['recurse'] = 'Display questions from sub-categories too';
$string['regrade'] = 'Regrade all attempts';
$string['regradeattempt'] = 'Regrading attempt #{$a->attempt}, $a->statecount states are being regraded';
$string['regradecomplete'] = 'All attempts have been regraded';
$string['regradecount'] = '$a->changed out of $a->attempt grades were changed';
$string['regradedone'] = 'done. Changed grades for $a->changed states out of $a->statecount.';
$string['regradequiz'] = 'Regrading Quiz $a->name';
$string['relative'] = 'Relative';
$string['remove'] = 'Remove';
$string['rename'] = 'Rename';
+74
View File
@@ -1465,6 +1465,78 @@ function quiz_extract_responses($questions, $responses, $defaultevent) {
}
function quiz_regrade_question_in_attempt($question, $attempt, $quiz=false, $verbose=false) {
if (!$quiz && !($quiz = get_record('quiz', 'id', $attempt->quiz))) {
$verbose && notify("Regrading of quiz #{$attempt->quiz} failed; " .
"Couldn't load quiz record from database!");
return false;
}
if ($states = get_records_select('quiz_states',
"attempt = '{$attempt->id}' ".
"AND question = '{$question->id}'",
'seq_number ASC')) {
$states = array_values($states);
$attempt->sumgrades -= $states[count($states)-1]->grade;
// Initialise the replaystate
quiz_restore_state($question, $states[0]);
$states[0]->sumpenalty = 0.0;
$replaystate = clone($states[0]);
$replaystate->last_graded = clone($states[0]);
if ($verbose) {
$a = new stdClass;
$a->attempt = $attempt->id;
$a->statecount = count($states);
print_string('regradeattempt', 'quiz', $a);
echo " . ";
}
$a->changed = 0;
$oldgrade = 0;
for($j = 1; $j < count($states); $j++) {
quiz_restore_state($question, $states[$j]);
$action = new stdClass;
$action->responses = $states[$j]->responses;
$action->timestamp = $states[$j]->timestamp;
// Close the last state of a finished attempt
if (((count($states) - 1) === $j) && ($attempt->timefinish > 0)) {
$action->event = QUIZ_EVENTCLOSE;
// Grade instead of closing, quiz_process_responses will then
// work out whether to close it
} else if (QUIZ_EVENTCLOSE == $states[$j]->event) {
$action->event = QUIZ_EVENTGRADE;
// By default take the event that was saved in the database
} else {
$action->event = $states[$j]->event;
}
// Reprocess (regrade) responses
if (!quiz_process_responses($question, $replaystate, $action, $quiz,
$attempt)) {
$verbose && notify("Couldn't regrade state #{$state->id}!");
}
if ((float)$replaystate->raw_grade != (float)$states[$j]->raw_grade) {
$a->changed++;
}
$verbose && print(". "); // Progress indicator
$replaystate->id = $states[$j]->id;
update_record('quiz_states', $replaystate);
}
update_record('quiz_attempts', $attempt);
quiz_save_best_grade($quiz, $attempt->userid);
$verbose && print_string('regradedone', 'quiz', $a);
$verbose && print("<br />");
return true;
}
return true;
}
/**
* For a given question instance we walk the complete history of states for
* each user and recalculate the grades as we go along.
@@ -1532,6 +1604,8 @@ function quiz_regrade_question_in_quizzes($question, $quizlist) {
quiz_restore_state($question, $states[$j]);
$action = new stdClass;
$action->responses = $states[$j]->responses;
$action->timestamp = $states[$j]->timestamp;
// Close the last state of a finished attempt
if (((count($states) - 1) === $j) && ($attempts[$i]->timefinish > 0)) {
$action->event = QUIZ_EVENTCLOSE;
+6 -5
View File
@@ -256,7 +256,7 @@
set_field('quiz_newest_states', 'questionid', $question->id, 'attemptid', $attempt->id, 'questionid', $oldquestionid);
}
// Now do anything question-type specific that is required to replace the question
// For example questions that use the quiz_answers table to hold part of their question will
// have to recode the answer ids in the states
@@ -272,11 +272,12 @@
}
if (empty($question->errors) && $QUIZ_QTYPES[$qtype]->finished_edit_wizard($form)) {
// DISABLED AUTOMATIC REGRADING
// Automagically regrade all attempts (and states) in the affected quizzes
if (!empty($replaceinquiz)) {
$QUIZ_QTYPES[$question->qtype]->get_question_options($question);
quiz_regrade_question_in_quizzes($question, $replaceinquiz);
}
//if (!empty($replaceinquiz)) {
// $QUIZ_QTYPES[$question->qtype]->get_question_options($question);
// quiz_regrade_question_in_quizzes($question, $replaceinquiz);
//}
redirect("edit.php");
}
}
+29 -2
View File
@@ -9,13 +9,40 @@ class quiz_report extends quiz_default_report {
function display($quiz, $cm, $course) { /// This function just displays the report
global $CFG, $SESSION, $db, $QUIZ_QTYPES;
$strheading = get_string('regradequiz', 'quiz', $quiz);
$strnoattempts = get_string('noattempts');
// 'There are no attempts for this quiz that could be regraded.';
/// Print header
$this->print_header_and_tabs($cm, $course, $quiz, $reportmode="regrade");
notify('Not yet implemented');
if (!$attempts = get_records('quiz_attempts', 'quiz', $quiz->id)) {
notify($strnoattempts);
return true;
}
$sql = "SELECT q.*, i.grade AS maxgrade FROM {$CFG->prefix}quiz_questions q,
{$CFG->prefix}quiz_question_instances i
WHERE i.quiz = $quiz->id
AND i.question = q.id";
if (! $questions = get_records_sql($sql)) {
error("Failed to get questions for regrading!");
}
quiz_get_question_options($questions);
print_heading($strheading);
print_simple_box_start('center', '70%');
foreach ($attempts as $attempt) {
foreach ($questions as $question) {
quiz_regrade_question_in_attempt($question, $attempt, $quiz, true);
}
}
print_simple_box_end();
return true;
}
}
?>
?>