Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/mod/quiz/backup/moodle2/restore_quiz_stepslib.php
Go to the documentation of this file.
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 }
 All Data Structures Namespaces Files Functions Variables Enumerations