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 backup_final_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 |
* Final task that provides all the final steps necessary in order to finish one
|
|
|
32 |
* backup (mainly gathering references and creating the main xml) apart from
|
|
|
33 |
* some final cleaning
|
|
|
34 |
*
|
|
|
35 |
* TODO: Finish phpdocs
|
|
|
36 |
*/
|
|
|
37 |
class backup_final_task extends backup_task {
|
|
|
38 |
|
|
|
39 |
/**
|
|
|
40 |
* Create all the steps that will be part of this task
|
|
|
41 |
*/
|
|
|
42 |
public function build() {
|
|
|
43 |
global $CFG;
|
|
|
44 |
|
|
|
45 |
// Set the backup::VAR_CONTEXTID setting to course context as far as next steps require that
|
|
|
46 |
$coursectxid = context_course::instance($this->get_courseid())->id;
|
|
|
47 |
$this->add_setting(new backup_activity_generic_setting(backup::VAR_CONTEXTID, base_setting::IS_INTEGER, $coursectxid));
|
|
|
48 |
|
|
|
49 |
// Set the backup::VAR_COURSEID setting to course, we'll need that in some steps
|
|
|
50 |
$courseid = $this->get_courseid();
|
|
|
51 |
$this->add_setting(new backup_activity_generic_setting(backup::VAR_COURSEID, base_setting::IS_INTEGER, $courseid));
|
|
|
52 |
|
|
|
53 |
// Generate the groups file with the final annotated groups and groupings
|
|
|
54 |
// including membership based on setting
|
|
|
55 |
$this->add_step(new backup_groups_structure_step('groups', 'groups.xml'));
|
|
|
56 |
|
|
|
57 |
// Generate the questions file with the final annotated question_categories
|
|
|
58 |
$this->add_step(new backup_questions_structure_step('questions', 'questions.xml'));
|
|
|
59 |
|
|
|
60 |
// Annotate all the question files for the already annotated question
|
|
|
61 |
// categories (this is performed here and not in the structure step because
|
|
|
62 |
// it involves multiple contexts and as far as we are always backup-ing
|
|
|
63 |
// complete question banks we don't need to restrict at all and can be
|
|
|
64 |
// done in a single pass
|
|
|
65 |
$this->add_step(new backup_annotate_all_question_files('question_files'));
|
|
|
66 |
|
|
|
67 |
// Annotate all the user files (conditionally) (profile and icon files)
|
|
|
68 |
// Because each user has its own context, we need a separate/specialised step here
|
|
|
69 |
// This step also ensures that the contexts for all the users exist, so next
|
|
|
70 |
// step can be safely executed (join between users and contexts)
|
|
|
71 |
// Not executed if backup is without users of anonymized
|
|
|
72 |
if (($this->get_setting_value('users') || !empty($this->get_kept_roles())) && !$this->get_setting_value('anonymize')) {
|
|
|
73 |
$this->add_step(new backup_annotate_all_user_files('user_files'));
|
|
|
74 |
}
|
|
|
75 |
|
|
|
76 |
// Generate the users file (conditionally) with the final annotated users
|
|
|
77 |
// including custom profile fields, preferences, tags, role assignments and
|
|
|
78 |
// overrides
|
|
|
79 |
if ($this->get_setting_value('users') || !empty($this->get_kept_roles())) {
|
|
|
80 |
$this->add_step(new backup_users_structure_step('users', 'users.xml'));
|
|
|
81 |
}
|
|
|
82 |
|
|
|
83 |
// Generate the top roles file with all the final annotated roles
|
|
|
84 |
// that have been detected along the whole process. It's just
|
|
|
85 |
// the list of role definitions (no assignments nor permissions)
|
|
|
86 |
$this->add_step(new backup_final_roles_structure_step('roleslist', 'roles.xml'));
|
|
|
87 |
|
|
|
88 |
// Generate the gradebook file with categories and course grade items. Do it conditionally, using
|
|
|
89 |
// execute_condition() so only will be excuted if ALL module grade_items in course have been exported
|
|
|
90 |
$this->add_step(new backup_gradebook_structure_step('course_gradebook','gradebook.xml'));
|
|
|
91 |
|
|
|
92 |
// Generate the grade history file, conditionally.
|
|
|
93 |
$this->add_step(new backup_grade_history_structure_step('course_grade_history','grade_history.xml'));
|
|
|
94 |
|
|
|
95 |
// Generate the course completion
|
|
|
96 |
$this->add_step(new backup_course_completion_structure_step('course_completion', 'completion.xml'));
|
|
|
97 |
|
|
|
98 |
// Conditionally generate the badges file.
|
|
|
99 |
if ($this->get_setting_value('badges')) {
|
|
|
100 |
$this->add_step(new backup_badges_structure_step('course_badges', 'badges.xml'));
|
|
|
101 |
}
|
|
|
102 |
|
|
|
103 |
// Generate the scales file with all the (final) annotated scales
|
|
|
104 |
$this->add_step(new backup_final_scales_structure_step('scaleslist', 'scales.xml'));
|
|
|
105 |
|
|
|
106 |
// Generate the outcomes file with all the (final) annotated outcomes
|
|
|
107 |
$this->add_step(new backup_final_outcomes_structure_step('outcomeslist', 'outcomes.xml'));
|
|
|
108 |
|
|
|
109 |
// Migrate the pending annotations to final (prev steps may have added some files)
|
|
|
110 |
// This must be executed before backup files
|
|
|
111 |
$this->add_step(new move_inforef_annotations_to_final('migrate_inforef'));
|
|
|
112 |
|
|
|
113 |
// Generate the files.xml file with all the (final) annotated files. At the same
|
|
|
114 |
// time copy all the files from moodle storage to backup storage (uses custom
|
|
|
115 |
// backup_nested_element for that)
|
|
|
116 |
$this->add_step(new backup_final_files_structure_step('fileslist', 'files.xml'));
|
|
|
117 |
|
|
|
118 |
// Write the main moodle_backup.xml file, with all the information related
|
|
|
119 |
// to the backup, settings, license, versions and other useful information
|
|
|
120 |
$this->add_step(new backup_main_structure_step('mainfile', 'moodle_backup.xml'));
|
|
|
121 |
|
|
|
122 |
require_once($CFG->dirroot . '/backup/util/helper/convert_helper.class.php');
|
|
|
123 |
|
|
|
124 |
// Look for converter steps only in type course and mode general backup operations.
|
|
|
125 |
$conversion = false;
|
|
|
126 |
if ($this->plan->get_type() == backup::TYPE_1COURSE and $this->plan->get_mode() == backup::MODE_GENERAL) {
|
|
|
127 |
$converters = convert_helper::available_converters(false);
|
|
|
128 |
foreach ($converters as $value) {
|
|
|
129 |
if ($this->get_setting_value($value)) {
|
|
|
130 |
// Zip class.
|
|
|
131 |
$zip_contents = "{$value}_zip_contents";
|
|
|
132 |
$store_backup_file = "{$value}_store_backup_file";
|
|
|
133 |
$convert = "{$value}_backup_convert";
|
|
|
134 |
|
|
|
135 |
$this->add_step(new $convert("package_convert_{$value}"));
|
|
|
136 |
$this->add_step(new $zip_contents("zip_contents_{$value}"));
|
|
|
137 |
$this->add_step(new $store_backup_file("save_backupfile_{$value}"));
|
|
|
138 |
if (!$conversion) {
|
|
|
139 |
$conversion = true;
|
|
|
140 |
}
|
|
|
141 |
}
|
|
|
142 |
}
|
|
|
143 |
}
|
|
|
144 |
|
|
|
145 |
// On backup::MODE_IMPORT, we don't have to zip nor store the the file, skip these steps
|
|
|
146 |
if (($this->plan->get_mode() != backup::MODE_IMPORT) && !$conversion) {
|
|
|
147 |
// Generate the zip file (mbz extension)
|
|
|
148 |
$this->add_step(new backup_zip_contents('zip_contents'));
|
|
|
149 |
|
|
|
150 |
// Copy the generated zip (.mbz) file to final destination
|
|
|
151 |
$this->add_step(new backup_store_backup_file('save_backupfile'));
|
|
|
152 |
}
|
|
|
153 |
|
|
|
154 |
// Clean the temp dir (conditionally) and drop temp tables
|
|
|
155 |
$cleanstep = new drop_and_clean_temp_stuff('drop_and_clean_temp_stuff');
|
|
|
156 |
// Decide about to delete the temp dir (based on backup::MODE_IMPORT)
|
|
|
157 |
$cleanstep->skip_cleaning_temp_dir($this->plan->get_mode() == backup::MODE_IMPORT);
|
|
|
158 |
$this->add_step($cleanstep);
|
|
|
159 |
|
|
|
160 |
$this->built = true;
|
|
|
161 |
}
|
|
|
162 |
|
|
|
163 |
public function get_weight() {
|
|
|
164 |
// The final task takes ages, so give it 20 times the weight of a normal task.
|
|
|
165 |
return 20;
|
|
|
166 |
}
|
|
|
167 |
|
|
|
168 |
// Protected API starts here
|
|
|
169 |
|
|
|
170 |
/**
|
|
|
171 |
* Define the common setting that any backup type will have
|
|
|
172 |
*/
|
|
|
173 |
protected function define_settings() {
|
|
|
174 |
// This task has not settings (could have them, like destination or so in the future, let's see)
|
|
|
175 |
}
|
|
|
176 |
}
|