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