Skip to content

Commit

Permalink
MDL-31095 quiz editing: only set quiz->grade to 0 if really necessary.
Browse files Browse the repository at this point in the history
It is only necessary when there are (non-preview) attempts. However,
after making this change we have to ensure users cannot start attempts
when ->grade > 0 and ->sumgrades = 0.

Display ->grade on the order and paging tab of edit.php, so it is clear
what is going on when you are using that tab.

Finally, improve the error message a student gets if they try to start a
quiz with no questions.
  • Loading branch information
timhunt committed Jan 12, 2012
1 parent 389cb58 commit 18dff75
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 11 deletions.
6 changes: 2 additions & 4 deletions mod/quiz/edit.php
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,8 @@ function module_specific_controls($totalnumber, $recurse, $category, $cmid, $cmo
$remove = optional_param('remove', false, PARAM_INT);
if (($remove = optional_param('remove', false, PARAM_INT)) && confirm_sesskey()) {
quiz_remove_question($quiz, $remove);
quiz_update_sumgrades($quiz);
quiz_delete_previews($quiz);
quiz_update_sumgrades($quiz);
redirect($afteractionurl);
}

Expand Down Expand Up @@ -496,9 +496,7 @@ function module_specific_controls($totalnumber, $recurse, $category, $cmid, $cmo
quiz_print_status_bar($quiz);

$tabindex = 0;
if (!$quiz_reordertool) {
quiz_print_grading_form($quiz, $thispageurl, $tabindex);
}
quiz_print_grading_form($quiz, $thispageurl, $tabindex);

$notifystrings = array();
if ($quizhasattempts) {
Expand Down
2 changes: 1 addition & 1 deletion mod/quiz/editlib.php
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,8 @@ function quiz_add_page_break_after($layout, $questionid) {
function quiz_save_new_layout($quiz) {
global $DB;
$DB->set_field('quiz', 'questions', $quiz->questions, array('id' => $quiz->id));
quiz_update_sumgrades($quiz);
quiz_delete_previews($quiz);
quiz_update_sumgrades($quiz);
}

/**
Expand Down
2 changes: 2 additions & 0 deletions mod/quiz/lang/en/quiz.php
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,9 @@
$string['cannotsavequestion'] = 'Cannot save question list';
$string['cannotsetgrade'] = 'Could not set a new maximum grade for the quiz';
$string['cannotsetsumgrades'] = 'Failed to set sumgrades';
$string['cannotstartgradesmismatch'] = 'Cannot start an attempt at this quiz. The quiz is supposed to be graded, but there are no questions in the quiz that are worth any marks.';
$string['cannotstartmissingquestion'] = 'Cannot start an attempt at this quiz. The quiz definition includes a question that does not exist.';
$string['cannotstartnoquestions'] = 'Cannot start an attempt at this quiz. The quiz has not been set up yet. No questions have been added.';
$string['cannotwrite'] = 'Cannot write to export file ({$a})';
$string['caseno'] = 'No, case is unimportant';
$string['casesensitive'] = 'Case sensitivity';
Expand Down
21 changes: 18 additions & 3 deletions mod/quiz/locallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@
function quiz_create_attempt($quiz, $attemptnumber, $lastattempt, $timenow, $ispreview = false) {
global $USER;

if ($quiz->sumgrades < 0.000005 && $quiz->grade > 0.000005) {
throw new moodle_exception('cannotstartgradesmismatch', 'quiz',
new moodle_url('/mod/quiz/view.php', array('q' => $quiz->id)));
}

if ($attemptnumber == 1 || !$quiz->attemptonlast) {
// We are not building on last attempt so create a new attempt.
$attempt = new stdClass();
Expand Down Expand Up @@ -386,10 +391,13 @@ function quiz_has_feedback($quiz) {
* the grading structure of the quiz is changed. For example if a question is
* added or removed, or a question weight is changed.
*
* You should call {@link quiz_delete_previews()} before you call this function.
*
* @param object $quiz a quiz.
*/
function quiz_update_sumgrades($quiz) {
global $DB;

$sql = 'UPDATE {quiz}
SET sumgrades = COALESCE((
SELECT SUM(grade)
Expand All @@ -399,13 +407,20 @@ function quiz_update_sumgrades($quiz) {
WHERE id = ?';
$DB->execute($sql, array($quiz->id));
$quiz->sumgrades = $DB->get_field('quiz', 'sumgrades', array('id' => $quiz->id));
if ($quiz->sumgrades < 0.000005 && quiz_clean_layout($quiz->questions, true)) {
// If there is at least one question in the quiz, and the sumgrades has been
// set to 0, then also set the maximum possible grade to 0.

if ($quiz->sumgrades < 0.000005 && quiz_has_attempts($quiz->id)) {
// If the quiz has been attempted, and the sumgrades has been
// set to 0, then we must also set the maximum possible grade to 0, or
// we will get a divide by zero error.
quiz_set_grade(0, $quiz);
}
}

/**
* Update the sumgrades field of the attempts at a quiz.
*
* @param object $quiz a quiz.
*/
function quiz_update_all_attempt_sumgrades($quiz) {
global $DB;
$dm = new question_engine_data_mapper();
Expand Down
10 changes: 7 additions & 3 deletions mod/quiz/startattempt.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,13 @@
require_login($quizobj->get_courseid(), false, $quizobj->get_cm());
require_sesskey();

// if no questions have been set up yet redirect to edit.php
if (!$quizobj->has_questions() && $quizobj->has_capability('mod/quiz:manage')) {
redirect($quizobj->edit_url());
// if no questions have been set up yet redirect to edit.php or display an error.
if (!$quizobj->has_questions()) {
if ($quizobj->has_capability('mod/quiz:manage')) {
redirect($quizobj->edit_url());
} else {
print_error('cannotstartnoquestions', 'quiz', $quizobj->view_url());
}
}

// Create an object to manage all the other (non-roles) access rules.
Expand Down

0 comments on commit 18dff75

Please sign in to comment.