MDL-54802 mod_quiz: Add validation to require passing grade greater than 0
authorSimey Lameze <simey@moodle.com>
Wed, 21 Sep 2016 08:09:25 +0000 (16:09 +0800)
committerSimey Lameze <simey@moodle.com>
Thu, 22 Sep 2016 00:48:11 +0000 (08:48 +0800)
This commit adds a form validation to prevent the creation of quizzes
using zero or null grade to pass when using require passing grade.

mod/quiz/db/upgrade.php
mod/quiz/lang/en/quiz.php
mod/quiz/mod_form.php
mod/quiz/version.php

index f42c007..04d303f 100644 (file)
@@ -193,5 +193,30 @@ function xmldb_quiz_upgrade($oldversion) {
     // Moodle v3.1.0 release upgrade line.
     // Put any upgrade step following this.
 
+    // Moodle v3.2.0 release upgrade line.
+    // Put any upgrade step following this.
+
+    if ($oldversion < 2016052301) {
+        // Find quizzes with the combination of require passing grade and grade to pass 0.
+        $quizzes = $DB->get_records_sql("
+            SELECT gi.id, gi.iteminstance
+                     FROM {quiz} q
+        INNER JOIN {course_modules} cm ON q.id = cm.instance
+        INNER JOIN {grade_items} gi ON q.id = gi.iteminstance
+                    WHERE q.completionpass = 1
+               AND gi.gradepass = 0
+               AND cm.completiongradeitemnumber IS NULL");
+        if ($quizzes) {
+            foreach ($quizzes as $quiz) {
+                $DB->execute("UPDATE {course_modules}
+                                 SET completiongradeitemnumber = :gradeitemid
+                               WHERE instance = :quizid",
+                    array('gradeitemid' => $quiz->id, 'quizid' => $quiz->iteminstance));
+            }
+        }
+        // Quiz savepoint reached.
+        upgrade_mod_savepoint(true, 2016052301, 'quiz');
+    }
+
     return true;
 }
index 612f1c9..eec5160 100644 (file)
@@ -396,6 +396,7 @@ $string['grademethod_help'] = 'When multiple attempts are allowed, the following
 * Last attempt (all other attempts are ignored)';
 $string['gradesdeleted'] = 'Quiz grades deleted';
 $string['gradesofar'] = '{$a->method}: {$a->mygrade} / {$a->quizgrade}.';
+$string['gradetopassnotset'] = 'This quiz does not have a grade to pass set so you cannot use this option. Please use the require grade setting instead.';
 $string['gradingdetails'] = 'Marks for this submission: {$a->raw}/{$a->max}.';
 $string['gradingdetailsadjustment'] = 'With previous penalties this gives <strong>{$a->cur}/{$a->max}</strong>.';
 $string['gradingdetailspenalty'] = 'This submission attracted a penalty of {$a}.';
index a768e97..d2938ba 100644 (file)
@@ -533,6 +533,13 @@ class mod_quiz_mod_form extends moodleform_mod {
             }
         }
 
+        if (array_key_exists('completion', $data) && $data['completion'] == COMPLETION_TRACKING_AUTOMATIC) {
+            // Show an error if require passing grade was selected and the grade to pass was setted to 0.
+            if ($data['completionpass'] == 1 && (empty($data['gradepass']) || grade_floatval($data['gradepass']) == 0)) {
+                $errors['gradepass'] = get_string('gradetopassnotset', 'quiz');
+            }
+        }
+
         // Check the boundary value is a number or a percentage, and in range.
         $i = 0;
         while (!empty($data['feedbackboundaries'][$i] )) {
index a2ce949..4bb9aee 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2016052300;
+$plugin->version   = 2016052301;
 $plugin->requires  = 2016051900;
 $plugin->component = 'mod_quiz';
 $plugin->cron      = 60;