|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 // This file is part of Moodle - http://moodle.org/ 00003 // 00004 // Moodle is free software: you can redistribute it and/or modify 00005 // it under the terms of the GNU General Public License as published by 00006 // the Free Software Foundation, either version 3 of the License, or 00007 // (at your option) any later version. 00008 // 00009 // Moodle is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU General Public License for more details. 00013 // 00014 // You should have received a copy of the GNU General Public License 00015 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00016 00025 defined('MOODLE_INTERNAL') || die(); 00026 00027 00034 class restore_quiz_activity_structure_step extends restore_questions_activity_structure_step { 00035 00036 protected function define_structure() { 00037 00038 $paths = array(); 00039 $userinfo = $this->get_setting_value('userinfo'); 00040 00041 $quiz = new restore_path_element('quiz', '/activity/quiz'); 00042 $paths[] = $quiz; 00043 00044 // A chance for access subplugings to set up their quiz data. 00045 $this->add_subplugin_structure('quizaccess', $quiz); 00046 00047 $paths[] = new restore_path_element('quiz_question_instance', 00048 '/activity/quiz/question_instances/question_instance'); 00049 $paths[] = new restore_path_element('quiz_feedback', '/activity/quiz/feedbacks/feedback'); 00050 $paths[] = new restore_path_element('quiz_override', '/activity/quiz/overrides/override'); 00051 00052 if ($userinfo) { 00053 $paths[] = new restore_path_element('quiz_grade', '/activity/quiz/grades/grade'); 00054 00055 if ($this->task->get_old_moduleversion() > 2011010100) { 00056 // Restoring from a version 2.1 dev or later. 00057 // Process the new-style attempt data. 00058 $quizattempt = new restore_path_element('quiz_attempt', 00059 '/activity/quiz/attempts/attempt'); 00060 $paths[] = $quizattempt; 00061 00062 // Add states and sessions 00063 $this->add_question_usages($quizattempt, $paths); 00064 00065 // A chance for access subplugings to set up their attempt data. 00066 $this->add_subplugin_structure('quizaccess', $quizattempt); 00067 00068 } else { 00069 // Restoring from a version 2.0.x+ or earlier. 00070 // Upgrade the legacy attempt data. 00071 $quizattempt = new restore_path_element('quiz_attempt_legacy', 00072 '/activity/quiz/attempts/attempt', 00073 true); 00074 $paths[] = $quizattempt; 00075 $this->add_legacy_question_attempt_data($quizattempt, $paths); 00076 } 00077 } 00078 00079 // Return the paths wrapped into standard activity structure 00080 return $this->prepare_activity_structure($paths); 00081 } 00082 00083 protected function process_quiz($data) { 00084 global $CFG, $DB; 00085 00086 $data = (object)$data; 00087 $oldid = $data->id; 00088 $data->course = $this->get_courseid(); 00089 00090 $data->timeopen = $this->apply_date_offset($data->timeopen); 00091 $data->timeclose = $this->apply_date_offset($data->timeclose); 00092 $data->timecreated = $this->apply_date_offset($data->timecreated); 00093 $data->timemodified = $this->apply_date_offset($data->timemodified); 00094 00095 // Needed by {@link process_quiz_attempt_legacy} 00096 $this->oldquizlayout = $data->questions; 00097 $data->questions = $this->questions_recode_layout($data->questions); 00098 00099 // quiz->attempts can come both in data->attempts and 00100 // data->attempts_number, handle both. MDL-26229 00101 if (isset($data->attempts_number)) { 00102 $data->attempts = $data->attempts_number; 00103 unset($data->attempts_number); 00104 } 00105 00106 // The old optionflags and penaltyscheme from 2.0 need to be mapped to 00107 // the new preferredbehaviour. MDL-20636 00108 if (!isset($data->preferredbehaviour)) { 00109 if (empty($data->optionflags)) { 00110 $data->preferredbehaviour = 'deferredfeedback'; 00111 } else if (empty($data->penaltyscheme)) { 00112 $data->preferredbehaviour = 'adaptivenopenalty'; 00113 } else { 00114 $data->preferredbehaviour = 'adaptive'; 00115 } 00116 unset($data->optionflags); 00117 unset($data->penaltyscheme); 00118 } 00119 00120 // The old review column from 2.0 need to be split into the seven new 00121 // review columns. MDL-20636 00122 if (isset($data->review)) { 00123 require_once($CFG->dirroot . '/mod/quiz/locallib.php'); 00124 00125 if (!defined('QUIZ_OLD_IMMEDIATELY')) { 00126 define('QUIZ_OLD_IMMEDIATELY', 0x3c003f); 00127 define('QUIZ_OLD_OPEN', 0x3c00fc0); 00128 define('QUIZ_OLD_CLOSED', 0x3c03f000); 00129 00130 define('QUIZ_OLD_RESPONSES', 1*0x1041); 00131 define('QUIZ_OLD_SCORES', 2*0x1041); 00132 define('QUIZ_OLD_FEEDBACK', 4*0x1041); 00133 define('QUIZ_OLD_ANSWERS', 8*0x1041); 00134 define('QUIZ_OLD_SOLUTIONS', 16*0x1041); 00135 define('QUIZ_OLD_GENERALFEEDBACK', 32*0x1041); 00136 define('QUIZ_OLD_OVERALLFEEDBACK', 1*0x4440000); 00137 } 00138 00139 $oldreview = $data->review; 00140 00141 $data->reviewattempt = 00142 mod_quiz_display_options::DURING | 00143 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_RESPONSES ? 00144 mod_quiz_display_options::IMMEDIATELY_AFTER : 0) | 00145 ($oldreview & QUIZ_OLD_OPEN & QUIZ_OLD_RESPONSES ? 00146 mod_quiz_display_options::LATER_WHILE_OPEN : 0) | 00147 ($oldreview & QUIZ_OLD_CLOSED & QUIZ_OLD_RESPONSES ? 00148 mod_quiz_display_options::AFTER_CLOSE : 0); 00149 00150 $data->reviewcorrectness = 00151 mod_quiz_display_options::DURING | 00152 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_SCORES ? 00153 mod_quiz_display_options::IMMEDIATELY_AFTER : 0) | 00154 ($oldreview & QUIZ_OLD_OPEN & QUIZ_OLD_SCORES ? 00155 mod_quiz_display_options::LATER_WHILE_OPEN : 0) | 00156 ($oldreview & QUIZ_OLD_CLOSED & QUIZ_OLD_SCORES ? 00157 mod_quiz_display_options::AFTER_CLOSE : 0); 00158 00159 $data->reviewmarks = 00160 mod_quiz_display_options::DURING | 00161 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_SCORES ? 00162 mod_quiz_display_options::IMMEDIATELY_AFTER : 0) | 00163 ($oldreview & QUIZ_OLD_OPEN & QUIZ_OLD_SCORES ? 00164 mod_quiz_display_options::LATER_WHILE_OPEN : 0) | 00165 ($oldreview & QUIZ_OLD_CLOSED & QUIZ_OLD_SCORES ? 00166 mod_quiz_display_options::AFTER_CLOSE : 0); 00167 00168 $data->reviewspecificfeedback = 00169 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_FEEDBACK ? 00170 mod_quiz_display_options::DURING : 0) | 00171 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_FEEDBACK ? 00172 mod_quiz_display_options::IMMEDIATELY_AFTER : 0) | 00173 ($oldreview & QUIZ_OLD_OPEN & QUIZ_OLD_FEEDBACK ? 00174 mod_quiz_display_options::LATER_WHILE_OPEN : 0) | 00175 ($oldreview & QUIZ_OLD_CLOSED & QUIZ_OLD_FEEDBACK ? 00176 mod_quiz_display_options::AFTER_CLOSE : 0); 00177 00178 $data->reviewgeneralfeedback = 00179 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_GENERALFEEDBACK ? 00180 mod_quiz_display_options::DURING : 0) | 00181 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_GENERALFEEDBACK ? 00182 mod_quiz_display_options::IMMEDIATELY_AFTER : 0) | 00183 ($oldreview & QUIZ_OLD_OPEN & QUIZ_OLD_GENERALFEEDBACK ? 00184 mod_quiz_display_options::LATER_WHILE_OPEN : 0) | 00185 ($oldreview & QUIZ_OLD_CLOSED & QUIZ_OLD_GENERALFEEDBACK ? 00186 mod_quiz_display_options::AFTER_CLOSE : 0); 00187 00188 $data->reviewrightanswer = 00189 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_ANSWERS ? 00190 mod_quiz_display_options::DURING : 0) | 00191 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_ANSWERS ? 00192 mod_quiz_display_options::IMMEDIATELY_AFTER : 0) | 00193 ($oldreview & QUIZ_OLD_OPEN & QUIZ_OLD_ANSWERS ? 00194 mod_quiz_display_options::LATER_WHILE_OPEN : 0) | 00195 ($oldreview & QUIZ_OLD_CLOSED & QUIZ_OLD_ANSWERS ? 00196 mod_quiz_display_options::AFTER_CLOSE : 0); 00197 00198 $data->reviewoverallfeedback = 00199 0 | 00200 ($oldreview & QUIZ_OLD_IMMEDIATELY & QUIZ_OLD_OVERALLFEEDBACK ? 00201 mod_quiz_display_options::IMMEDIATELY_AFTER : 0) | 00202 ($oldreview & QUIZ_OLD_OPEN & QUIZ_OLD_OVERALLFEEDBACK ? 00203 mod_quiz_display_options::LATER_WHILE_OPEN : 0) | 00204 ($oldreview & QUIZ_OLD_CLOSED & QUIZ_OLD_OVERALLFEEDBACK ? 00205 mod_quiz_display_options::AFTER_CLOSE : 0); 00206 } 00207 00208 // The old popup column from from <= 2.1 need to be mapped to 00209 // the new browsersecurity. MDL-29627 00210 if (!isset($data->browsersecurity)) { 00211 if (empty($data->popup)) { 00212 $data->browsersecurity = '-'; 00213 } else if ($data->popup == 1) { 00214 $data->browsersecurity = 'securewindow'; 00215 } else if ($data->popup == 2) { 00216 $data->browsersecurity = 'safebrowser'; 00217 } else { 00218 $data->preferredbehaviour = '-'; 00219 } 00220 unset($data->popup); 00221 } 00222 00223 // insert the quiz record 00224 $newitemid = $DB->insert_record('quiz', $data); 00225 // immediately after inserting "activity" record, call this 00226 $this->apply_activity_instance($newitemid); 00227 } 00228 00229 protected function process_quiz_question_instance($data) { 00230 global $DB; 00231 00232 $data = (object)$data; 00233 $oldid = $data->id; 00234 00235 $data->quiz = $this->get_new_parentid('quiz'); 00236 00237 $data->question = $this->get_mappingid('question', $data->question); 00238 00239 $DB->insert_record('quiz_question_instances', $data); 00240 } 00241 00242 protected function process_quiz_feedback($data) { 00243 global $DB; 00244 00245 $data = (object)$data; 00246 $oldid = $data->id; 00247 00248 $data->quizid = $this->get_new_parentid('quiz'); 00249 00250 $newitemid = $DB->insert_record('quiz_feedback', $data); 00251 $this->set_mapping('quiz_feedback', $oldid, $newitemid, true); // Has related files 00252 } 00253 00254 protected function process_quiz_override($data) { 00255 global $DB; 00256 00257 $data = (object)$data; 00258 $oldid = $data->id; 00259 00260 // Based on userinfo, we'll restore user overides or no 00261 $userinfo = $this->get_setting_value('userinfo'); 00262 00263 // Skip user overrides if we are not restoring userinfo 00264 if (!$userinfo && !is_null($data->userid)) { 00265 return; 00266 } 00267 00268 $data->quiz = $this->get_new_parentid('quiz'); 00269 00270 $data->userid = $this->get_mappingid('user', $data->userid); 00271 $data->groupid = $this->get_mappingid('group', $data->groupid); 00272 00273 $data->timeopen = $this->apply_date_offset($data->timeopen); 00274 $data->timeclose = $this->apply_date_offset($data->timeclose); 00275 00276 $newitemid = $DB->insert_record('quiz_overrides', $data); 00277 00278 // Add mapping, restore of logs needs it 00279 $this->set_mapping('quiz_override', $oldid, $newitemid); 00280 } 00281 00282 protected function process_quiz_grade($data) { 00283 global $DB; 00284 00285 $data = (object)$data; 00286 $oldid = $data->id; 00287 00288 $data->quiz = $this->get_new_parentid('quiz'); 00289 00290 $data->userid = $this->get_mappingid('user', $data->userid); 00291 $data->grade = $data->gradeval; 00292 00293 $data->timemodified = $this->apply_date_offset($data->timemodified); 00294 00295 $DB->insert_record('quiz_grades', $data); 00296 } 00297 00298 protected function process_quiz_attempt($data) { 00299 $data = (object)$data; 00300 00301 $data->quiz = $this->get_new_parentid('quiz'); 00302 $data->attempt = $data->attemptnum; 00303 00304 $data->userid = $this->get_mappingid('user', $data->userid); 00305 00306 $data->timestart = $this->apply_date_offset($data->timestart); 00307 $data->timefinish = $this->apply_date_offset($data->timefinish); 00308 $data->timemodified = $this->apply_date_offset($data->timemodified); 00309 00310 // The data is actually inserted into the database later in inform_new_usage_id. 00311 $this->currentquizattempt = clone($data); 00312 } 00313 00314 protected function process_quiz_attempt_legacy($data) { 00315 global $DB; 00316 00317 $this->process_quiz_attempt($data); 00318 00319 $quiz = $DB->get_record('quiz', array('id' => $this->get_new_parentid('quiz'))); 00320 $quiz->oldquestions = $this->oldquizlayout; 00321 $this->process_legacy_quiz_attempt_data($data, $quiz); 00322 } 00323 00324 protected function inform_new_usage_id($newusageid) { 00325 global $DB; 00326 00327 $data = $this->currentquizattempt; 00328 00329 $oldid = $data->id; 00330 $data->uniqueid = $newusageid; 00331 00332 $newitemid = $DB->insert_record('quiz_attempts', $data); 00333 00334 // Save quiz_attempt->id mapping, because logs use it 00335 $this->set_mapping('quiz_attempt', $oldid, $newitemid, false); 00336 } 00337 00338 protected function after_execute() { 00339 parent::after_execute(); 00340 // Add quiz related files, no need to match by itemname (just internally handled context) 00341 $this->add_related_files('mod_quiz', 'intro', null); 00342 // Add feedback related files, matching by itemname = 'quiz_feedback' 00343 $this->add_related_files('mod_quiz', 'feedback', 'quiz_feedback'); 00344 } 00345 }