From 2370255e4c6bebfb1104d020ef3f804cf6a09b9d Mon Sep 17 00:00:00 2001 From: Thong Bui <qktc1422@gmail.com> Date: Mon, 7 Nov 2022 13:08:12 +0700 Subject: [PATCH] MDL-76193 Questions: Backup and Restore with tags fails --- backup/moodle2/restore_stepslib.php | 26 ++++++++++++++++++ .../backup_restore_question_tags.feature | 24 ++++++++++++++++ .../tests/fixtures/test_tags_backup.mbz | Bin 0 -> 8367 bytes 3 files changed, 50 insertions(+) create mode 100644 backup/moodle2/tests/behat/backup_restore_question_tags.feature create mode 100644 backup/moodle2/tests/fixtures/test_tags_backup.mbz diff --git a/backup/moodle2/restore_stepslib.php b/backup/moodle2/restore_stepslib.php index d56e5d6b7c0..e61c2d139d8 100644 --- a/backup/moodle2/restore_stepslib.php +++ b/backup/moodle2/restore_stepslib.php @@ -5293,6 +5293,7 @@ class restore_move_module_questions_categories extends restore_execution_step { AND parentitemid = ?", array($this->get_restoreid(), $contextid)); $top = question_get_top_category($newcontext->newitemid, true); $oldtopid = 0; + $categoryids = []; foreach ($modulecats as $modulecat) { // Before 3.5, question categories could be created at top level. // From 3.5 onwards, all question categories should be a child of a special category called the "top" category. @@ -5308,6 +5309,7 @@ class restore_move_module_questions_categories extends restore_execution_step { $cat->parent = $top->id; } $DB->update_record('question_categories', $cat); + $categoryids[] = (int)$cat->id; } // And set new contextid (and maybe update newitemid) also in question_category mapping (will be @@ -5316,6 +5318,30 @@ class restore_move_module_questions_categories extends restore_execution_step { $modulecat->newitemid, $newcontext->newitemid); } + // Update the context id of any tags applied to any questions in these categories. + if ($categoryids) { + [$categorysql, $categoryidparams] = $DB->get_in_or_equal($categoryids, SQL_PARAMS_NAMED); + $sqlupdate = "UPDATE {tag_instance} + SET contextid = :newcontext + WHERE component = :component + AND itemtype = :itemtype + AND itemid IN (SELECT DISTINCT bi.newitemid as questionid + FROM {backup_ids_temp} bi + JOIN {question} q ON q.id = bi.newitemid + JOIN {question_versions} qv ON qv.questionid = q.id + JOIN {question_bank_entries} qbe ON qbe.id = qv.questionbankentryid + WHERE bi.backupid = :backupid AND bi.itemname = 'question_created' + AND qbe.questioncategoryid {$categorysql}) "; + $params = [ + 'newcontext' => $newcontext->newitemid, + 'component' => 'core_question', + 'itemtype' => 'question', + 'backupid' => $this->get_restoreid(), + ]; + $params += $categoryidparams; + $DB->execute($sqlupdate, $params); + } + // Now set the parent id for the question categories that were in the top category in the course context // and have been moved now. if ($oldtopid) { diff --git a/backup/moodle2/tests/behat/backup_restore_question_tags.feature b/backup/moodle2/tests/behat/backup_restore_question_tags.feature new file mode 100644 index 00000000000..1aa62ca18e1 --- /dev/null +++ b/backup/moodle2/tests/behat/backup_restore_question_tags.feature @@ -0,0 +1,24 @@ +@core @core_backup +Feature: Backup and restore of the question that was tagged + + Background: + Given the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + + @javascript @_file_upload + Scenario: Restore the quiz containing the question that was tagged + Given I am on the "Course 1" "restore" page logged in as "admin" + And I press "Manage backup files" + And I upload "backup/moodle2/tests/fixtures/test_tags_backup.mbz" file to "Files" filemanager + And I press "Save changes" + And I restore "test_tags_backup.mbz" backup into a new course using this options: + | Schema | Course name | Course 2 | + | Schema | Course short name | C2 | + When I am on the "TF1" "core_question > edit" page logged in as admin + And I expand all fieldsets + Then I should see "Tag1-TF1" + And I should see "Tag2-TF1" + And I am on the "TF2" "core_question > edit" page logged in as admin + And I expand all fieldsets + And I should see "Tag1-TF2" diff --git a/backup/moodle2/tests/fixtures/test_tags_backup.mbz b/backup/moodle2/tests/fixtures/test_tags_backup.mbz new file mode 100644 index 0000000000000000000000000000000000000000..9df52316a49062049b7e7a27a21a2d0580032669 GIT binary patch literal 8367 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 literal 0 HcmV?d00001