### Eclipse Workspace Patch 1.0 #P moodle20 Index: mod/quiz/backuplib.php =================================================================== RCS file: /cvsroot/moodle/moodle/mod/quiz/backuplib.php,v retrieving revision 1.75 diff -u -r1.75 backuplib.php --- mod/quiz/backuplib.php 4 Nov 2009 11:58:32 -0000 1.75 +++ mod/quiz/backuplib.php 16 Feb 2010 04:48:11 -0000 @@ -279,6 +279,8 @@ $status = backup_quiz_question_instances($bf,$preferences,$quiz->id); //Now we print to xml quiz_feedback (Course Level) $status = backup_quiz_feedback($bf,$preferences,$quiz->id); + //Now we print to xml quiz_overrides (Course Level) + $status = backup_quiz_overrides($bf,$preferences,$quiz->id); //if we've selected to backup users info, then execute: // - backup_quiz_grades // - backup_quiz_attempts @@ -341,6 +343,40 @@ return $status; } + //Backup quiz_overrides contents (executed from quiz_backup_mods) + function backup_quiz_overrides ($bf,$preferences,$quiz) { + global $DB; + $status = true; + $douserdata = backup_userdata_selected($preferences,'quiz',$quiz); + + $quiz_overrides = $DB->get_records('quiz_overrides',array('quiz' =>$quiz),'id'); + //If there are quiz_overrides + if ($quiz_overrides) { + //Write start tag + $status = fwrite ($bf,start_tag("OVERRIDES",4,true)); + //Iterate over each quiz_override + foreach ($quiz_overrides as $quiz_override) { + // Only backup user overrides if we are backing up user data + if ($douserdata || $quiz_override->userid == 0) { + //Start quiz override + $status = fwrite ($bf,start_tag("OVERRIDE",5,true)); + //Print quiz_override contents + fwrite ($bf,full_tag("ID",6,false,$quiz_override->id)); + fwrite ($bf,full_tag("USERID",6,false,$quiz_override->userid)); + fwrite ($bf,full_tag("GROUPID",6,false,$quiz_override->groupid)); + fwrite ($bf,full_tag("TIMEOPEN",6,false,$quiz_override->timeopen)); + fwrite ($bf,full_tag("TIMECLOSE",6,false,$quiz_override->timeclose)); + fwrite ($bf,full_tag("TIMELIMIT",6,false,$quiz_override->timelimit)); + //End quiz override + $status = fwrite ($bf,end_tag("OVERRIDE",5,true)); + } + } + //Write end tag + $status = fwrite ($bf,end_tag("OVERRIDES",4,true)); + } + return $status; + } + //Backup quiz_question_instances contents (executed from quiz_backup_mods) function backup_quiz_feedback ($bf,$preferences,$quiz) { global $DB; Index: mod/quiz/restorelib.php =================================================================== RCS file: /cvsroot/moodle/moodle/mod/quiz/restorelib.php,v retrieving revision 1.97 diff -u -r1.97 restorelib.php --- mod/quiz/restorelib.php 4 Nov 2009 11:58:32 -0000 1.97 +++ mod/quiz/restorelib.php 16 Feb 2010 04:48:11 -0000 @@ -113,6 +113,8 @@ $status = quiz_question_instances_restore_mods($newid,$info,$restore); //We have to restore the feedback now (course level table) $status = quiz_feedback_restore_mods($newid, $info, $restore, $quiz); + //We have to restore the overrides now (course level table) + $status = quiz_overrides_restore_mods($newid, $info, $restore, $quiz); //Now check if want to restore user data and do it. if (restore_userdata_selected($restore,'quiz',$mod->id)) { //Restore quiz_attempts @@ -241,6 +243,76 @@ return $status; } + //This function restores the quiz_overrides + function quiz_overrides_restore_mods($quiz_id, $info, $restore, $quiz) { + global $DB; + + $douserdata = restore_userdata_selected($restore,'quiz',$quiz_id); + + $status = true; + + //Get the quiz_feedback array + if (array_key_exists('OVERRIDES', $info['MOD']['#'])) { + $overrides = $info['MOD']['#']['OVERRIDES']['0']['#']['OVERRIDE']; + + //Iterate over the feedbacks + foreach ($overrides as $override_info) { + //traverse_xmlize($override_info); //Debug + //print_object ($GLOBALS['traverse_array']); //Debug + //$GLOBALS['traverse_array']=""; //Debug + + //We'll need this later!! + $oldid = backup_todb($override_info['#']['ID']['0']['#']); + + //Now, build the quiz_overrides record structure + $override = new stdClass(); + $override->quiz = $quiz_id; + $override->groupid = backup_todb($override_info['#']['GROUPID']['0']['#']); + $override->userid = backup_todb($override_info['#']['USERID']['0']['#']); + $override->timeopen = backup_todb($override_info['#']['TIMEOPEN']['0']['#']); + $override->timeclose = backup_todb($override_info['#']['TIMECLOSE']['0']['#']); + $override->timelimit = backup_todb($override_info['#']['TIMELIMIT']['0']['#']); + + // Only restore user overrides if we are restoring user data + if ($douserdata || $override->userid == 0) { + + //We have to recode the userid field + if ($override->userid) { + if (!$user = backup_getid($restore->backup_unique_code,"user",$override->userid)) { + debugging("override can not be restored, user id $override->userid not present in backup"); + // do not not block the restore + continue; + } + $override->userid = $user->new_id; + + } + + //We have to recode the groupid field + if ($override->groupid) { + if (!$group = backup_getid($restore->backup_unique_code,"groups",$override->groupid)) { + debugging("override can not be restored, group id $override->groupid not present in backup"); + // do not not block the restore + continue; + } + $override->groupid = $group->new_id; + } + + //The structure is equal to the db, so insert the quiz_question_instances + $newid = $DB->insert_record('quiz_overrides', $override); + + if ($newid) { + //We have the newid, update backup_ids + backup_putid($restore->backup_unique_code, 'quiz_overrides', $oldid, $newid); + } else { + $status = false; + } + } + } + } + + return $status; + } + //This function restores the quiz_attempts function quiz_attempts_restore_mods($quiz_id,$info,$restore) { global $CFG, $DB;