MDL-23479 backup - lesson revised & old code deleted (but restore logs)
[moodle.git] / mod / lesson / backup / moodle2 / backup_lesson_stepslib.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  * This file contains the backup structure for the lesson module
20  *
21  * This is the "graphical" structure of the lesson module:
22  *
23  *                  lesson ------------>---------------|-------------->-----------|------------->------------|
24  *               (CL,pk->id)                           |                          |                          |
25  *                     |                               |                          |                          |
26  *                     |                         lesson_grades              lesson_high_scores         lesson_timer
27  *                     |                  (UL, pk->id,fk->lessonid)    (UL, pk->id,fk->lessonid)   (UL, pk->id,fk->lessonid)
28  *                     |                               |
29  *                     |                               |
30  *                     |                               |
31  *                     |                               |
32  *              lesson_pages----------->---------lesson_branch
33  *          (CL,pk->id,fk->lessonid)       (UL, pk->id,fk->pageid)
34  *                     |
35  *                     |
36  *                     |
37  *               lesson_answers
38  *            (CL,pk->id,fk->pageid)
39  *                     |
40  *                     |
41  *                     |
42  *               lesson_attempts
43  *          (UL,pk->id,fk->answerid)
44  *
45  * Meaning: pk->primary key field of the table
46  *          fk->foreign key to link with parent
47  *          nt->nested field (recursive data)
48  *          CL->course level info
49  *          UL->user level info
50  *          files->table may have files)
51  *
52  * @package    mod
53  * @subpackage lesson
54  * @copyright  2010 Sam Hemelryk
55  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
56  */
58 /**
59  * Structure step class that informs a backup task how to backup the lesson module.
60  *
61  * @copyright  2010 Sam Hemelryk
62  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
63  */
64 class backup_lesson_activity_structure_step extends backup_activity_structure_step {
66     protected function define_structure() {
68         // The lesson table
69         // This table contains all of the goodness for the lesson module, quite
70         // alot goes into it but nothing relational other than course when will
71         // need to be corrected upon restore
72         $lesson = new backup_nested_element('lesson', array('id'), array(
73             'course','name','practice','modattempts','usepassword','password',
74             'dependency','conditions','grade','custom','ongoing','usemaxgrade',
75             'maxanswers','maxattempts','review','nextpagedefault','feedback',
76             'minquestions','maxpages','timed','maxtime','retake','activitylink',
77             'mediafile','mediaheight','mediawidth','mediaclose','slideshow',
78             'width','height','bgcolor','displayleft','displayleftif','progressbar',
79             'highscores','maxhighscores','available','deadline','timemodified'
80         ));
82         // The lesson_pages table
83         // Grouped within a `pages` element, important to note that page is relational
84         // to the lesson, and also to the previous/next page in the series.
85         // Upon restore prevpageid and nextpageid will need to be corrected.
86         $pages = new backup_nested_element('pages');
87         $page = new backup_nested_element('page', array('id'), array(
88             'prevpageid','nextpageid','qtype','qoption','layout',
89             'display','timecreated','timemodified','title','contents',
90             'contentsformat'
91         ));
93         // The lesson_answers table
94         // Grouped within an answers `element`, the lesson_answers table relates
95         // to the page and lesson with `pageid` and `lessonid` that will both need
96         // to be corrected during restore.
97         $answers = new backup_nested_element('answers');
98         $answer = new backup_nested_element('answer', array('id'), array(
99             'jumpto','grade','score','flags','timecreated','timemodified','answer_text',
100             'response', 'answerformat', 'responseformat'
101         ));
102         // Tell the answer element about the answer_text elements mapping to the answer
103         // database field.
104         $answer->set_source_alias('answer', 'answer_text');
106         // The lesson_attempts table
107         // Grouped by an `attempts` element this is relational to the page, lesson,
108         // and user.
109         $attempts = new backup_nested_element('attempts');
110         $attempt = new backup_nested_element('attempt', array('id'), array(
111             'userid','retry','correct','useranswer','timeseen'
112         ));
114         // The lesson_branch table
115         // Grouped by a `branch` element this is relational to the page, lesson,
116         // and user.
117         $branches = new backup_nested_element('branches');
118         $branch = new backup_nested_element('branch', array('id'), array(
119             'userid','retry','flag','timeseen'
120         ));
122         // The lesson_grades table
123         // Grouped by a grades element this is relational to the lesson and user.
124         $grades = new backup_nested_element('grades');
125         $grade = new backup_nested_element('grade', array('id'), array(
126             'userid','grade','late','completed'
127         ));
129         // The lesson_high_scores table
130         // Grouped by a highscores element this is relational to the lesson, user,
131         // and possibly a grade.
132         $highscores = new backup_nested_element('highscores');
133         $highscore = new backup_nested_element('highscore', array('id'), array(
134             'gradeid','userid','nickname'
135         ));
137         // The lesson_timer table
138         // Grouped by a `timers` element this is relational to the lesson and user.
139         $timers = new backup_nested_element('timers');
140         $timer = new backup_nested_element('timer', array('id'), array(
141             'userid','starttime','lessontime'
142         ));
144         // Now that we have all of the elements created we've got to put them
145         // together correctly.
146         $lesson->add_child($pages);
147         $pages->add_child($page);
148         $page->add_child($answers);
149         $answers->add_child($answer);
150         $answer->add_child($attempts);
151         $attempts->add_child($attempt);
152         $page->add_child($branches);
153         $branches->add_child($branch);
154         $lesson->add_child($grades);
155         $grades->add_child($grade);
156         $lesson->add_child($highscores);
157         $highscores->add_child($highscore);
158         $lesson->add_child($timers);
159         $timers->add_child($timer);
161         // Set the source table for the elements that aren't reliant on the user
162         // at this point (lesson, lesson_pages, lesson_answers)
163         $lesson->set_source_table('lesson', array('id' => backup::VAR_ACTIVITYID));
164         //we use SQL here as it must be ordered by prevpageid so that restore gets the pages in the right order.
165         $page->set_source_sql("
166                 SELECT *
167                   FROM {lesson_pages}
168                  WHERE lessonid = ? ORDER BY prevpageid",
169                 array(backup::VAR_PARENTID));
170         $answer->set_source_table('lesson_answers', array('pageid' => backup::VAR_PARENTID));
172         // Check if we are also backing up user information
173         if ($this->get_setting_value('userinfo')) {
174             // Set the source table for elements that are reliant on the user
175             // lesson_attempts, lesson_branch, lesson_grades, lesson_high_scores, lesson_timer
176             $attempt->set_source_table('lesson_attempts', array('answerid' => backup::VAR_PARENTID));
177             $branch->set_source_table('lesson_branch', array('pageid' => backup::VAR_PARENTID));
178             $grade->set_source_table('lesson_grades', array('lessonid'=>backup::VAR_PARENTID));
179             $highscore->set_source_table('lesson_high_scores', array('lessonid' => backup::VAR_PARENTID));
180             $timer->set_source_table('lesson_timer', array('lessonid' => backup::VAR_PARENTID));
181         }
183         // Annotate the user id's where required.
184         $attempt->annotate_ids('user', 'userid');
185         $branch->annotate_ids('user', 'userid');
186         $grade->annotate_ids('user', 'userid');
187         $highscore->annotate_ids('user', 'userid');
188         $timer->annotate_ids('user', 'userid');
190         // Annotate the file areas in user by the lesson module.
191         $lesson->annotate_files('mod_lesson', 'mediafile', null);
192         $page->annotate_files('mod_lesson', 'page_contents', 'id');
194         // Prepare and return the structure we have just created for the lesson module.
195         return $this->prepare_activity_structure($lesson);
196     }