From 4b75f49a633350fb71b1f0abf85189cc1d0514cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20S=CC=8Ckoda?= Date: Wed, 5 Jun 2013 22:37:57 +0200 Subject: [PATCH] MDL-28394 fix enrolment method restore logic This patch fixes: * missing enrolment methods after 1.9 backup restore - defaults are added * enrolment methods are restored only when users option is enabled * manual enrolment override option is disabled if users not available --- backup/moodle2/restore_course_task.class.php | 16 ++++++++++++-- backup/moodle2/restore_root_task.class.php | 1 + backup/moodle2/restore_stepslib.php | 23 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/backup/moodle2/restore_course_task.class.php b/backup/moodle2/restore_course_task.class.php index 5f231e97d7f..74bfef42a2e 100644 --- a/backup/moodle2/restore_course_task.class.php +++ b/backup/moodle2/restore_course_task.class.php @@ -73,8 +73,20 @@ class restore_course_task extends restore_task { $this->add_step(new restore_course_legacy_files_step('legacy_files')); - // Restore course enrolments (plugins and membership). Conditionally prevented for any IMPORT/HUB operation - if ($this->plan->get_mode() != backup::MODE_IMPORT && $this->plan->get_mode() != backup::MODE_HUB) { + // Deal with enrolment methods and user enrolments. + if ($this->plan->get_mode() == backup::MODE_IMPORT) { + // No need to do anything with enrolments. + + } else if (!$this->get_setting_value('users') or $this->plan->get_mode() == backup::MODE_HUB) { + if ($this->get_target() == backup::TARGET_CURRENT_ADDING or $this->get_target() == backup::TARGET_EXISTING_ADDING) { + // Keep current enrolments unchanged. + } else { + // If no instances yet add default enrol methods the same way as when creating new course in UI. + $this->add_step(new restore_default_enrolments_step('default_enrolments')); + } + + } else { + // Restore course enrolment data. $this->add_step(new restore_enrolments_structure_step('course_enrolments', 'enrolments.xml')); } diff --git a/backup/moodle2/restore_root_task.class.php b/backup/moodle2/restore_root_task.class.php index f95a5b9971f..a0b90b8789f 100644 --- a/backup/moodle2/restore_root_task.class.php +++ b/backup/moodle2/restore_root_task.class.php @@ -115,6 +115,7 @@ class restore_root_task extends restore_task { $rootenrolmanual = new restore_users_setting('enrol_migratetomanual', base_setting::IS_BOOLEAN, false); $rootenrolmanual->set_ui(new backup_setting_ui_checkbox($rootenrolmanual, get_string('rootenrolmanual', 'backup'))); $rootenrolmanual->get_ui()->set_changeable(enrol_is_enabled('manual')); + $rootenrolmanual->get_ui()->set_changeable($changeable); $this->add_setting($rootenrolmanual); $users->add_dependency($rootenrolmanual); diff --git a/backup/moodle2/restore_stepslib.php b/backup/moodle2/restore_stepslib.php index 2efa487f2f7..8797ee53273 100644 --- a/backup/moodle2/restore_stepslib.php +++ b/backup/moodle2/restore_stepslib.php @@ -1625,6 +1625,29 @@ class restore_ras_and_caps_structure_step extends restore_structure_step { } } +/** + * If no instances yet add default enrol methods the same way as when creating new course in UI. + */ +class restore_default_enrolments_step extends restore_execution_step { + public function define_execution() { + global $DB; + + $course = $DB->get_record('course', array('id'=>$this->get_courseid()), '*', MUST_EXIST); + + if ($DB->record_exists('enrol', array('courseid'=>$this->get_courseid(), 'enrol'=>'manual'))) { + // Something already added instances, do not add default instances. + $plugins = enrol_get_plugins(true); + foreach ($plugins as $plugin) { + $plugin->restore_sync_course($course); + } + + } else { + // Looks like a newly created course. + enrol_course_updated(true, $course, null); + } + } +} + /** * This structure steps restores the enrol plugins and their underlying * enrolments, performing all the mappings and/or movements required