Merge branch 'MDL-31080' of git://github.com/timhunt/moodle
[moodle.git] / mod / quiz / locallib.php
index 5595611..e47522d 100644 (file)
@@ -69,6 +69,11 @@ define('QUIZ_SHOW_TIME_BEFORE_DEADLINE', '3600');
 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();
@@ -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)
@@ -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();
@@ -829,7 +844,7 @@ function quiz_question_edit_button($cmid, $question, $returnurl, $contentafteric
     // Build the icon.
     if ($action) {
         if ($returnurl instanceof moodle_url) {
-            $returnurl = str_replace($CFG->wwwroot, '', $returnurl->out(false));
+            $returnurl = $returnurl->out_as_local_url(false);
         }
         $questionparams = array('returnurl' => $returnurl, 'cmid' => $cmid, 'id' => $question->id);
         $questionurl = new moodle_url("$CFG->wwwroot/question/question.php", $questionparams);