From 33f4559da1419cea9b29a66a40f2fb4380ee7afa Mon Sep 17 00:00:00 2001 From: Mikhail Golenkov Date: Sun, 4 Oct 2020 18:25:43 +1100 Subject: [PATCH] MDL-69818 mod_feedback: Fix item dependency during activity restoration --- .../moodle2/restore_feedback_stepslib.php | 13 ++++++-- mod/feedback/tests/restore_date_test.php | 33 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/mod/feedback/backup/moodle2/restore_feedback_stepslib.php b/mod/feedback/backup/moodle2/restore_feedback_stepslib.php index 1de792de8be..64194503dbf 100644 --- a/mod/feedback/backup/moodle2/restore_feedback_stepslib.php +++ b/mod/feedback/backup/moodle2/restore_feedback_stepslib.php @@ -71,9 +71,6 @@ class restore_feedback_activity_structure_step extends restore_activity_structur $oldid = $data->id; $data->feedback = $this->get_new_parentid('feedback'); - //dependitem - $data->dependitem = $this->get_mappingid('feedback_item', $data->dependitem); - $newitemid = $DB->insert_record('feedback_item', $data); $this->set_mapping('feedback_item', $oldid, $newitemid, true); // Can have files } @@ -117,9 +114,19 @@ class restore_feedback_activity_structure_step extends restore_activity_structur } protected function after_execute() { + global $DB; // Add feedback related files, no need to match by itemname (just internally handled context) $this->add_related_files('mod_feedback', 'intro', null); $this->add_related_files('mod_feedback', 'page_after_submit', null); $this->add_related_files('mod_feedback', 'item', 'feedback_item'); + + // Once all items are restored we can set their dependency. + if ($records = $DB->get_records('feedback_item', array('feedback' => $this->task->get_activityid()))) { + foreach ($records as $record) { + // Get new id for dependitem if present. This will also reset dependitem if not found. + $record->dependitem = $this->get_mappingid('feedback_item', $record->dependitem); + $DB->update_record('feedback_item', $record); + } + } } } diff --git a/mod/feedback/tests/restore_date_test.php b/mod/feedback/tests/restore_date_test.php index 9642bfab3a7..38aeb7d0a43 100644 --- a/mod/feedback/tests/restore_date_test.php +++ b/mod/feedback/tests/restore_date_test.php @@ -61,4 +61,37 @@ class mod_feedback_restore_date_testcase extends restore_date_testcase { $this->assertFieldsRolledForward($feedback, $newfeedback, $props); $this->assertEquals($response->timemodified, $newresponse->timemodified); } + + /** + * Test that dependency for items is restored correctly. + */ + public function test_restore_item_dependency() { + global $DB; + // Create a course and a feedback activity. + $course = $this->getDataGenerator()->create_course(); + $feedback = $this->getDataGenerator()->create_module('feedback', array('course' => $course)); + $feedbackgenerator = $this->getDataGenerator()->get_plugin_generator('mod_feedback'); + + // Create a couple of items which depend on each other. + $item1 = $feedbackgenerator->create_item_numeric($feedback); + $item2 = $feedbackgenerator->create_item_numeric($feedback, array('dependitem' => $item1->id)); + $DB->set_field('feedback_item', 'dependitem', $item2->id, ['id' => $item1->id]); + + // Create one more item with fake/broken dependitem. + $item3 = $feedbackgenerator->create_item_numeric($feedback, array('dependitem' => 123456)); + + // Backup and restore the course. + $restoredcourseid = $this->backup_and_restore($course); + $restoredfeedback = $DB->get_record('feedback', ['course' => $restoredcourseid]); + + // Restored item1 and item2 are expected to be dependent the same way as the original ones. + $restoreditem1 = $DB->get_record('feedback_item', ['feedback' => $restoredfeedback->id, 'name' => $item1->name]); + $restoreditem2 = $DB->get_record('feedback_item', ['feedback' => $restoredfeedback->id, 'name' => $item2->name]); + $this->assertEquals($restoreditem2->id, $restoreditem1->dependitem); + $this->assertEquals($restoreditem1->id, $restoreditem2->dependitem); + + // Restored item3 is expected to have an empty dependitem. + $restoreditem3 = $DB->get_record('feedback_item', ['feedback' => $restoredfeedback->id, 'name' => $item3->name]); + $this->assertEquals(0, $restoreditem3->dependitem); + } }