diff --git a/mod/workshop/backup/moodle2/restore_workshop_activity_task.class.php b/mod/workshop/backup/moodle2/restore_workshop_activity_task.class.php new file mode 100644 index 00000000000..cc3f52bac2a --- /dev/null +++ b/mod/workshop/backup/moodle2/restore_workshop_activity_task.class.php @@ -0,0 +1,80 @@ +. + +/** + * @package moodlecore + * @subpackage backup-moodle2 + * @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +require_once($CFG->dirroot . '/mod/workshop/backup/moodle2/restore_workshop_stepslib.php'); // Because it exists (must) + +/** + * workshop restore task that provides all the settings and steps to perform one + * complete restore of the activity + */ +class restore_workshop_activity_task extends restore_activity_task { + + /** + * Define (add) particular settings this activity can have + */ + protected function define_my_settings() { + // No particular settings for this activity + } + + /** + * Define (add) particular steps this activity can have + */ + protected function define_my_steps() { + // Choice only has one structure step + $this->add_step(new restore_workshop_activity_structure_step('workshop_structure', 'workshop.xml')); + } + + /** + * Define the contents in the activity that must be + * processed by the link decoder + */ + static public function define_decode_contents() { + $contents = array(); + + $contents[] = new restore_decode_content('workshop', + array('intro', 'instructauthors', 'instructreviewers'), 'workshop'); + $contents[] = new restore_decode_content('workshop_submissions', + array('content', 'feedbackauthor'), 'workshop_submission'); + $contents[] = new restore_decode_content('workshop_assessments', + array('feedbackauthor', 'feedbackreviewer'), 'workshop_assessment'); + + return $contents; + } + + /** + * Define the decoding rules for links belonging + * to the activity to be executed by the link decoder + */ + static public function define_decode_rules() { + $rules = array(); + + $rules[] = new restore_decode_rule('WORKSHOPVIEWBYID', '/mod/workshop/view.php?id=$1', 'course_module'); + $rules[] = new restore_decode_rule('WORKSHOPINDEX', '/mod/workshop/index.php?id=$1', 'course'); + + return $rules; + + } +} diff --git a/mod/workshop/backup/moodle2/restore_workshop_stepslib.php b/mod/workshop/backup/moodle2/restore_workshop_stepslib.php new file mode 100644 index 00000000000..78ced49ac0f --- /dev/null +++ b/mod/workshop/backup/moodle2/restore_workshop_stepslib.php @@ -0,0 +1,224 @@ +. + +/** + * @package moodlecore + * @subpackage backup-moodle2 + * @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/** + * Define all the restore steps that will be used by the restore_workshop_activity_task + */ + +/** + * Structure step to restore one workshop activity + */ +class restore_workshop_activity_structure_step extends restore_activity_structure_step { + + protected function define_structure() { + + $paths = array(); + + $userinfo = $this->get_setting_value('userinfo'); // are we including userinfo? + + //////////////////////////////////////////////////////////////////////// + // XML interesting paths - non-user data + //////////////////////////////////////////////////////////////////////// + + // root element describing workshop instance + $workshop = new restore_path_element('workshop', '/activity/workshop'); + $paths[] = $workshop; + + // Apply for 'workshopform' subplugins optional paths at workshop level + $this->add_subplugin_structure('workshopform', $workshop); + + // Apply for 'workshopeval' subplugins optional paths at workshop level + $this->add_subplugin_structure('workshopeval', $workshop); + + // example submissions + $paths[] = new restore_path_element('workshop_examplesubmission', + '/activity/workshop/examplesubmissions/examplesubmission'); + + // reference assessment of the example submission + $referenceassessment = new restore_path_element('workshop_referenceassessment', + '/activity/workshop/examplesubmissions/examplesubmission/referenceassessment'); + $paths[] = $referenceassessment; + + // Apply for 'workshopform' subplugins optional paths at referenceassessment level + $this->add_subplugin_structure('workshopform', $referenceassessment); + + // End here if no-user data has been selected + if (!$userinfo) { + return $this->prepare_activity_structure($paths); + } + + //////////////////////////////////////////////////////////////////////// + // XML interesting paths - user data + //////////////////////////////////////////////////////////////////////// + + // assessments of example submissions + $exampleassessment = new restore_path_element('workshop_exampleassessment', + '/activity/workshop/examplesubmissions/examplesubmission/exampleassessments/exampleassessment'); + $paths[] = $exampleassessment; + + // Apply for 'workshopform' subplugins optional paths at exampleassessment level + $this->add_subplugin_structure('workshopform', $exampleassessment); + + // submissions + $paths[] = new restore_path_element('workshop_submission', '/activity/workshop/submissions/submission'); + + // allocated assessments + $assessment = new restore_path_element('workshop_assessment', + '/activity/workshop/submissions/submission/assessments/assessment'); + $paths[] = $assessment; + + // Apply for 'workshopform' subplugins optional paths at assessment level + $this->add_subplugin_structure('workshopform', $assessment); + + // aggregations of grading grades in this workshop + $paths[] = new restore_path_element('workshop_aggregation', '/activity/workshop/aggregations/aggregation'); + + // Return the paths wrapped into standard activity structure + return $this->prepare_activity_structure($paths); + } + + protected function process_workshop($data) { + global $DB; + + $data = (object)$data; + $oldid = $data->id; + $data->course = $this->get_courseid(); + + $data->timemodified = $this->apply_date_offset($data->timemodified); + $data->submissionstart = $this->apply_date_offset($data->submissionstart); + $data->submissionend = $this->apply_date_offset($data->submissionend); + $data->assessmentstart = $this->apply_date_offset($data->assessmentstart); + $data->assessmentend = $this->apply_date_offset($data->assessmentend); + + // insert the workshop record + $newitemid = $DB->insert_record('workshop', $data); + // inmediately after inserting "activity" record, call this + $this->apply_activity_instance($newitemid); + } + + protected function process_workshop_examplesubmission($data) { + global $DB; + + $data = (object)$data; + $oldid = $data->id; + + $data->workshopid = $this->get_new_parentid('workshop'); + $data->example = 1; + $data->authorid = $this->task->get_userid(); + $data->timecreated = $this->apply_date_offset($data->timecreated); + $data->timemodified = $this->apply_date_offset($data->timemodified); + + $newitemid = $DB->insert_record('workshop_submissions', $data); + $this->set_mapping('workshop_examplesubmission', $oldid, $newitemid, true); // Mapping with files + } + + protected function process_workshop_referenceassessment($data) { + global $DB; + + $data = (object)$data; + $oldid = $data->id; + + $data->submissionid = $this->get_new_parentid('workshop_examplesubmission'); + $data->reviewerid = $this->task->get_userid(); + $data->timecreated = $this->apply_date_offset($data->timecreated); + $data->timemodified = $this->apply_date_offset($data->timemodified); + + $newitemid = $DB->insert_record('workshop_assessments', $data); + $this->set_mapping('workshop_referenceassessment', $oldid, $newitemid); + } + + protected function process_workshop_exampleassessment($data) { + global $DB; + + $data = (object)$data; + $oldid = $data->id; + + $data->submissionid = $this->get_new_parentid('workshop_examplesubmission'); + $data->reviewerid = $this->get_mappingid('user', $data->reviewerid); + $data->timecreated = $this->apply_date_offset($data->timecreated); + $data->timemodified = $this->apply_date_offset($data->timemodified); + + $newitemid = $DB->insert_record('workshop_assessments', $data); + $this->set_mapping('workshop_exampleassessment', $oldid, $newitemid); + } + + protected function process_workshop_submission($data) { + global $DB; + + $data = (object)$data; + $oldid = $data->id; + + $data->workshopid = $this->get_new_parentid('workshop'); + $data->example = 0; + $data->authorid = $this->get_mappingid('user', $data->authorid); + $data->timecreated = $this->apply_date_offset($data->timecreated); + $data->timemodified = $this->apply_date_offset($data->timemodified); + + $newitemid = $DB->insert_record('workshop_submissions', $data); + $this->set_mapping('workshop_submission', $oldid, $newitemid, true); // Mapping with files + } + + protected function process_workshop_assessment($data) { + global $DB; + + $data = (object)$data; + $oldid = $data->id; + + $data->submissionid = $this->get_new_parentid('workshop_submission'); + $data->reviewerid = $this->get_mappingid('user', $data->reviewerid); + $data->timecreated = $this->apply_date_offset($data->timecreated); + $data->timemodified = $this->apply_date_offset($data->timemodified); + + $newitemid = $DB->insert_record('workshop_assessments', $data); + $this->set_mapping('workshop_assessment', $oldid, $newitemid); + } + + protected function process_workshop_aggregation($data) { + global $DB; + + $data = (object)$data; + $oldid = $data->id; + + $data->workshopid = $this->get_new_parentid('workshop'); + $data->userid = $this->get_mappingid('user', $data->userid); + $data->timegraded = $this->apply_date_offset($data->timegraded); + + $newitemid = $DB->insert_record('workshop_aggregations', $data); + } + + protected function after_execute() { + // Add workshop related files, no need to match by itemname (just internally handled context) + $this->add_related_files('mod_workshop', 'intro', null); + $this->add_related_files('mod_workshop', 'instructauthors', null); + $this->add_related_files('mod_workshop', 'instructreviewers', null); + + // Add example submission related files, matching by 'workshop_examplesubmission' itemname + $this->add_related_files('mod_workshop', 'submission_content', 'workshop_examplesubmission'); + $this->add_related_files('mod_workshop', 'submission_attachment', 'workshop_examplesubmission'); + + // Add submission related files, matching by 'workshop_submission' itemname + $this->add_related_files('mod_workshop', 'submission_content', 'workshop_submission'); + $this->add_related_files('mod_workshop', 'submission_attachment', 'workshop_submission'); + } +}