MDL-53700 competency: Migrating backup logic to core
[moodle.git] / backup / moodle2 / backup_course_task.class.php
1 <?php
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/>.
18 /**
19  * Defines backup_course_task
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  */
28 /**
29  * course task that provides all the properties and common steps to be performed
30  * when one course is being backup
31  *
32  * TODO: Finish phpdocs
33  */
34 class backup_course_task extends backup_task {
36     protected $courseid;
37     protected $contextid;
39     /**
40      * Constructor - instantiates one object of this class
41      */
42     public function __construct($name, $courseid, $plan = null) {
44         $this->courseid   = $courseid;
45         $this->contextid  = context_course::instance($this->courseid)->id;
47         parent::__construct($name, $plan);
48     }
50     public function get_contextid() {
51         return $this->contextid;
52     }
54     /**
55      * Course tasks have their own directory to write files
56      */
57     public function get_taskbasepath() {
59         return $this->get_basepath() . '/course';
60     }
62     /**
63      * Create all the steps that will be part of this task
64      */
65     public function build() {
67         // Add some extra settings that related processors are going to need
68         $this->add_setting(new backup_activity_generic_setting(backup::VAR_COURSEID, base_setting::IS_INTEGER, $this->get_courseid()));
69         $this->add_setting(new backup_activity_generic_setting(backup::VAR_CONTEXTID, base_setting::IS_INTEGER, $this->contextid));
71         // Create the course directory
72         $this->add_step(new create_taskbasepath_directory('create_course_directory'));
74         // Create the course.xml file with course & category information
75         // annotating some bits, tags and module restrictions
76         $this->add_step(new backup_course_structure_step('course_info', 'course.xml'));
78         // Generate the enrolment file (conditionally, prevent it in any IMPORT/HUB operation)
79         if ($this->plan->get_mode() != backup::MODE_IMPORT && $this->plan->get_mode() != backup::MODE_HUB) {
80             $this->add_step(new backup_enrolments_structure_step('course_enrolments', 'enrolments.xml'));
81         }
83         // Annotate enrolment custom fields.
84         $this->add_step(new backup_enrolments_execution_step('annotate_enrol_custom_fields'));
86         // Annotate all the groups and groupings belonging to the course. This can be optional.
87         if ($this->get_setting_value('groups')) {
88             $this->add_step(new backup_annotate_course_groups_and_groupings('annotate_course_groups'));
89         }
91         // Annotate the groups used in already annotated groupings (note this may be
92         // unnecessary now that we are annotating all the course groups and groupings in the
93         // step above). This is here to support course->defaultgroupingid.
94         // This may not be required to annotate if groups are not being backed up.
95         if ($this->get_setting_value('groups')) {
96             $this->add_step(new backup_annotate_groups_from_groupings('annotate_groups_from_groupings'));
97         }
99         // Annotate the question_categories belonging to the course context (conditionally).
100         if ($this->get_setting_value('questionbank')) {
101             $this->add_step(new backup_calculate_question_categories('course_question_categories'));
102         }
104         // Generate the roles file (optionally role assignments and always role overrides)
105         $this->add_step(new backup_roles_structure_step('course_roles', 'roles.xml'));
107         // Generate the filter file (conditionally)
108         if ($this->get_setting_value('filters')) {
109             $this->add_step(new backup_filters_structure_step('course_filters', 'filters.xml'));
110         }
112         // Generate the comments file (conditionally)
113         if ($this->get_setting_value('comments')) {
114             $this->add_step(new backup_comments_structure_step('course_comments', 'comments.xml'));
115         }
117         // Generate the calender events file (conditionally)
118         if ($this->get_setting_value('calendarevents')) {
119             $this->add_step(new backup_calendarevents_structure_step('course_calendar', 'calendar.xml'));
120         }
122         // Generate the logs file (conditionally)
123         if ($this->get_setting_value('logs')) {
124             // Legacy logs.
125             $this->add_step(new backup_course_logs_structure_step('course_logs', 'logs.xml'));
126             // New log stores.
127             $this->add_step(new backup_course_logstores_structure_step('course_logstores', 'logstores.xml'));
128         }
130         // Generate the course competencies.
131         $this->add_step(new backup_course_competencies_structure_step('course_competencies', 'competencies.xml'));
133         // Generate the inforef file (must be after ALL steps gathering annotations of ANY type)
134         $this->add_step(new backup_inforef_structure_step('course', 'inforef.xml'));
136         // Migrate the already exported inforef entries to final ones
137         $this->add_step(new move_inforef_annotations_to_final('migrate_inforef'));
139         // At the end, mark it as built
140         $this->built = true;
141     }
143     /**
144      * Code the transformations to perform in the course in
145      * order to get transportable (encoded) links
146      * @param string $content content in which to encode links.
147      * @return string content with links encoded.
148      */
149     static public function encode_content_links($content) {
151         // Link to the course main page (it also covers "&topic=xx" and "&week=xx"
152         // because they don't become transformed (section number) in backup/restore.
153         $content = self::encode_links_helper($content, 'COURSEVIEWBYID',       '/course/view.php?id=');
155         // A few other key course links.
156         $content = self::encode_links_helper($content, 'GRADEINDEXBYID',       '/grade/index.php?id=');
157         $content = self::encode_links_helper($content, 'GRADEREPORTINDEXBYID', '/grade/report/index.php?id=');
158         $content = self::encode_links_helper($content, 'BADGESVIEWBYID',       '/badges/view.php?type=2&id=');
159         $content = self::encode_links_helper($content, 'USERINDEXVIEWBYID',    '/user/index.php?id=');
161         return $content;
162     }
164     /**
165      * Helper method, used by encode_content_links.
166      * @param string $content content in which to encode links.
167      * @param unknown_type $name the name of this type of encoded link.
168      * @param unknown_type $path the path that identifies this type of link, up
169      *      to the ?paramname= bit.
170      * @return string content with one type of link encoded.
171      */
172     static private function encode_links_helper($content, $name, $path) {
173         global $CFG;
174         $base = preg_quote($CFG->wwwroot . $path, '/');
175         return preg_replace('/(' . $base . ')([0-9]+)/', '$@' . $name . '*$2@$', $content);
176     }
178 // Protected API starts here
180     /**
181      * Define the common setting that any backup section will have
182      */
183     protected function define_settings() {
185         // Nothing to add, sections doesn't have common settings (for now)
187     }