| 1 | efrain | 1 | <?php
 | 
        
           |  |  | 2 |   | 
        
           |  |  | 3 | // This file is part of Moodle - http://moodle.org/
 | 
        
           |  |  | 4 | //
 | 
        
           |  |  | 5 | // Moodle is free software: you can redistribute it and/or modify
 | 
        
           |  |  | 6 | // it under the terms of the GNU General Public License as published by
 | 
        
           |  |  | 7 | // the Free Software Foundation, either version 3 of the License, or
 | 
        
           |  |  | 8 | // (at your option) any later version.
 | 
        
           |  |  | 9 | //
 | 
        
           |  |  | 10 | // Moodle is distributed in the hope that it will be useful,
 | 
        
           |  |  | 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
        
           |  |  | 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
        
           |  |  | 13 | // GNU General Public License for more details.
 | 
        
           |  |  | 14 | //
 | 
        
           |  |  | 15 | // You should have received a copy of the GNU General Public License
 | 
        
           |  |  | 16 | // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 | 
        
           |  |  | 17 |   | 
        
           |  |  | 18 | /**
 | 
        
           |  |  | 19 |  * Defines restore_course_task class
 | 
        
           |  |  | 20 |  *
 | 
        
           |  |  | 21 |  * @package     core_backup
 | 
        
           |  |  | 22 |  * @subpackage  moodle2
 | 
        
           |  |  | 23 |  * @category    backup
 | 
        
           |  |  | 24 |  * @copyright   2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
 | 
        
           |  |  | 25 |  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 | 
        
           |  |  | 26 |  */
 | 
        
           |  |  | 27 |   | 
        
           |  |  | 28 | defined('MOODLE_INTERNAL') || die();
 | 
        
           |  |  | 29 |   | 
        
           |  |  | 30 | /**
 | 
        
           |  |  | 31 |  * course task that provides all the properties and common steps to be performed
 | 
        
           |  |  | 32 |  * when one course is being restored
 | 
        
           |  |  | 33 |  *
 | 
        
           |  |  | 34 |  * TODO: Finish phpdocs
 | 
        
           |  |  | 35 |  */
 | 
        
           |  |  | 36 | class restore_course_task extends restore_task {
 | 
        
           |  |  | 37 |   | 
        
           |  |  | 38 |     protected $info; // info related to course gathered from backup file
 | 
        
           |  |  | 39 |     protected $contextid; // course context id
 | 
        
           |  |  | 40 |   | 
        
           |  |  | 41 |     /**
 | 
        
           |  |  | 42 |      * Constructor - instantiates one object of this class
 | 
        
           |  |  | 43 |      */
 | 
        
           |  |  | 44 |     public function __construct($name, $info, $plan = null) {
 | 
        
           |  |  | 45 |         $this->info = $info;
 | 
        
           |  |  | 46 |         parent::__construct($name, $plan);
 | 
        
           |  |  | 47 |     }
 | 
        
           |  |  | 48 |   | 
        
           |  |  | 49 |     /**
 | 
        
           |  |  | 50 |      * Course tasks have their own directory to read files
 | 
        
           |  |  | 51 |      */
 | 
        
           |  |  | 52 |     public function get_taskbasepath() {
 | 
        
           |  |  | 53 |   | 
        
           |  |  | 54 |         return $this->get_basepath() . '/course';
 | 
        
           |  |  | 55 |     }
 | 
        
           |  |  | 56 |   | 
        
           |  |  | 57 |     public function get_contextid() {
 | 
        
           |  |  | 58 |         return $this->contextid;
 | 
        
           |  |  | 59 |     }
 | 
        
           |  |  | 60 |   | 
        
           |  |  | 61 |     /**
 | 
        
           |  |  | 62 |      * Create all the steps that will be part of this task
 | 
        
           |  |  | 63 |      */
 | 
        
           |  |  | 64 |     public function build() {
 | 
        
           |  |  | 65 |   | 
        
           |  |  | 66 |         // Define the task contextid (the course one)
 | 
        
           |  |  | 67 |         $this->contextid = context_course::instance($this->get_courseid())->id;
 | 
        
           |  |  | 68 |   | 
        
           |  |  | 69 |         // Executed conditionally if restoring to new course or if overwrite_conf setting is enabled
 | 
        
           |  |  | 70 |         if ($this->get_target() == backup::TARGET_NEW_COURSE || $this->get_setting_value('overwrite_conf') == true) {
 | 
        
           |  |  | 71 |             $this->add_step(new restore_course_structure_step('course_info', 'course.xml'));
 | 
        
           |  |  | 72 |   | 
        
           |  |  | 73 |             // Search reindexing (if enabled).
 | 
        
           |  |  | 74 |             if (\core_search\manager::is_indexing_enabled()) {
 | 
        
           |  |  | 75 |                 $this->add_step(new restore_course_search_index('course_search_index'));
 | 
        
           |  |  | 76 |             }
 | 
        
           |  |  | 77 |         }
 | 
        
           |  |  | 78 |   | 
        
           |  |  | 79 |         if ($this->get_setting_value('legacyfiles')) {
 | 
        
           |  |  | 80 |             $this->add_step(new restore_course_legacy_files_step('legacy_files'));
 | 
        
           |  |  | 81 |         }
 | 
        
           |  |  | 82 |   | 
        
           |  |  | 83 |         // Deal with enrolment methods and user enrolments.
 | 
        
           |  |  | 84 |         if ($this->plan->get_mode() == backup::MODE_IMPORT) {
 | 
        
           |  |  | 85 |             // No need to do anything with enrolments.
 | 
        
           |  |  | 86 |   | 
        
           |  |  | 87 |         } else if (!$this->get_setting_value('users') or $this->plan->get_mode() == backup::MODE_HUB) {
 | 
        
           |  |  | 88 |             if ($this->get_setting_value('enrolments') == backup::ENROL_ALWAYS && $this->plan->get_mode() != backup::MODE_HUB) {
 | 
        
           |  |  | 89 |                 // Restore enrolment methods.
 | 
        
           |  |  | 90 |                 $this->add_step(new restore_enrolments_structure_step('course_enrolments', 'enrolments.xml'));
 | 
        
           |  |  | 91 |             } else if ($this->get_target() == backup::TARGET_CURRENT_ADDING or $this->get_target() == backup::TARGET_EXISTING_ADDING) {
 | 
        
           |  |  | 92 |                 // Keep current enrolments unchanged.
 | 
        
           |  |  | 93 |             } else {
 | 
        
           |  |  | 94 |                 // If no instances yet add default enrol methods the same way as when creating new course in UI.
 | 
        
           |  |  | 95 |                 $this->add_step(new restore_default_enrolments_step('default_enrolments'));
 | 
        
           |  |  | 96 |             }
 | 
        
           |  |  | 97 |   | 
        
           |  |  | 98 |         } else {
 | 
        
           |  |  | 99 |             // Restore course enrolment data.
 | 
        
           |  |  | 100 |             $this->add_step(new restore_enrolments_structure_step('course_enrolments', 'enrolments.xml'));
 | 
        
           |  |  | 101 |         }
 | 
        
           |  |  | 102 |   | 
        
           |  |  | 103 |         // Populate groups, this must be done after enrolments because only enrolled users may be in groups.
 | 
        
           |  |  | 104 |         $this->add_step(new restore_groups_members_structure_step('create_groups_members', '../groups.xml'));
 | 
        
           |  |  | 105 |   | 
        
           |  |  | 106 |         // Restore course role assignments and overrides (internally will observe the role_assignments setting),
 | 
        
           |  |  | 107 |         // this must be done after all users are enrolled.
 | 
        
           |  |  | 108 |         $this->add_step(new restore_ras_and_caps_structure_step('course_ras_and_caps', 'roles.xml'));
 | 
        
           |  |  | 109 |   | 
        
           |  |  | 110 |         // Restore course filters (conditionally)
 | 
        
           |  |  | 111 |         if ($this->get_setting_value('filters')) {
 | 
        
           |  |  | 112 |             $this->add_step(new restore_filters_structure_step('course_filters', 'filters.xml'));
 | 
        
           |  |  | 113 |         }
 | 
        
           |  |  | 114 |   | 
        
           |  |  | 115 |         // Restore course comments (conditionally)
 | 
        
           |  |  | 116 |         if ($this->get_setting_value('comments')) {
 | 
        
           |  |  | 117 |             $this->add_step(new restore_comments_structure_step('course_comments', 'comments.xml'));
 | 
        
           |  |  | 118 |         }
 | 
        
           |  |  | 119 |   | 
        
           |  |  | 120 |         // Calendar events (conditionally)
 | 
        
           |  |  | 121 |         if ($this->get_setting_value('calendarevents')) {
 | 
        
           |  |  | 122 |             $this->add_step(new restore_calendarevents_structure_step('course_calendar', 'calendar.xml'));
 | 
        
           |  |  | 123 |         }
 | 
        
           |  |  | 124 |   | 
        
           |  |  | 125 |         // Course competencies.
 | 
        
           |  |  | 126 |         $this->add_step(new restore_course_competencies_structure_step('course_competencies', 'competencies.xml'));
 | 
        
           |  |  | 127 |   | 
        
           |  |  | 128 |         // Activity completion defaults.
 | 
        
           |  |  | 129 |         $this->add_step(new restore_completion_defaults_structure_step('course_completion_defaults', 'completiondefaults.xml'));
 | 
        
           |  |  | 130 |   | 
        
           |  |  | 131 |         // Content bank content (conditionally).
 | 
        
           |  |  | 132 |         if ($this->get_setting_value('contentbankcontent')) {
 | 
        
           |  |  | 133 |             $this->add_step(new restore_contentbankcontent_structure_step('course_contentbank', 'contentbank.xml'));
 | 
        
           |  |  | 134 |         }
 | 
        
           |  |  | 135 |   | 
        
           |  |  | 136 |         // At the end, mark it as built
 | 
        
           |  |  | 137 |         $this->built = true;
 | 
        
           |  |  | 138 |     }
 | 
        
           |  |  | 139 |   | 
        
           |  |  | 140 |     /**
 | 
        
           |  |  | 141 |      * Define the contents in the course that must be
 | 
        
           |  |  | 142 |      * processed by the link decoder
 | 
        
           |  |  | 143 |      */
 | 
        
           |  |  | 144 |     public static function define_decode_contents() {
 | 
        
           |  |  | 145 |         $contents = array();
 | 
        
           |  |  | 146 |   | 
        
           |  |  | 147 |         $contents[] = new restore_decode_content('course', 'summary');
 | 
        
           |  |  | 148 |         $contents[] = new restore_decode_content('event', 'description');
 | 
        
           |  |  | 149 |   | 
        
           |  |  | 150 |         return $contents;
 | 
        
           |  |  | 151 |     }
 | 
        
           |  |  | 152 |   | 
        
           |  |  | 153 |     /**
 | 
        
           |  |  | 154 |      * Define the decoding rules for links belonging
 | 
        
           |  |  | 155 |      * to the course to be executed by the link decoder
 | 
        
           |  |  | 156 |      */
 | 
        
           |  |  | 157 |     public static function define_decode_rules() {
 | 
        
           |  |  | 158 |         $rules = array();
 | 
        
           |  |  | 159 |   | 
        
           |  |  | 160 |         // Link to the course main page (it also covers "&topic=xx" and "&week=xx"
 | 
        
           |  |  | 161 |         // because they don't become transformed (section number) in backup/restore.
 | 
        
           |  |  | 162 |         $rules[] = new restore_decode_rule('COURSEVIEWBYID',       '/course/view.php?id=$1',        'course');
 | 
        
           |  |  | 163 |   | 
        
           |  |  | 164 |         // A few other key course links.
 | 
        
           |  |  | 165 |         $rules[] = new restore_decode_rule('GRADEINDEXBYID',       '/grade/index.php?id=$1',        'course');
 | 
        
           |  |  | 166 |         $rules[] = new restore_decode_rule('GRADEREPORTINDEXBYID', '/grade/report/index.php?id=$1', 'course');
 | 
        
           |  |  | 167 |         $rules[] = new restore_decode_rule('BADGESVIEWBYID',       '/badges/view.php?type=2&id=$1', 'course');
 | 
        
           |  |  | 168 |         $rules[] = new restore_decode_rule('USERINDEXVIEWBYID',    '/user/index.php?id=$1',         'course');
 | 
        
           |  |  | 169 |         $rules[] = new restore_decode_rule('PLUGINFILEBYCONTEXT',  '/pluginfile.php/$1',            'context');
 | 
        
           |  |  | 170 |         $rules[] = new restore_decode_rule('PLUGINFILEBYCONTEXTURLENCODED', '/pluginfile.php/$1', 'context', true);
 | 
        
           |  |  | 171 |   | 
        
           |  |  | 172 |         return $rules;
 | 
        
           |  |  | 173 |     }
 | 
        
           |  |  | 174 |   | 
        
           |  |  | 175 | // Protected API starts here
 | 
        
           |  |  | 176 |   | 
        
           |  |  | 177 |     /**
 | 
        
           |  |  | 178 |      * Define the common setting that any restore course will have
 | 
        
           |  |  | 179 |      */
 | 
        
           |  |  | 180 |     protected function define_settings() {
 | 
        
           |  |  | 181 |   | 
        
           |  |  | 182 |         // Define overwrite_conf to decide if course configuration will be restored over existing one.
 | 
        
           |  |  | 183 |         $overwrite = new restore_course_overwrite_conf_setting('overwrite_conf', base_setting::IS_BOOLEAN, false);
 | 
        
           |  |  | 184 |         $overwrite->set_ui(new backup_setting_ui_select($overwrite, $overwrite->get_name(),
 | 
        
           |  |  | 185 |             array(1 => get_string('yes'), 0 => get_string('no'))));
 | 
        
           |  |  | 186 |         $overwrite->get_ui()->set_label(get_string('setting_overwrite_conf', 'backup'));
 | 
        
           |  |  | 187 |         if ($this->get_target() == backup::TARGET_NEW_COURSE) {
 | 
        
           |  |  | 188 |             $overwrite->set_value(true);
 | 
        
           |  |  | 189 |             $overwrite->set_status(backup_setting::LOCKED_BY_CONFIG);
 | 
        
           |  |  | 190 |             $overwrite->set_visibility(backup_setting::HIDDEN);
 | 
        
           |  |  | 191 |             $course = (object)['fullname' => null, 'shortname' => null, 'startdate' => null];
 | 
        
           |  |  | 192 |         } else {
 | 
        
           |  |  | 193 |             $course = get_course($this->get_courseid());
 | 
        
           |  |  | 194 |         }
 | 
        
           |  |  | 195 |         $this->add_setting($overwrite);
 | 
        
           |  |  | 196 |   | 
        
           |  |  | 197 |         $fullnamedefaultvalue = $this->get_info()->original_course_fullname;
 | 
        
           |  |  | 198 |         $fullname = new restore_course_defaultcustom_setting('course_fullname', base_setting::IS_TEXT, $fullnamedefaultvalue);
 | 
        
           |  |  | 199 |         $fullname->set_ui(new backup_setting_ui_defaultcustom($fullname, get_string('setting_course_fullname', 'backup'),
 | 
        
           |  |  | 200 |             ['customvalue' => $fullnamedefaultvalue, 'defaultvalue' => $course->fullname]));
 | 
        
           |  |  | 201 |         $this->add_setting($fullname);
 | 
        
           |  |  | 202 |   | 
        
           |  |  | 203 |         $shortnamedefaultvalue = $this->get_info()->original_course_shortname;
 | 
        
           |  |  | 204 |         $shortname = new restore_course_defaultcustom_setting('course_shortname', base_setting::IS_TEXT, $shortnamedefaultvalue);
 | 
        
           |  |  | 205 |         $shortname->set_ui(new backup_setting_ui_defaultcustom($shortname, get_string('setting_course_shortname', 'backup'),
 | 
        
           |  |  | 206 |             ['customvalue' => $shortnamedefaultvalue, 'defaultvalue' => $course->shortname]));
 | 
        
           |  |  | 207 |         $this->add_setting($shortname);
 | 
        
           |  |  | 208 |   | 
        
           |  |  | 209 |         $startdatedefaultvalue = $this->get_info()->original_course_startdate;
 | 
        
           |  |  | 210 |         $startdate = new restore_course_defaultcustom_setting('course_startdate', base_setting::IS_INTEGER, $startdatedefaultvalue);
 | 
        
           |  |  | 211 |         $startdate->set_ui(new backup_setting_ui_defaultcustom($startdate, get_string('setting_course_startdate', 'backup'),
 | 
        
           |  |  | 212 |             ['customvalue' => $startdatedefaultvalue, 'defaultvalue' => $course->startdate, 'type' => 'date_time_selector']));
 | 
        
           |  |  | 213 |         $this->add_setting($startdate);
 | 
        
           |  |  | 214 |   | 
        
           |  |  | 215 |         $keep_enrols = new restore_course_generic_setting('keep_roles_and_enrolments', base_setting::IS_BOOLEAN, false);
 | 
        
           |  |  | 216 |         $keep_enrols->set_ui(new backup_setting_ui_select($keep_enrols, $keep_enrols->get_name(), array(1=>get_string('yes'), 0=>get_string('no'))));
 | 
        
           |  |  | 217 |         $keep_enrols->get_ui()->set_label(get_string('setting_keep_roles_and_enrolments', 'backup'));
 | 
        
           |  |  | 218 |         if ($this->get_target() != backup::TARGET_CURRENT_DELETING and $this->get_target() != backup::TARGET_EXISTING_DELETING) {
 | 
        
           |  |  | 219 |             $keep_enrols->set_value(false);
 | 
        
           |  |  | 220 |             $keep_enrols->set_status(backup_setting::LOCKED_BY_CONFIG);
 | 
        
           |  |  | 221 |             $keep_enrols->set_visibility(backup_setting::HIDDEN);
 | 
        
           |  |  | 222 |         }
 | 
        
           |  |  | 223 |         $this->add_setting($keep_enrols);
 | 
        
           |  |  | 224 |   | 
        
           |  |  | 225 |         $keep_groups = new restore_course_generic_setting('keep_groups_and_groupings', base_setting::IS_BOOLEAN, false);
 | 
        
           |  |  | 226 |         $keep_groups->set_ui(new backup_setting_ui_select($keep_groups, $keep_groups->get_name(), array(1=>get_string('yes'), 0=>get_string('no'))));
 | 
        
           |  |  | 227 |         $keep_groups->get_ui()->set_label(get_string('setting_keep_groups_and_groupings', 'backup'));
 | 
        
           |  |  | 228 |         if ($this->get_target() != backup::TARGET_CURRENT_DELETING and $this->get_target() != backup::TARGET_EXISTING_DELETING) {
 | 
        
           |  |  | 229 |             $keep_groups->set_value(false);
 | 
        
           |  |  | 230 |             $keep_groups->set_status(backup_setting::LOCKED_BY_CONFIG);
 | 
        
           |  |  | 231 |             $keep_groups->set_visibility(backup_setting::HIDDEN);
 | 
        
           |  |  | 232 |         }
 | 
        
           |  |  | 233 |         $this->add_setting($keep_groups);
 | 
        
           |  |  | 234 |   | 
        
           |  |  | 235 |     }
 | 
        
           |  |  | 236 | }
 |