From d53e3298c08fd37d0e0bd8e1bc6777b09471189e Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Wed, 9 Nov 2011 10:55:16 +0100 Subject: [PATCH 1/3] MDL-27233 add new options to keep enrols and groups purging existing course in restore --- backup/moodle2/restore_course_task.class.php | 20 ++++++++++++++++++++ backup/util/dbops/restore_dbops.class.php | 5 +++-- backup/util/ui/restore_ui.class.php | 5 ++++- lang/en/backup.php | 2 ++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/backup/moodle2/restore_course_task.class.php b/backup/moodle2/restore_course_task.class.php index fb441f85454..234dedf3727 100644 --- a/backup/moodle2/restore_course_task.class.php +++ b/backup/moodle2/restore_course_task.class.php @@ -133,6 +133,26 @@ class restore_course_task extends restore_task { $startdate->set_ui(new backup_setting_ui_dateselector($startdate, get_string('setting_course_startdate', 'backup'))); $this->add_setting($startdate); + $purge_enrols = new restore_course_generic_setting('keep_roles_and_enrolments', base_setting::IS_BOOLEAN, false); + $purge_enrols->set_ui(new backup_setting_ui_select($purge_enrols, $purge_enrols->get_name(), array(1=>get_string('yes'), 0=>get_string('no')))); + $purge_enrols->get_ui()->set_label(get_string('setting_keep_roles_and_enrolments', 'backup')); + if ($this->get_target() != backup::TARGET_CURRENT_DELETING and $this->get_target() != backup::TARGET_EXISTING_DELETING) { + $purge_enrols->set_value(false); + $purge_enrols->set_status(backup_setting::LOCKED_BY_CONFIG); + $purge_enrols->set_visibility(backup_setting::HIDDEN); + } + $this->add_setting($purge_enrols); + + $purge_groups = new restore_course_generic_setting('keep_groups_and_groupings', base_setting::IS_BOOLEAN, false); + $purge_groups->set_ui(new backup_setting_ui_select($purge_groups, $purge_groups->get_name(), array(1=>get_string('yes'), 0=>get_string('no')))); + $purge_groups->get_ui()->set_label(get_string('setting_keep_groups_and_groupings', 'backup')); + if ($this->get_target() != backup::TARGET_CURRENT_DELETING and $this->get_target() != backup::TARGET_EXISTING_DELETING) { + $purge_groups->set_value(false); + $purge_groups->set_status(backup_setting::LOCKED_BY_CONFIG); + $purge_groups->set_visibility(backup_setting::HIDDEN); + } + $this->add_setting($purge_groups); + // Define overwrite_conf to decide if course configuration will be restored over existing one $overwrite = new restore_course_overwrite_conf_setting('overwrite_conf', base_setting::IS_BOOLEAN, false); $overwrite->set_ui(new backup_setting_ui_select($overwrite, $overwrite->get_name(), array(1=>get_string('yes'), 0=>get_string('no')))); diff --git a/backup/util/dbops/restore_dbops.class.php b/backup/util/dbops/restore_dbops.class.php index f03647056e6..d5d89098a71 100644 --- a/backup/util/dbops/restore_dbops.class.php +++ b/backup/util/dbops/restore_dbops.class.php @@ -1354,10 +1354,11 @@ abstract class restore_dbops { /** * Deletes all of the content associated with the given course (courseid) * @param int $courseid + * @param array $options * @return bool True for success */ - public static function delete_course_content($courseid) { - return remove_course_contents($courseid, false); + public static function delete_course_content($courseid, array $options = null) { + return remove_course_contents($courseid, false, $options); } } diff --git a/backup/util/ui/restore_ui.class.php b/backup/util/ui/restore_ui.class.php index b9325083c48..c497de75052 100644 --- a/backup/util/ui/restore_ui.class.php +++ b/backup/util/ui/restore_ui.class.php @@ -139,7 +139,10 @@ class restore_ui extends base_ui { throw new restore_ui_exception('restoreuifinalisedbeforeexecute'); } if ($this->controller->get_target() == backup::TARGET_CURRENT_DELETING || $this->controller->get_target() == backup::TARGET_EXISTING_DELETING) { - restore_dbops::delete_course_content($this->controller->get_courseid()); + $options = array(); + $options['keep_roles_and_enrolments'] = $this->get_setting_value('keep_roles_and_enrolments'); + $options['keep_groups_and_groupings'] = $this->get_setting_value('keep_groups_and_groupings'); + restore_dbops::delete_course_content($this->controller->get_courseid(), $options); } $this->controller->execute_plan(); $this->progress = self::PROGRESS_EXECUTED; diff --git a/lang/en/backup.php b/lang/en/backup.php index aeb54b3f671..0b9bc616822 100644 --- a/lang/en/backup.php +++ b/lang/en/backup.php @@ -220,5 +220,7 @@ $string['setting_overwriteconf'] = 'Overwrite course configuration'; $string['setting_course_fullname'] = 'Course name'; $string['setting_course_shortname'] = 'Course short name'; $string['setting_course_startdate'] = 'Course startdate'; +$string['setting_keep_roles_and_enrolments'] = 'Keep current roles and enrolments'; +$string['setting_keep_groups_and_groupings'] = 'Keep current groups and groupings'; $string['totalcategorysearchresults'] = 'Total categories: {$a}'; $string['totalcoursesearchresults'] = 'Total courses: {$a}'; From 73d000f38995735735e71f92974348530a8fb78d Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Fri, 11 Nov 2011 16:08:44 +0100 Subject: [PATCH 2/3] MDL-27233 allow adding of default role to restorers --- admin/settings/users.php | 6 +++ backup/moodle2/restore_course_task.class.php | 3 ++ backup/moodle2/restore_stepslib.php | 51 ++++++++++++++++++++ lang/en/admin.php | 2 + 4 files changed, 62 insertions(+) diff --git a/admin/settings/users.php b/admin/settings/users.php index 02d49b00abd..256da1742b5 100644 --- a/admin/settings/users.php +++ b/admin/settings/users.php @@ -89,6 +89,9 @@ if ($hassiteconfig $defaultuserid = 0; } + $restorersnewrole = $creatornewroles; + $restorersnewrole[0] = get_string('none'); + $temp->add(new admin_setting_configselect('notloggedinroleid', get_string('notloggedinroleid', 'admin'), get_string('confignotloggedinroleid', 'admin'), $defaultguestid, ($guestroles + $otherroles))); $temp->add(new admin_setting_configselect('guestroleid', get_string('guestroleid', 'admin'), @@ -97,12 +100,15 @@ if ($hassiteconfig get_string('configdefaultuserroleid', 'admin'), $defaultuserid, ($userroles + $otherroles))); $temp->add(new admin_setting_configselect('creatornewroleid', get_string('creatornewroleid', 'admin'), get_string('creatornewroleid_help', 'admin'), $defaultteacherid, $creatornewroles)); + $temp->add(new admin_setting_configselect('restorernewroleid', get_string('restorernewroleid', 'admin'), + get_string('restorernewroleid_help', 'admin'), $defaultteacherid, $restorersnewrole)); // release memory unset($otherroles); unset($guestroles); unset($userroles); unset($creatornewroles); + unset($restorersnewrole); } $temp->add(new admin_setting_configcheckbox('autologinguests', get_string('autologinguests', 'admin'), get_string('configautologinguests', 'admin'), 0)); diff --git a/backup/moodle2/restore_course_task.class.php b/backup/moodle2/restore_course_task.class.php index 234dedf3727..046791f4f7e 100644 --- a/backup/moodle2/restore_course_task.class.php +++ b/backup/moodle2/restore_course_task.class.php @@ -74,6 +74,9 @@ class restore_course_task extends restore_task { $this->add_step(new restore_enrolments_structure_step('course_enrolments', 'enrolments.xml')); } + // Now make sure the user that is running the restore can actually access the course + $this->add_step(new restore_fix_restorer_access_step('fix_restorer_access')); + // Restore course filters (conditionally) if ($this->get_setting_value('filters')) { $this->add_step(new restore_filters_structure_step('course_filters', 'filters.xml')); diff --git a/backup/moodle2/restore_stepslib.php b/backup/moodle2/restore_stepslib.php index 6486489b96c..6df57c433f3 100644 --- a/backup/moodle2/restore_stepslib.php +++ b/backup/moodle2/restore_stepslib.php @@ -1434,6 +1434,57 @@ class restore_enrolments_structure_step extends restore_structure_step { } +/** + * Make sure the user restoring the course can actually access it. + */ +class restore_fix_restorer_access_step extends restore_execution_step { + protected function define_execution() { + global $CFG, $DB; + + if (!$userid = $this->task->get_userid()) { + return; + } + + if (empty($CFG->restorernewroleid)) { + // Bad luck, no fallback role for restorers specified + return; + } + + $courseid = $this->get_courseid(); + $context = context_course::instance($courseid); + + if (is_enrolled($context, $userid, 'moodle/course:update', true) or is_viewing($context, $userid, 'moodle/course:update')) { + // Current user may access the course (admin, category manager or restored teacher enrolment usually) + return; + } + + // Try to add role only - we do not need enrolment if user has moodle/course:view or is already enrolled + role_assign($CFG->restorernewroleid, $userid, $context); + + if (is_enrolled($context, $userid, 'moodle/course:update', true) or is_viewing($context, $userid, 'moodle/course:update')) { + // Extra role is enough, yay! + return; + } + + // The last chance is to create manual enrol if it does not exist and and try to enrol the current user, + // hopefully admin selected suitable $CFG->restorernewroleid ... + if (!enrol_is_enabled('manual')) { + return; + } + if (!$enrol = enrol_get_plugin('manual')) { + return; + } + if (!$DB->record_exists('enrol', array('enrol'=>'manual', 'courseid'=>$courseid))) { + $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST); + $fields = array('status'=>ENROL_INSTANCE_ENABLED, 'enrolperiod'=>$enrol->get_config('enrolperiod', 0), 'roleid'=>$enrol->get_config('roleid', 0)); + $enrol->add_instance($course, $fields); + } + + enrol_try_internal_enrol($courseid, $userid); + } +} + + /** * This structure steps restores the filters and their configs */ diff --git a/lang/en/admin.php b/lang/en/admin.php index f554e6b0cf4..93d217ad0c8 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -842,6 +842,8 @@ $string['requires'] = 'Requires'; $string['purgecaches']= 'Purge all caches'; $string['purgecachesconfirm']= 'Moodle can cache themes, javascript, language strings, filtered text, rss feeds and many other pieces of calculated data. Purging these caches will delete that data from the server and force browsers to refetch data, so that you can be sure you are seeing the most up-to-date values produced by the current code. There is no danger in purging caches, but your site may appear slower for a while until the server and clients calculate new information and cache it.'; $string['purgecachesfinished']= 'All caches were purged.'; +$string['restorernewroleid'] = 'Restorers\' role in courses'; +$string['restorernewroleid_help'] = 'If the user does not already have the permission to manage the newly restored course, the user is automatically assigned this role and enrolled if necessary. Select "None" if you do not want restorers to be able to manage every restored course.'; $string['restrictbydefault'] = 'Restrict modules by default'; $string['restrictmodulesfor'] = 'Restrict modules for'; $string['reverseproxy'] = 'Reverse proxy'; From 1f238ad4df619443d5c2f3f77f07ff1dc2c47403 Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Thu, 24 Nov 2011 10:40:38 +0100 Subject: [PATCH 3/3] MDL-27233 fix variable names Thanks Eloy! --- backup/moodle2/restore_course_task.class.php | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/backup/moodle2/restore_course_task.class.php b/backup/moodle2/restore_course_task.class.php index 046791f4f7e..ceb09953b32 100644 --- a/backup/moodle2/restore_course_task.class.php +++ b/backup/moodle2/restore_course_task.class.php @@ -136,25 +136,25 @@ class restore_course_task extends restore_task { $startdate->set_ui(new backup_setting_ui_dateselector($startdate, get_string('setting_course_startdate', 'backup'))); $this->add_setting($startdate); - $purge_enrols = new restore_course_generic_setting('keep_roles_and_enrolments', base_setting::IS_BOOLEAN, false); - $purge_enrols->set_ui(new backup_setting_ui_select($purge_enrols, $purge_enrols->get_name(), array(1=>get_string('yes'), 0=>get_string('no')))); - $purge_enrols->get_ui()->set_label(get_string('setting_keep_roles_and_enrolments', 'backup')); + $keep_enrols = new restore_course_generic_setting('keep_roles_and_enrolments', base_setting::IS_BOOLEAN, false); + $keep_enrols->set_ui(new backup_setting_ui_select($keep_enrols, $keep_enrols->get_name(), array(1=>get_string('yes'), 0=>get_string('no')))); + $keep_enrols->get_ui()->set_label(get_string('setting_keep_roles_and_enrolments', 'backup')); if ($this->get_target() != backup::TARGET_CURRENT_DELETING and $this->get_target() != backup::TARGET_EXISTING_DELETING) { - $purge_enrols->set_value(false); - $purge_enrols->set_status(backup_setting::LOCKED_BY_CONFIG); - $purge_enrols->set_visibility(backup_setting::HIDDEN); + $keep_enrols->set_value(false); + $keep_enrols->set_status(backup_setting::LOCKED_BY_CONFIG); + $keep_enrols->set_visibility(backup_setting::HIDDEN); } - $this->add_setting($purge_enrols); + $this->add_setting($keep_enrols); - $purge_groups = new restore_course_generic_setting('keep_groups_and_groupings', base_setting::IS_BOOLEAN, false); - $purge_groups->set_ui(new backup_setting_ui_select($purge_groups, $purge_groups->get_name(), array(1=>get_string('yes'), 0=>get_string('no')))); - $purge_groups->get_ui()->set_label(get_string('setting_keep_groups_and_groupings', 'backup')); + $keep_groups = new restore_course_generic_setting('keep_groups_and_groupings', base_setting::IS_BOOLEAN, false); + $keep_groups->set_ui(new backup_setting_ui_select($keep_groups, $keep_groups->get_name(), array(1=>get_string('yes'), 0=>get_string('no')))); + $keep_groups->get_ui()->set_label(get_string('setting_keep_groups_and_groupings', 'backup')); if ($this->get_target() != backup::TARGET_CURRENT_DELETING and $this->get_target() != backup::TARGET_EXISTING_DELETING) { - $purge_groups->set_value(false); - $purge_groups->set_status(backup_setting::LOCKED_BY_CONFIG); - $purge_groups->set_visibility(backup_setting::HIDDEN); + $keep_groups->set_value(false); + $keep_groups->set_status(backup_setting::LOCKED_BY_CONFIG); + $keep_groups->set_visibility(backup_setting::HIDDEN); } - $this->add_setting($purge_groups); + $this->add_setting($keep_groups); // Define overwrite_conf to decide if course configuration will be restored over existing one $overwrite = new restore_course_overwrite_conf_setting('overwrite_conf', base_setting::IS_BOOLEAN, false);