MDL-27733 workshop: keep the phase deadlines during the 1.9 => 2.0 upgrade
[moodle.git] / mod / workshop / db / upgradelib.php
CommitLineData
b876ab80
DM
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 * Functions used by some stages in workshop db/upgrade.php
20 *
65601f04
DM
21 * @package mod
22 * @subpackage workshop
23 * @copyright 2009 David Mudrak <david.mudrak@gmail.com>
24 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
b876ab80
DM
25 */
26
27/**
28 * Prepares the inital workshop 2.0 core tables
29 */
30function workshop_upgrade_prepare_20_tables() {
31 global $CFG, $DB;
32
33 $dbman = $DB->get_manager();
34
35 if (!$dbman->table_exists('workshop')) {
36 $table = new xmldb_table('workshop');
37 $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
b876ab80
DM
38 $table->add_field('course', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
39 $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
40 $table->add_field('intro', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
41 $table->add_field('introformat', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
42 $table->add_field('instructauthors', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
43 $table->add_field('instructauthorsformat', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
44 $table->add_field('instructreviewers', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
45 $table->add_field('instructreviewersformat', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
46 $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
47 $table->add_field('phase', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, null, null, '0');
48 $table->add_field('useexamples', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, null, null, '0');
49 $table->add_field('usepeerassessment', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, null, null, '0');
50 $table->add_field('useselfassessment', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, null, null, '0');
51 $table->add_field('grade', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, null, null, '80');
52 $table->add_field('gradinggrade', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, null, null, '20');
53 $table->add_field('strategy', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null);
54 $table->add_field('gradedecimals', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, null, null, '0');
55 $table->add_field('nattachments', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, null, null, '0');
56 $table->add_field('latesubmissions', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, null, null, '0');
57 $table->add_field('maxbytes', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, '100000');
58 $table->add_field('examplesmode', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, null, null, '0');
59 $table->add_field('submissionstart', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, '0');
60 $table->add_field('submissionend', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, '0');
61 $table->add_field('assessmentstart', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, '0');
62 $table->add_field('assessmentend', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, '0');
63 $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
64 $table->add_key('course_fk', XMLDB_KEY_FOREIGN, array('course'), 'course', array('id'));
65 $dbman->create_table($table);
66 }
67
68 if (!$dbman->table_exists('workshop_submissions')) {
69 $table = new xmldb_table('workshop_submissions');
70 $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
71 $table->add_field('workshopid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
72 $table->add_field('example', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, null, null, '0');
73 $table->add_field('authorid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
74 $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
75 $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
76 $table->add_field('title', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null);
77 $table->add_field('content', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
78 $table->add_field('contentformat', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
79 $table->add_field('contenttrust', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
80 $table->add_field('attachment', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, null, null, '0');
81 $table->add_field('grade', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, null, null, null);
82 $table->add_field('gradeover', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, null, null, null);
83 $table->add_field('gradeoverby', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
84 $table->add_field('feedbackauthor', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
85 $table->add_field('feedbackauthorformat', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, null, null, '0');
86 $table->add_field('timegraded', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
87 $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
88 $table->add_key('workshop_fk', XMLDB_KEY_FOREIGN, array('workshopid'), 'workshop', array('id'));
89 $table->add_key('overriddenby_fk', XMLDB_KEY_FOREIGN, array('gradeoverby'), 'user', array('id'));
90 $table->add_key('author_fk', XMLDB_KEY_FOREIGN, array('authorid'), 'user', array('id'));
91 $dbman->create_table($table);
92 }
93
94 if (!$dbman->table_exists('workshop_assessments')) {
95 $table = new xmldb_table('workshop_assessments');
96 $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
97 $table->add_field('submissionid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
98 $table->add_field('reviewerid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
99 $table->add_field('weight', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '1');
100 $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, '0');
101 $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, '0');
102 $table->add_field('grade', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, null, null, null);
103 $table->add_field('gradinggrade', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, null, null, null);
104 $table->add_field('gradinggradeover', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, null, null, null);
105 $table->add_field('gradinggradeoverby', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
106 $table->add_field('feedbackauthor', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
107 $table->add_field('feedbackauthorformat', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, null, null, '0');
108 $table->add_field('feedbackreviewer', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
109 $table->add_field('feedbackreviewerformat', XMLDB_TYPE_INTEGER, '3', XMLDB_UNSIGNED, null, null, '0');
110 $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
111 $table->add_key('submission_fk', XMLDB_KEY_FOREIGN, array('submissionid'), 'workshop_submissions', array('id'));
112 $table->add_key('overriddenby_fk', XMLDB_KEY_FOREIGN, array('gradinggradeoverby'), 'user', array('id'));
113 $table->add_key('reviewer_fk', XMLDB_KEY_FOREIGN, array('reviewerid'), 'user', array('id'));
114 $dbman->create_table($table);
115 }
116
117 if (!$dbman->table_exists('workshop_grades')) {
118 $table = new xmldb_table('workshop_grades');
119 $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
120 $table->add_field('assessmentid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
121 $table->add_field('strategy', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, null);
122 $table->add_field('dimensionid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
123 $table->add_field('grade', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
124 $table->add_field('peercomment', XMLDB_TYPE_TEXT, 'big', null, null, null, null);
125 $table->add_field('peercommentformat', XMLDB_TYPE_INTEGER, '3', null, null, null, '0');
126 $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
127 $table->add_key('assessment_fk', XMLDB_KEY_FOREIGN, array('assessmentid'), 'workshop_assessments', array('id'));
128 $table->add_key('formfield_uk', XMLDB_KEY_UNIQUE, array('assessmentid', 'strategy', 'dimensionid'));
129 $dbman->create_table($table);
130 }
131
132 if (!$dbman->table_exists('workshop_aggregations')) {
133 $table = new xmldb_table('workshop_aggregations');
134 $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
135 $table->add_field('workshopid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
136 $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null);
137 $table->add_field('gradinggrade', XMLDB_TYPE_NUMBER, '10, 5', XMLDB_UNSIGNED, null, null, null);
138 $table->add_field('timegraded', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null);
139 $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
140 $table->add_key('workshop_fk', XMLDB_KEY_FOREIGN, array('workshopid'), 'workshop', array('id'));
141 $table->add_key('user_fk', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));
142 $table->add_key('workshopuser', XMLDB_KEY_UNIQUE, array('workshopid', 'userid'));
143 $dbman->create_table($table);
144 }
145}
146
147/**
067f63c5 148 * Copies the records from workshop_old into workshop table
b876ab80
DM
149 *
150 * @return void
151 */
067f63c5 152function workshop_upgrade_module_instances() {
9ec63757 153 global $CFG, $DB;
b876ab80
DM
154
155 upgrade_set_timeout();
156 $moduleid = $DB->get_field('modules', 'id', array('name' => 'workshop'), MUST_EXIST);
d0fb1705 157 $rs = $DB->get_recordset_select('workshop_old', 'newid IS NULL', null, 'id');
b876ab80 158 foreach ($rs as $old) {
067f63c5 159 $new = workshop_upgrade_transform_instance($old);
d0fb1705
DM
160 $new->id = $old->id;
161 $DB->import_record('workshop', $new);
067f63c5 162 $DB->set_field('workshop_old', 'newplugin', 'workshop', array('id' => $old->id));
d0fb1705 163 $DB->set_field('workshop_old', 'newid', $new->id, array('id' => $old->id));
b876ab80
DM
164 }
165 $rs->close();
166}
067f63c5
DM
167
168/**
169 * Given a record containing data from 1.9 workshop table, returns object containing data as should be saved in 2.0 workshop table
170 *
171 * @param stdClass $old record from 1.9 workshop table
172 * @return stdClass
173 */
174function workshop_upgrade_transform_instance(stdClass $old) {
175 global $CFG;
176 require_once(dirname(dirname(__FILE__)) . '/locallib.php');
177
178 $new = new stdClass();
179 $new->course = $old->course;
180 $new->name = $old->name;
181 $new->intro = $old->description;
182 $new->introformat = $old->format;
183 $new->nattachments = $old->nattachments;
184 $new->maxbytes = $old->maxbytes;
185 $new->grade = $old->grade;
186 $new->gradinggrade = $old->gradinggrade;
187 $new->phase = workshop::PHASE_CLOSED;
188 $new->timemodified = time();
189 if ($old->ntassessments > 0) {
190 $new->useexamples = 1;
191 } else {
192 $new->useexamples = 0;
193 }
194 $new->usepeerassessment = 1;
195 $new->useselfassessment = $old->includeself;
196 switch ($old->gradingstrategy) {
197 case 0: // 'notgraded' - renamed
198 $new->strategy = 'comments';
199 break;
200 case 1: // 'accumulative'
201 $new->strategy = 'accumulative';
202 break;
203 case 2: // 'errorbanded' - renamed
204 $new->strategy = 'numerrors';
205 break;
206 case 3: // 'criterion' - will be migrated into 'rubric'
207 $new->strategy = 'rubric';
208 break;
209 case 4: // 'rubric'
210 $new->strategy = 'rubric';
211 break;
212 }
ce8157ed
DM
213 if ($old->submissionstart < $old->submissionend) {
214 $new->submissionstart = $old->submissionstart;
215 $new->submissionend = $old->submissionend;
216 }
217 if ($old->assessmentstart < $old->assessmentend) {
218 $new->assessmentstart = $old->assessmentstart;
219 $new->assessmentend = $old->assessmentend;
220 }
067f63c5
DM
221
222 return $new;
223}
224
067f63c5
DM
225/**
226 * Copies records from workshop_submissions_old into workshop_submissions. Can be called after all workshop module instances
227 * were correctly migrated and new ids are filled in workshop_old
228 *
229 * @return void
230 */
231function workshop_upgrade_submissions() {
9ec63757 232 global $CFG, $DB;
067f63c5
DM
233
234 upgrade_set_timeout();
067f63c5 235
d0fb1705 236 // list of teachers in every workshop: array of (int)workshopid => array of (int)userid => notused
067f63c5 237 $workshopteachers = array();
3d8649b1 238
067f63c5
DM
239 $rs = $DB->get_recordset_select('workshop_submissions_old', 'newid IS NULL');
240 foreach ($rs as $old) {
241 if (!isset($workshopteachers[$old->workshopid])) {
d0fb1705 242 $cm = get_coursemodule_from_instance('workshop', $old->workshopid, 0, false, MUST_EXIST);
067f63c5
DM
243 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
244 $workshopteachers[$old->workshopid] = get_users_by_capability($context, 'mod/workshop:manage', 'u.id');
245 }
d0fb1705 246 $new = workshop_upgrade_transform_submission($old, $old->workshopid, $workshopteachers[$old->workshopid]);
067f63c5
DM
247 $newid = $DB->insert_record('workshop_submissions', $new, true, true);
248 $DB->set_field('workshop_submissions_old', 'newplugin', 'submissions', array('id' => $old->id));
249 $DB->set_field('workshop_submissions_old', 'newid', $newid, array('id' => $old->id));
250 }
251 $rs->close();
252}
253
254/**
255 * Given a record from 1.x workshop_submissions_old, returns data for 2.0 workshop_submissions
256 *
257 * @param stdClass $old
3d8649b1 258 * @param int $newworkshopid new workshop id
067f63c5
DM
259 * @param array $legacyteachers $userid => notused the list of legacy workshop teachers for the submission's workshop
260 * @return stdClass
261 */
3d8649b1
DM
262function workshop_upgrade_transform_submission(stdClass $old, $newworkshopid, array $legacyteachers) {
263
264 $new = new stdclass(); // new submission record to be returned
265 $new->workshopid = $newworkshopid;
266
067f63c5
DM
267 if (isset($legacyteachers[$old->userid])) {
268 // the author of the submission was teacher = had mod/workshop:manage. this is the only way how we can
269 // recognize the submission should be treated as example submission (ach jo...)
3d8649b1 270 $new->example = 1;
067f63c5 271 } else {
3d8649b1 272 $new->example = 0;
067f63c5 273 }
3d8649b1
DM
274
275 $new->authorid = $old->userid;
276 $new->timecreated = $old->timecreated;
277 $new->timemodified = $old->timecreated;
278 $new->title = $old->title;
279 $new->content = $old->description;
067f63c5 280 $new->contentformat = FORMAT_HTML;
3d8649b1
DM
281 $new->contenttrust = 0;
282 $new->published = 0;
067f63c5
DM
283
284 return $new;
285}
286
3d8649b1
DM
287/**
288 * Returns the list of new submission instances ids
289 *
290 * @return array (int)oldid => (int)newid
291 */
292function workshop_upgrade_submission_id_mappings() {
293 global $DB;
294
295 $oldrecords = $DB->get_records('workshop_submissions_old', null, 'id', 'id,newid');
296 $newids = array();
297 foreach ($oldrecords as $oldid => $oldrecord) {
298 if ($oldrecord->id and $oldrecord->newid) {
299 $newids[$oldid] = $oldrecord->newid;
300 }
301 }
302 return $newids;
303}
304
305/**
306 * Returns the list of teacherweight values as were set in legacy workshop instances
307 *
308 * @return array (int)oldid => (int)teacherweight
309 */
310function workshop_upgrade_legacy_teacher_weights() {
311 global $DB;
312
313 $oldrecords = $DB->get_records('workshop_old', null, 'id', 'id,teacherweight');
314 $weights = array();
315 foreach ($oldrecords as $oldid => $oldrecord) {
316 if (is_null($oldrecord->teacherweight)) {
317 $weights[$oldid] = 1;
318 } else {
319 $weights[$oldid] = $oldrecord->teacherweight;
320 }
321 }
322 return $weights;
323}
324
325/**
326 * Copies all assessments from workshop_assessments_old to workshop_assessments. Can be called after all
327 * submissions were migrated.
328 *
329 * @return void
330 */
331function workshop_upgrade_assessments() {
332 global $CFG, $DB, $OUTPUT;
333
334 upgrade_set_timeout();
d0fb1705 335
3d8649b1
DM
336 $newsubmissionids = workshop_upgrade_submission_id_mappings();
337 $teacherweights = workshop_upgrade_legacy_teacher_weights();
338
d0fb1705 339 // list of teachers in every workshop: array of (int)workshopid => array of (int)userid => notused
3d8649b1
DM
340 $workshopteachers = array();
341
342 $rs = $DB->get_recordset_select('workshop_assessments_old', 'newid IS NULL');
343 foreach ($rs as $old) {
344 if (!isset($workshopteachers[$old->workshopid])) {
d0fb1705 345 $cm = get_coursemodule_from_instance('workshop', $old->workshopid, 0, false, MUST_EXIST);
3d8649b1
DM
346 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
347 $workshopteachers[$old->workshopid] = get_users_by_capability($context, 'mod/workshop:manage', 'u.id');
348 }
349 $new = workshop_upgrade_transform_assessment($old, $newsubmissionids[$old->submissionid],
350 $workshopteachers[$old->workshopid], $teacherweights[$old->workshopid]);
351 $newid = $DB->insert_record('workshop_assessments', $new, true, true);
352 $DB->set_field('workshop_assessments_old', 'newplugin', 'assessments', array('id' => $old->id));
353 $DB->set_field('workshop_assessments_old', 'newid', $newid, array('id' => $old->id));
354 }
355 $rs->close();
356}
357
358/**
359 * Given a record from workshop_assessments_old, returns record to be stored in workshop_assessment
360 *
361 * @param stdClass $old record from workshop_assessments_old,
362 * @param int $newsubmissionid new submission id
363 * @param array $legacyteachers (int)userid => notused the list of legacy workshop teachers for the submission's workshop
364 * @param int $legacyteacherweight weight of teacher's assessment in legacy workshop
365 * @return stdClass
366 */
367function workshop_upgrade_transform_assessment(stdClass $old, $newsubmissionid, array $legacyteachers, $legacyteacherweight) {
368 global $CFG;
369 require_once($CFG->libdir . '/gradelib.php');
370
371 $new = new stdclass();
372 $new->submissionid = $newsubmissionid;
373 $new->reviewerid = $old->userid;
374
375 if (isset($legacyteachers[$old->userid])) {
376 $new->weight = $legacyteacherweight;
377 } else {
378 $new->weight = 1;
379 }
380
381 if ($old->grade < 0) {
382 // in workshop 1.x, this is just allocated assessment that has not been touched yet, having timecreated one year in the future :-/
383 $new->timecreated = time();
384 } else {
385 $new->grade = grade_floatval($old->grade);
386 if ($old->teachergraded) {
387 $new->gradinggradeover = grade_floatval($old->gradinggrade);
388 } else {
389 $new->gradinggrade = grade_floatval($old->gradinggrade);
390 }
391 $new->feedbackauthor = $old->generalcomment;
392 $new->feedbackauthorformat = FORMAT_HTML;
393 $new->feedbackreviewer = $old->teachercomment;
394 $new->feedbackreviewerformat = FORMAT_HTML;
395 $new->timecreated = $old->timecreated;
396 $new->timemodified = $old->timegraded;
397 }
398
399 return $new;
400}
9ec63757
DM
401
402/**
403 * Returns the list of new assessment ids
404 *
405 * @return array (int)oldid => (int)newid
406 */
407function workshop_upgrade_assessment_id_mappings() {
408 global $DB;
409
410 $oldrecords = $DB->get_records('workshop_assessments_old', null, 'id', 'id,newid');
411 $newids = array();
412 foreach ($oldrecords as $oldid => $oldrecord) {
413 if ($oldrecord->id and $oldrecord->newid) {
414 $newids[$oldid] = $oldrecord->newid;
415 }
416 }
417 return $newids;
418}
419
420/**
421 * Returns the list of new element (dimension) ids
422 *
9ec63757 423 * @param string $strategy the name of strategy subplugin that the element was migrated into
455f42a4 424 * @return array (int)workshopid => array (int)elementno => stdclass ->(int)newid {->(string)type} {->(int)maxscore}
9ec63757
DM
425 */
426function workshop_upgrade_element_id_mappings($strategy) {
427 global $DB;
428
429 $oldrecords = $DB->get_records('workshop_elements_old', array('newplugin' => $strategy),
455f42a4 430 'workshopid,elementno', 'id,workshopid,elementno,scale,maxscore,newid');
9ec63757
DM
431 $newids = array();
432 foreach ($oldrecords as $old) {
433 if (!isset($newids[$old->workshopid])) {
434 $newids[$old->workshopid] = array();
435 }
436 $info = new stdclass();
437 $info->newid = $old->newid;
25e27d74
DM
438 if ($strategy == 'accumulative') {
439 if ($old->scale >= 0 and $old->scale <= 6) {
440 $info->type = 'scale';
441 } else {
442 $info->type = 'value';
443 }
9ec63757 444 }
455f42a4
DM
445 if ($strategy == 'rubric_levels') {
446 $info->maxscore = $old->maxscore;
447 }
9ec63757
DM
448 $newids[$old->workshopid][$old->elementno] = $info;
449 }
450 return $newids;
451}