From 8e6e56c0661bb48adc339bb80b464b70ee290e43 Mon Sep 17 00:00:00 2001 From: Rex Lorenzo Date: Mon, 17 Sep 2018 13:25:34 -0700 Subject: [PATCH] MDL-63263 tool_recyclebin: Recycle bin should always save user data. --- admin/tool/recyclebin/classes/course_bin.php | 9 ++- .../tool/recyclebin/tests/course_bin_test.php | 56 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/admin/tool/recyclebin/classes/course_bin.php b/admin/tool/recyclebin/classes/course_bin.php index fb5d779013aad..c3c5293af2206 100644 --- a/admin/tool/recyclebin/classes/course_bin.php +++ b/admin/tool/recyclebin/classes/course_bin.php @@ -112,6 +112,9 @@ public function store_item($cm) { return; } + $CFG->forced_plugin_settings['backup']['backup_general_users'] = 1; + $CFG->forced_plugin_settings['backup']['backup_general_groups'] = 1; + // Backup the activity. $user = get_admin(); $controller = new \backup_controller( @@ -229,6 +232,10 @@ public function restore_item($item) { \backup::TARGET_EXISTING_ADDING ); + // Make sure to restore user data. + $controller->get_plan()->get_setting('users')->set_value(1); + $controller->get_plan()->get_setting('groups')->set_value(1); + // Prechecks. if (!$controller->execute_precheck()) { $results = $controller->get_precheck_results(); @@ -344,4 +351,4 @@ public function can_delete() { $context = \context_course::instance($this->_courseid); return has_capability('tool/recyclebin:deleteitems', $context); } -} +} \ No newline at end of file diff --git a/admin/tool/recyclebin/tests/course_bin_test.php b/admin/tool/recyclebin/tests/course_bin_test.php index 9a4e0c37f3ad5..88ec96d2dc438 100644 --- a/admin/tool/recyclebin/tests/course_bin_test.php +++ b/admin/tool/recyclebin/tests/course_bin_test.php @@ -24,6 +24,9 @@ defined('MOODLE_INTERNAL') || die(); +global $CFG; +require_once($CFG->dirroot . '/mod/assign/tests/fixtures/testable_assign.php'); + /** * Recycle bin course tests. * @@ -173,4 +176,57 @@ public function test_cleanup_task() { $deletedbook = reset($items); $this->assertEquals($book->name, $deletedbook->name); } + + /** + * Tests that user data is restored when module is restored. + */ + public function test_userdata_restore() { + set_config('backup_general_users', 0, 'backup'); + set_config('restore_general_users', 0, 'restore'); + + // Create assignment and user submission. + $student = $this->getDataGenerator()->create_and_enrol($this->course, 'student'); + $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign'); + $instance = $generator->create_instance([ + 'assignsubmission_onlinetext_enabled' => true, + 'course' => $this->course->id + ]); + $cm = get_coursemodule_from_instance('assign', $instance->id); + $context = context_module::instance($cm->id); + $assign = new mod_assign_testable_assign($context, $cm, $this->course); + $this->setUser($student->id); + $submission = $assign->get_user_submission($student->id, true); + $data = (object) [ + 'onlinetext_editor' => [ + 'itemid' => file_get_unused_draft_itemid(), + 'text' => 'Submission text', + 'format' => FORMAT_PLAIN, + ], + ]; + $plugin = $assign->get_submission_plugin_by_type('onlinetext'); + $plugin->save($submission, $data); + + // Verify that user submission exists. + $submission = $assign->get_user_submission($student->id, false); + $this->assertNotFalse($submission); + + // Delete assignment. + course_delete_module($cm->id); + phpunit_util::run_all_adhoc_tasks(); + + // Restore assignment. + $recyclebin = new \tool_recyclebin\course_bin($this->course->id); + foreach ($recyclebin->get_items() as $item) { + $recyclebin->restore_item($item); + } + + // Verify that user submission exists. + $assignments = get_coursemodules_in_course('assign', $this->course->id); + $this->assertEquals(1, count($assignments)); + $cm = array_pop($assignments); + $context = context_module::instance($cm->id); + $assign = new mod_assign_testable_assign($context, $cm, $this->course); + $submission = $assign->get_user_submission($student->id, false); + $this->assertNotFalse($submission); + } }