MDL-50047 quiz_results: Upgrade handles misconfig and missing quizzes
authorFrederic Massart <fred@moodle.com>
Fri, 1 May 2015 08:15:28 +0000 (16:15 +0800)
committerFrederic Massart <fred@moodle.com>
Wed, 6 May 2015 04:32:29 +0000 (12:32 +0800)
blocks/quiz_results/db/upgrade.php

index 85cceef..3b44dbe 100644 (file)
@@ -52,27 +52,39 @@ function xmldb_block_quiz_results_upgrade($oldversion, $block) {
             // Migrate all instances of block_quiz_results to block_activity_results.
             $records = $DB->get_records('block_instances', array('blockname' => 'quiz_results'));
             foreach ($records as $record) {
-                $config = unserialize(base64_decode($record->configdata));
-                $config->activityparent = 'quiz';
-                $config->activityparentid = $config->quizid;
+                $configdata = '';
 
-                // Set the decimal valuue as appropriate.
-                if ($config->gradeformat == 1) {
-                    // This block is using percentages, do not display any decimal places.
-                    $config->decimalpoints = 0;
-                } else {
-                    // Get the decimal value from the corresponding quiz.
-                    $config->decimalpoints = $DB->get_field('quiz', 'decimalpoints', array('id' => $config->activityparentid));
-                }
+                // The block was configured.
+                if (!empty($record->configdata)) {
+
+                    $config = unserialize(base64_decode($record->configdata));
+                    $config->activityparent = 'quiz';
+                    $config->activityparentid = isset($config->quizid) ? $config->quizid : 0;
+                    $config->gradeformat = isset($config->gradeformat) ? $config->gradeformat : 1;
+
+                    // Set the decimal valuue as appropriate.
+                    if ($config->gradeformat == 1) {
+                        // This block is using percentages, do not display any decimal places.
+                        $config->decimalpoints = 0;
+                    } else {
+                        // Get the decimal value from the corresponding quiz.
+                        $config->decimalpoints = $DB->get_field('quiz', 'decimalpoints', array('id' => $config->activityparentid));
+                    }
 
-                // Get the grade_items record to set the activitygradeitemid.
-                $info = $DB->get_record('grade_items',
-                        array('iteminstance' => $config->activityparentid, 'itemmodule' => $config->activityparent));
-                $config->activitygradeitemid = $info->id;
-                unset($config->quizid);
+                    // Get the grade_items record to set the activitygradeitemid.
+                    $info = $DB->get_record('grade_items',
+                            array('iteminstance' => $config->activityparentid, 'itemmodule' => $config->activityparent));
+                    $config->activitygradeitemid = 0;
+                    if ($info) {
+                        $config->activitygradeitemid = $info->id;
+                    }
+
+                    unset($config->quizid);
+                    $configdata = base64_encode(serialize($config));
+                }
 
                 // Save the new configuration and update the record.
-                $record->configdata = base64_encode(serialize($config));
+                $record->configdata = $configdata;
                 $record->blockname = 'activity_results';
                 $DB->update_record('block_instances', $record);
             }