From 6cb12d596fb6cb0047fbda039bdebcc399a49710 Mon Sep 17 00:00:00 2001 From: Nathan Nguyen Date: Mon, 24 Jun 2019 15:49:44 +1000 Subject: [PATCH 1/2] MDL-65555 mod_quiz: fix group override backup and restore --- .../backup/moodle2/backup_quiz_stepslib.php | 7 ++ .../backup/moodle2/restore_quiz_stepslib.php | 5 + mod/quiz/db/upgrade.php | 7 ++ mod/quiz/tests/restore_override_test.php | 107 ++++++++++++++++++ mod/quiz/version.php | 2 +- 5 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 mod/quiz/tests/restore_override_test.php diff --git a/mod/quiz/backup/moodle2/backup_quiz_stepslib.php b/mod/quiz/backup/moodle2/backup_quiz_stepslib.php index 1e72487c7b1..ae656816853 100644 --- a/mod/quiz/backup/moodle2/backup_quiz_stepslib.php +++ b/mod/quiz/backup/moodle2/backup_quiz_stepslib.php @@ -140,6 +140,13 @@ class backup_quiz_activity_structure_step extends backup_questions_activity_stru $overrideparams['userid'] = backup_helper::is_sqlparam(null); } + + // Skip group overrides if not including groups. + $groupinfo = $this->get_setting_value('groups'); + if (!$groupinfo) { + $overrideparams['groupid'] = backup_helper::is_sqlparam(null); + } + $override->set_source_table('quiz_overrides', $overrideparams); // All the rest of elements only happen if we are including user info. diff --git a/mod/quiz/backup/moodle2/restore_quiz_stepslib.php b/mod/quiz/backup/moodle2/restore_quiz_stepslib.php index 549e6047b10..d0f97c897ea 100644 --- a/mod/quiz/backup/moodle2/restore_quiz_stepslib.php +++ b/mod/quiz/backup/moodle2/restore_quiz_stepslib.php @@ -377,6 +377,11 @@ class restore_quiz_activity_structure_step extends restore_questions_activity_st $data->groupid = $this->get_mappingid('group', $data->groupid); } + // Skip if there is no user and no group data. + if (empty($data->userid) && empty($data->groupid)) { + return; + } + $data->timeopen = $this->apply_date_offset($data->timeopen); $data->timeclose = $this->apply_date_offset($data->timeclose); diff --git a/mod/quiz/db/upgrade.php b/mod/quiz/db/upgrade.php index 82e2f0fad81..cdaf870906c 100644 --- a/mod/quiz/db/upgrade.php +++ b/mod/quiz/db/upgrade.php @@ -196,6 +196,13 @@ function xmldb_quiz_upgrade($oldversion) { upgrade_mod_savepoint(true, 2018040800, 'quiz'); } + if ($oldversion < 2018120301) { + // Delete orphaned group overrides. + $DB->delete_records_select('quiz_overrides', 'groupid = 0 AND userid IS NULL'); + + upgrade_mod_savepoint(true, 2018120301, 'quiz'); + } + // Automatically generated Moodle v3.5.0 release upgrade line. // Put any upgrade step following this. diff --git a/mod/quiz/tests/restore_override_test.php b/mod/quiz/tests/restore_override_test.php new file mode 100644 index 00000000000..7836a9942ec --- /dev/null +++ b/mod/quiz/tests/restore_override_test.php @@ -0,0 +1,107 @@ +. + +/** + * Restore override tests. + * + * @package mod_quiz + * @author 2019 Nathan Nguyen + * @copyright Catalyst IT + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->libdir . "/phpunit/classes/restore_date_testcase.php"); +/** + * Restore override tests. + * + * @package mod_quiz + * @author 2019 Nathan Nguyen + * @copyright Catalyst IT + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class mod_quiz_restore_override_testcase extends restore_date_testcase { + + /** + * Test restore overrides. + */ + public function test_restore_overrides() { + global $DB, $USER; + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(); + $quizgen = $this->getDataGenerator()->get_plugin_generator('mod_quiz'); + $quiz = $quizgen->create_instance(['course' => $course->id]); + + $group1 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); + $group2 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); + + $now = 100; + + // Group overrides. + $groupoverride1 = (object)[ + 'quiz' => $quiz->id, + 'groupid' => $group1->id, + 'timeopen' => $now, + 'timeclose' => $now + 20 + ]; + $DB->insert_record('quiz_overrides', $groupoverride1); + + $groupoverride2 = (object)[ + 'quiz' => $quiz->id, + 'groupid' => $group2->id, + 'timeopen' => $now, + 'timeclose' => $now + 40 + ]; + $DB->insert_record('quiz_overrides', $groupoverride2); + + // Current quiz overrides. + $overrides = $DB->get_records('quiz_overrides', ['quiz' => $quiz->id]); + $this->assertEquals(2, count($overrides)); + + // User Override. + $useroverride = (object)[ + 'quiz' => $quiz->id, + 'userid' => $USER->id, + 'sortorder' => 1, + 'timeopen' => 100, + 'timeclose' => 200 + ]; + $DB->insert_record('quiz_overrides', $useroverride); + + // Current quiz overrides. + $overrides = $DB->get_records('quiz_overrides', ['quiz' => $quiz->id]); + $this->assertEquals(3, count($overrides)); + + // Back up and restore including group info and user info. + set_config('backup_general_groups', 1, 'backup'); + $newcourseid = $this->backup_and_restore($course); + $newquiz = $DB->get_record('quiz', ['course' => $newcourseid]); + $overrides = $DB->get_records('quiz_overrides', ['quiz' => $newquiz->id]); + // 2 groups overrides and 1 user override. + $this->assertEquals(3, count($overrides)); + + // Back up and restore with user info and without group info. + set_config('backup_general_groups', 0, 'backup'); + $newcourseid = $this->backup_and_restore($course); + $newquiz = $DB->get_record('quiz', ['course' => $newcourseid]); + $overrides = $DB->get_records('quiz_overrides', ['quiz' => $newquiz->id]); + // 1 user override. + $this->assertEquals(1, count($overrides)); + } +} diff --git a/mod/quiz/version.php b/mod/quiz/version.php index 496ac21158b..16ffa78e1c6 100644 --- a/mod/quiz/version.php +++ b/mod/quiz/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2018120300; +$plugin->version = 2018120301; $plugin->requires = 2018112800; $plugin->component = 'mod_quiz'; $plugin->cron = 60; From 5a1de3de31cba549ce13be06734cee56abd01b57 Mon Sep 17 00:00:00 2001 From: Nathan Nguyen Date: Mon, 24 Jun 2019 16:19:44 +1000 Subject: [PATCH 2/2] MDL-65555 mod_lesson: fix group override backup and restore --- .../backup/moodle2/backup_lesson_stepslib.php | 6 + .../moodle2/restore_lesson_stepslib.php | 5 + mod/lesson/db/upgrade.php | 7 ++ mod/lesson/tests/restore_override_test.php | 105 ++++++++++++++++++ mod/lesson/version.php | 2 +- 5 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 mod/lesson/tests/restore_override_test.php diff --git a/mod/lesson/backup/moodle2/backup_lesson_stepslib.php b/mod/lesson/backup/moodle2/backup_lesson_stepslib.php index 388d55d9a46..a9a0e14a8d0 100644 --- a/mod/lesson/backup/moodle2/backup_lesson_stepslib.php +++ b/mod/lesson/backup/moodle2/backup_lesson_stepslib.php @@ -180,6 +180,12 @@ class backup_lesson_activity_structure_step extends backup_activity_structure_st $overrideparams['userid'] = backup_helper::is_sqlparam(null); // Without userinfo, skip user overrides. } + // Skip group overrides if not including groups. + $groupinfo = $this->get_setting_value('groups'); + if (!$groupinfo) { + $overrideparams['groupid'] = backup_helper::is_sqlparam(null); + } + $override->set_source_table('lesson_overrides', $overrideparams); // Annotate the user id's where required. diff --git a/mod/lesson/backup/moodle2/restore_lesson_stepslib.php b/mod/lesson/backup/moodle2/restore_lesson_stepslib.php index d4217296a14..114fff6f1a4 100644 --- a/mod/lesson/backup/moodle2/restore_lesson_stepslib.php +++ b/mod/lesson/backup/moodle2/restore_lesson_stepslib.php @@ -220,6 +220,11 @@ class restore_lesson_activity_structure_step extends restore_activity_structure_ $data->groupid = $this->get_mappingid('group', $data->groupid); } + // Skip if there is no user and no group data. + if (empty($data->userid) && empty($data->groupid)) { + return; + } + $data->available = $this->apply_date_offset($data->available); $data->deadline = $this->apply_date_offset($data->deadline); diff --git a/mod/lesson/db/upgrade.php b/mod/lesson/db/upgrade.php index 16657f5d3ef..41e0e88c5ed 100644 --- a/mod/lesson/db/upgrade.php +++ b/mod/lesson/db/upgrade.php @@ -104,6 +104,13 @@ function xmldb_lesson_upgrade($oldversion) { upgrade_mod_savepoint(true, 2017051501, 'lesson'); } + if ($oldversion < 2018120301) { + // Delete orphaned group overrides. + $DB->delete_records_select('lesson_overrides', 'groupid = 0 AND userid IS NULL'); + + upgrade_mod_savepoint(true, 2018120301, 'lesson'); + } + // Automatically generated Moodle v3.4.0 release upgrade line. // Put any upgrade step following this. diff --git a/mod/lesson/tests/restore_override_test.php b/mod/lesson/tests/restore_override_test.php new file mode 100644 index 00000000000..b3ff0c60035 --- /dev/null +++ b/mod/lesson/tests/restore_override_test.php @@ -0,0 +1,105 @@ +. + +/** + * Restore override tests. + * + * @package mod_lesson + * @author 2019 Nathan Nguyen + * @copyright Catalyst IT + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->libdir . "/phpunit/classes/restore_date_testcase.php"); +/** + * Restore override tests. + * + * @package mod_lesson + * @author 2019 Nathan Nguyen + * @copyright Catalyst IT + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class mod_lesson_restore_override_testcase extends restore_date_testcase { + + /** + * Test restore overrides. + */ + public function test_restore_overrides() { + global $DB, $USER; + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(); + $lessongen = $this->getDataGenerator()->get_plugin_generator('mod_lesson'); + $lesson = $lessongen->create_instance(['course' => $course->id]); + + $group1 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); + $group2 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); + + $now = 100; + $groupoverride1 = (object)[ + 'lessonid' => $lesson->id, + 'groupid' => $group1->id, + 'available' => $now, + 'deadline' => $now + 20 + ]; + $DB->insert_record('lesson_overrides', $groupoverride1); + + $groupoverride2 = (object)[ + 'lessonid' => $lesson->id, + 'groupid' => $group2->id, + 'available' => $now, + 'deadline' => $now + 40 + ]; + $DB->insert_record('lesson_overrides', $groupoverride2); + + // Current quiz overrides. + $overrides = $DB->get_records('lesson_overrides', ['lessonid' => $lesson->id]); + $this->assertEquals(2, count($overrides)); + + // User override. + $useroverride = (object)[ + 'lessonid' => $lesson->id, + 'userid' => $USER->id, + 'sortorder' => 1, + 'available' => 100, + 'deadline' => 200 + ]; + $DB->insert_record('lesson_overrides', $useroverride); + + // Current quiz overrides. + $overrides = $DB->get_records('lesson_overrides', ['lessonid' => $lesson->id]); + $this->assertEquals(3, count($overrides)); + + // Back up and restore including group info and user info. + set_config('backup_general_groups', 1, 'backup'); + $newcourseid = $this->backup_and_restore($course); + $newquiz = $DB->get_record('lesson', ['course' => $newcourseid]); + $overrides = $DB->get_records('lesson_overrides', ['lessonid' => $newquiz->id]); + // 2 groups overrides and 1 user override. + $this->assertEquals(3, count($overrides)); + + // Back up and restore with user info and without group info. + set_config('backup_general_groups', 0, 'backup'); + $newcourseid = $this->backup_and_restore($course); + $newquiz = $DB->get_record('lesson', ['course' => $newcourseid]); + $overrides = $DB->get_records('lesson_overrides', ['lessonid' => $newquiz->id]); + // 1 user override. + $this->assertEquals(1, count($overrides)); + } +} diff --git a/mod/lesson/version.php b/mod/lesson/version.php index 8ba5181f33d..88f64f7ae33 100644 --- a/mod/lesson/version.php +++ b/mod/lesson/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2018120300; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2018120301; // The current module version (Date: YYYYMMDDXX) $plugin->requires = 2018112800; // Requires this Moodle version $plugin->component = 'mod_lesson'; // Full name of the plugin (used for diagnostics) $plugin->cron = 0;