Files
moodle/mod/exercise/restorelib.php
T
moodler 69901d1994 First main-tree version of the Exercise module (formerly in contrib)
by Ray Kingdon.

Works quite well, but it's not clear yet if this will be part of
major releases (due to the overlap with assignments and workshops
and the confusion this may cause).
2003-10-07 14:54:21 +00:00

427 lines
18 KiB
PHP

<?PHP //$Id$
//This php script contains all the stuff to backup/restore
//exercise mods
//This is the "graphical" structure of the exercise mod:
//
// exercise
// (CL,pk->id)
// |
// |
// |
// |------------------------------|---------------------------------------------|
// | |
// | |
// | exercise_submissions
// | (UL,pk->id,fk->exerciseid,files)
// | |
// | |
// | |
// | |---------------------| |------------------------------| |
// | | | | | |
// exercise_elements exercise_grades exercise_assessments
// (CL,pk->id,fk->exerciseid) (UL,pk->id,fk->assessmentid) (UL,pk->id,fk->submissionid)
// | ( fk->elementno )
// |
// |
// exercise_rubrics
// (CL,pk->id,fk->elementno)
//
// Meaning: pk->primary key field of the table
// fk->foreign key to link with parent
// nt->nested field (recursive data)
// CL->course level info
// UL->user level info
// files->table may have files)
//
//-----------------------------------------------------------
//This function executes all the restore procedure about this mod
function exercise_restore_mods($mod,$restore) {
global $CFG;
$status = true;
//Get record from backup_ids
$data = backup_getid($restore->backup_unique_code,$mod->modtype,$mod->id);
if ($data) {
//Now get completed xmlized object
$info = $data->info;
//traverse_xmlize($info); //Debug
//print_object ($GLOBALS['traverse_array']); //Debug
//$GLOBALS['traverse_array']=""; //Debug
//Now, build the exercise record structure
$exercise->course = $restore->course_id;
$exercise->name = backup_todb($info['MOD']['#']['NAME']['0']['#']);
$exercise->nelements = backup_todb($info['MOD']['#']['NELEMENTS']['0']['#']);
$exercise->phase = backup_todb($info['MOD']['#']['PHASE']['0']['#']);
$exercise->gradingstrategy = backup_todb($info['MOD']['#']['GRADINGSTRATEGY']['0']['#']);
$exercise->usemaximum = backup_todb($info['MOD']['#']['USEMAXIMUM']['0']['#']);
$exercise->anonymous = backup_todb($info['MOD']['#']['ANONYMOUS']['0']['#']);
$exercise->maxbytes = backup_todb($info['MOD']['#']['MAXBYTES']['0']['#']);
$exercise->deadline = backup_todb($info['MOD']['#']['DEADLINE']['0']['#']);
$exercise->grade = backup_todb($info['MOD']['#']['GRADE']['0']['#']);
$exercise->timemodified = backup_todb($info['MOD']['#']['TIMEMODIFIED']['0']['#']);
$exercise->teacherweight = backup_todb($info['MOD']['#']['TEACHERWEIGHT']['0']['#']);
$exercise->gradingweight = backup_todb($info['MOD']['#']['GRADINGWEIGHT']['0']['#']);
$exercise->showleaguetable = backup_todb($info['MOD']['#']['SHOWLEAGUETABLE']['0']['#']);
//The structure is equal to the db, so insert the exercise
$newid = insert_record ("exercise",$exercise);
//Do some output
echo "<ul><li>".get_string("modulename","exercise")." \"".$exercise->name."\"<br>";
backup_flush(300);
if ($newid) {
//We have the newid, update backup_ids
backup_putid($restore->backup_unique_code,$mod->modtype,
$mod->id, $newid);
//We have to restore the exercise_elements table now (course level table)
$status = exercise_elements_restore_mods($newid,$info,$restore);
//Now check if want to restore user data and do it.
if ($restore->mods['exercise']->userinfo) {
//Restore exercise_submissions
$status = exercise_submissions_restore_mods ($mod->id, $newid,$info,$restore);
}
} else {
$status = false;
}
//Finalize ul
echo "</ul>";
} else {
$status = false;
}
return $status;
}
//This function restores the exercise_elements
function exercise_elements_restore_mods($exercise_id,$info,$restore) {
global $CFG;
$status = true;
//Get the exercise_elements array
$elements = $info['MOD']['#']['ELEMENTS']['0']['#']['ELEMENT'];
//Iterate over exercise_elements
for($i = 0; $i < sizeof($elements); $i++) {
$ele_info = $elements[$i];
//traverse_xmlize($ele_info); //Debug
//print_object ($GLOBALS['traverse_array']); //Debug
//$GLOBALS['traverse_array']=""; //Debug
//Now, build the exercise_ELEMENTS record structure
$element->exerciseid = $exercise_id;
$element->elementno = backup_todb($ele_info['#']['ELEMENTNO']['0']['#']);
$element->description = backup_todb($ele_info['#']['DESCRIPTION']['0']['#']);
$element->scale = backup_todb($ele_info['#']['SCALE']['0']['#']);
$element->maxscore = backup_todb($ele_info['#']['MAXSCORE']['0']['#']);
$element->weight = backup_todb($ele_info['#']['WEIGHT']['0']['#']);
//The structure is equal to the db, so insert the exercise_elements
$newid = insert_record ("exercise_elements",$element);
//Do some output
if (($i+1) % 10 == 0) {
echo ".";
if (($i+1) % 200 == 0) {
echo "<br>";
}
backup_flush(300);
}
if ($newid) {
//We have to restore the exercise_rubrics table now (course level table)
$status = exercise_rubrics_restore_mods($exercise_id,$element->elementno,$ele_info,$restore);
} else {
$status = false;
}
}
return $status;
}
//This function restores the exercise_rubrics
function exercise_rubrics_restore_mods($exercise_id,$elementno,$info,$restore) {
global $CFG;
$status = true;
//Get the exercise_rubrics array
$rubrics = $info['#']['RUBRICS']['0']['#']['RUBRIC'];
//Iterate over exercise_rubrics
for($i = 0; $i < sizeof($rubrics); $i++) {
$rub_info = $rubrics[$i];
//traverse_xmlize($rub_info); //Debug
//print_object ($GLOBALS['traverse_array']); //Debug
//$GLOBALS['traverse_array']=""; //Debug
//Now, build the exercise_RUBRICS record structure
$rubric->exerciseid = $exercise_id;
$rubric->elementno = $elementno;
$rubric->rubricno = backup_todb($rub_info['#']['RUBRICNO']['0']['#']);
$rubric->description = backup_todb($rub_info['#']['DESCRIPTION']['0']['#']);
//The structure is equal to the db, so insert the exercise_rubrics
$newid = insert_record ("exercise_rubrics",$rubric);
//Do some output
if (($i+1) % 10 == 0) {
echo ".";
if (($i+1) % 200 == 0) {
echo "<br>";
}
backup_flush(300);
}
if (!$newid) {
$status = false;
}
}
return $status;
}
//This function restores the exercise_submissions
function exercise_submissions_restore_mods($old_exercise_id, $new_exercise_id,$info,$restore) {
global $CFG;
$status = true;
//Get the submissions array
$submissions = $info['MOD']['#']['SUBMISSIONS']['0']['#']['SUBMISSION'];
//Iterate over submissions
for($i = 0; $i < sizeof($submissions); $i++) {
$sub_info = $submissions[$i];
//traverse_xmlize($sub_info); //Debug
//print_object ($GLOBALS['traverse_array']); //Debug
//$GLOBALS['traverse_array']=""; //Debug
//We'll need this later!!
$oldid = backup_todb($sub_info['#']['ID']['0']['#']);
$olduserid = backup_todb($sub_info['#']['USERID']['0']['#']);
//Now, build the exercise_SUBMISSIONS record structure
$submission->exerciseid = $new_exercise_id;
$submission->userid = backup_todb($sub_info['#']['USERID']['0']['#']);
$submission->title = backup_todb($sub_info['#']['TITLE']['0']['#']);
$submission->timecreated = backup_todb($sub_info['#']['TIMECREATED']['0']['#']);
$submission->resubmit = backup_todb($sub_info['#']['RESUBMIT']['0']['#']);
$submission->mailed = backup_todb($sub_info['#']['MAILED']['0']['#']);
$submission->isexercise = backup_todb($sub_info['#']['ISEXERCISE']['0']['#']);
//We have to recode the userid field
$user = backup_getid($restore->backup_unique_code,"user",$olduserid);
if ($user) {
$submission->userid = $user->new_id;
}
//The structure is equal to the db, so insert the exercise_submission
$newid = insert_record ("exercise_submissions",$submission);
//Do some output
if (($i+1) % 50 == 0) {
echo ".";
if (($i+1) % 1000 == 0) {
echo "<br>";
}
backup_flush(300);
}
if ($newid) {
//We have the newid, update backup_ids
backup_putid($restore->backup_unique_code,"exercise_submissions",$oldid,
$newid);
//Now copy moddata associated files
$status = exercise_restore_files ($oldid, $newid,$restore);
//Now we need to restore exercise_assessments (user level table)
if ($status) {
$status = exercise_assessments_restore_mods ($new_exercise_id, $newid,$sub_info,$restore);
}
} else {
$status = false;
}
}
return $status;
}
//This function restores the exercise_assessments
function exercise_assessments_restore_mods($new_exercise_id, $new_submission_id,$info,$restore) {
global $CFG;
$status = true;
//Get the assessments array
$assessments = $info['#']['ASSESSMENTS']['0']['#']['ASSESSMENT'];
//Iterate over assessments
for($i = 0; $i < sizeof($assessments); $i++) {
$ass_info = $assessments[$i];
//traverse_xmlize($ass_info); //Debug
//print_object ($GLOBALS['traverse_array']); //Debug
//$GLOBALS['traverse_array']=""; //Debug
//We'll need this later!!
$oldid = backup_todb($ass_info['#']['ID']['0']['#']);
$olduserid = backup_todb($ass_info['#']['USERID']['0']['#']);
//Now, build the exercise_ASSESSMENTS record structure
$assessment->exerciseid = $new_exercise_id;
$assessment->submissionid = $new_submission_id;
$assessment->userid = backup_todb($ass_info['#']['USERID']['0']['#']);
$assessment->timecreated = backup_todb($ass_info['#']['TIMECREATED']['0']['#']);
$assessment->timegraded = backup_todb($ass_info['#']['TIMEGRADED']['0']['#']);
$assessment->grade = backup_todb($ass_info['#']['GRADE']['0']['#']);
$assessment->gradinggrade = backup_todb($ass_info['#']['GRADINGGRADE']['0']['#']);
$assessment->mailed = backup_todb($ass_info['#']['MAILED']['0']['#']);
$assessment->generalcomment = backup_todb($ass_info['#']['GENERALCOMMENT']['0']['#']);
$assessment->teachercomment = backup_todb($ass_info['#']['TEACHERCOMMENT']['0']['#']);
//We have to recode the userid field
$user = backup_getid($restore->backup_unique_code,"user",$olduserid);
if ($user) {
$assessment->userid = $user->new_id;
}
//The structure is equal to the db, so insert the exercise_assessment
$newid = insert_record ("exercise_assessments",$assessment);
//Do some output
if (($i+1) % 50 == 0) {
echo ".";
if (($i+1) % 1000 == 0) {
echo "<br>";
}
backup_flush(300);
}
if ($newid) {
//We have the newid, update backup_ids
backup_putid($restore->backup_unique_code,"exercise_assessments",$oldid,
$newid);
//Now we need to restore exercise_grades (user level table)
if ($status) {
$status = exercise_grades_restore_mods ($new_exercise_id, $newid,$ass_info,$restore);
}
} else {
$status = false;
}
}
return $status;
}
//This function restores the exercise_grades
function exercise_grades_restore_mods($new_exercise_id, $new_assessment_id,$info,$restore) {
global $CFG;
$status = true;
//Get the grades array
$grades = $info['#']['GRADES']['0']['#']['GRADE'];
//Iterate over grades
for($i = 0; $i < sizeof($grades); $i++) {
$gra_info = $grades[$i];
//traverse_xmlize($gra_info); //Debug
//print_object ($GLOBALS['traverse_array']); //Debug
//$GLOBALS['traverse_array']=""; //Debug
//Now, build the exercise_GRADES record structure
$grade->exerciseid = $new_exercise_id;
$grade->assessmentid = $new_assessment_id;
$grade->elementno = backup_todb($gra_info['#']['ELEMENTNO']['0']['#']);
$grade->feedback = backup_todb($gra_info['#']['FEEDBACK']['0']['#']);
$grade->grade = backup_todb($gra_info['#']['GRADE_VALUE']['0']['#']);
//The structure is equal to the db, so insert the exercise_grade
$newid = insert_record ("exercise_grades",$grade);
//Do some output
if (($i+1) % 50 == 0) {
echo ".";
if (($i+1) % 1000 == 0) {
echo "<br>";
}
backup_flush(300);
}
if (!$newid) {
$status = false;
}
}
return $status;
}
//This function copies the exercise related info from backup temp dir to course moddata folder,
//creating it if needed and recoding everything (submission_id)
function exercise_restore_files ($oldsubmiss, $newsubmiss, $restore) {
global $CFG;
$status = true;
$todo = false;
$moddata_path = "";
$exercise_path = "";
$temp_path = "";
//First, we check to "course_id" exists and create is as necessary
//in CFG->dataroot
$dest_dir = $CFG->dataroot."/".$restore->course_id;
$status = check_dir_exists($dest_dir,true);
//Now, locate course's moddata directory
$moddata_path = $CFG->dataroot."/".$restore->course_id."/".$CFG->moddata;
//Check it exists and create it
$status = check_dir_exists($moddata_path,true);
//Now, locate exercise directory
if ($status) {
$exercise_path = $moddata_path."/exercise";
//Check it exists and create it
$status = check_dir_exists($exercise_path,true);
}
//Now locate the temp dir we are gong to restore
if ($status) {
$temp_path = $CFG->dataroot."/temp/backup/".$restore->backup_unique_code.
"/moddata/exercise/".$oldsubmiss;
//Check it exists
if (is_dir($temp_path)) {
$todo = true;
}
}
//If todo, we create the neccesary dirs in course moddata/exercise
if ($status and $todo) {
//First this exercise id
$this_exercise_path = $exercise_path."/".$newsubmiss;
$status = check_dir_exists($this_exercise_path,true);
//And now, copy temp_path to this_exercise_path
$status = backup_copy_file($temp_path, $this_exercise_path);
}
return $status;
}
?>