diff --git a/mod/quiz/editrandom.php b/mod/quiz/editrandom.php index b0412d16e03..416f172ef71 100644 --- a/mod/quiz/editrandom.php +++ b/mod/quiz/editrandom.php @@ -23,6 +23,7 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ +use core_question\question_reference_manager; use mod_quiz\quiz_settings; use mod_quiz\question\bank\random_question_view; @@ -56,6 +57,7 @@ $PAGE->add_body_class('limitedwidth'); $setreference = $DB->get_record('question_set_references', ['itemid' => $slot->id, 'component' => 'mod_quiz', 'questionarea' => 'slot']); $filterconditions = json_decode($setreference->filtercondition, true); +$filterconditions = question_reference_manager::convert_legacy_set_reference_filter_condition($filterconditions); $params = $filterconditions; $params['cmid'] = $cm->id; diff --git a/question/classes/question_reference_manager.php b/question/classes/question_reference_manager.php index f3bd6c5c1ed..284e8e50e6a 100644 --- a/question/classes/question_reference_manager.php +++ b/question/classes/question_reference_manager.php @@ -86,6 +86,7 @@ class question_reference_manager { * @return array Post-4.3 filter condition. */ public static function convert_legacy_set_reference_filter_condition(array $filtercondition): array { + global $DB; if (!isset($filtercondition['filter'])) { $filtercondition['filter'] = []; @@ -96,8 +97,6 @@ class question_reference_manager { 'values' => [$filtercondition['questioncategoryid']], 'filteroptions' => ['includesubcategories' => $filtercondition['includingsubcategories']], ]; - unset($filtercondition['questioncategoryid']); - unset($filtercondition['includingsubcategories']); } // Tag filters. @@ -115,10 +114,20 @@ class question_reference_manager { unset($filtercondition['tags']); } // Add additional default properties to the filtercondition. + if (isset($filtercondition['questioncategoryid'])) { + $category = $DB->get_record('question_categories', ['id' => $filtercondition['questioncategoryid']]); + if ($category) { + $filtercondition['cat'] = "{$category->id},{$category->contextid}"; + } else { + $filtercondition['cat'] = ''; + } + } $filtercondition['tabname'] = 'questions'; $filtercondition['qpage'] = 0; $filtercondition['qperpage'] = 100; $filtercondition['jointype'] = \core\output\datafilter::JOINTYPE_ALL; + unset($filtercondition['questioncategoryid']); + unset($filtercondition['includingsubcategories']); } else if (isset($filtercondition['filter']['category']['includesubcategories'])) { $filtercondition['filter']['category']['filteroptions'] = ['includesubcategories' => $filtercondition['filter']['category']['includesubcategories']]; diff --git a/question/tests/legacy_question_set_conversion_test.php b/question/tests/legacy_question_set_conversion_test.php new file mode 100644 index 00000000000..7a872975021 --- /dev/null +++ b/question/tests/legacy_question_set_conversion_test.php @@ -0,0 +1,78 @@ +. + +namespace core_question; + +/** + * Test the conversion of legacy random question sets into the newer format. + * + * @package core_question + * @copyright 2025 onwards Catalyst IT {@link http://www.catalyst-eu.net/} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @author Conn Warwicker + * @covers \core_question\question_reference_manager + */ +final class legacy_question_set_conversion_test extends \advanced_testcase { + + /** + * Test the conversion of the old formatted `filtercondition` value to the newer format. + * @covers \core_question\question_reference_manager::convert_legacy_set_reference_filter_condition + * @return void + */ + public function test_legacy_question_set_conversion(): void { + + $this->resetAfterTest(false); + + // Test conversion without a valid question category. + $old = [ + 'questioncategoryid' => 123, + 'includingsubcategories' => 0, + ]; + + $new = question_reference_manager::convert_legacy_set_reference_filter_condition($old); + $expected = [ + 'filter' => [ + 'category' => [ + 'jointype' => 1, + 'values' => [123], + 'filteroptions' => [ + 'includesubcategories' => 0, + ], + ], + ], + 'cat' => '', + 'tabname' => 'questions', + 'qpage' => 0, + 'qperpage' => 100, + 'jointype' => 2, + ]; + $this->assertEquals($new, $expected); + + // Test conversion with a valid question category. + // Generate a question category. + $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question'); + $cat = $questiongenerator->create_question_category(); + + // Add the valid category into the arrays. + $old['questioncategoryid'] = $cat->id; + $expected['cat'] = "{$cat->id},{$cat->contextid}"; + $expected['filter']['category']['values'] = [$cat->id]; + $new = question_reference_manager::convert_legacy_set_reference_filter_condition($old); + $this->assertEquals($new, $expected); + + } + +}