Merge branch 'MDL-85166_405_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_405_STABLE

This commit is contained in:
Mihail Geshoski
2025-09-25 10:51:42 +08:00
2 changed files with 112 additions and 9 deletions
+10 -9
View File
@@ -782,16 +782,17 @@ function move_question_set_references(int $oldcategoryid, int $newcatgoryid,
if ($delete || $oldcontextid !== $newcontextid) {
$setreferences = $DB->get_recordset('question_set_references', ['questionscontextid' => $oldcontextid]);
foreach ($setreferences as $setreference) {
$filter = json_decode($setreference->filtercondition);
if (isset($filter->questioncategoryid)) {
if ((int)$filter->questioncategoryid === $oldcategoryid) {
$setreference->questionscontextid = $newcontextid;
if ($oldcategoryid !== $newcatgoryid) {
$filter->questioncategoryid = $newcatgoryid;
$setreference->filtercondition = json_encode($filter);
}
$DB->update_record('question_set_references', $setreference);
$filter = json_decode($setreference->filtercondition, true);
if (isset($filter['questioncategoryid'])) {
$filter = question_reference_manager::convert_legacy_set_reference_filter_condition($filter);
}
if ((int)$filter['filter']['category']['values'][0] === $oldcategoryid) {
$setreference->questionscontextid = $newcontextid;
if ($oldcategoryid !== $newcatgoryid) {
$filter['filter']['category']['values'][0] = $newcatgoryid;
$setreference->filtercondition = json_encode($filter);
}
$DB->update_record('question_set_references', $setreference);
}
}
$setreferences->close();
+102
View File
@@ -16,6 +16,8 @@
namespace core;
use core_question\local\bank\question_bank_helper;
use mod_quiz\quiz_settings;
use question_bank;
defined('MOODLE_INTERNAL') || die();
@@ -2437,4 +2439,104 @@ final class questionlib_test extends \advanced_testcase {
$this->assertEquals(2, $nextversion);
}
/**
* Update the context for a set reference, keeping the original category.
*
* @covers ::move_question_set_references()
*/
public function test_move_question_set_references_context(): void {
$this->setAdminUser();
$sitecontext = \context_system::instance();
$topcategory = question_get_top_category($sitecontext->id, true);
$randomcategory = self::getDataGenerator()->get_plugin_generator('core_question')->create_question_category(
['parent' => $topcategory->id],
);
// Create a course with a quiz containing a random question from the system context.
$randomcourse = self::getDataGenerator()->create_course(['shortname' => 'Random']);
$coursecontext = \context_course::instance($randomcourse->id);
$randomquiz = self::getDataGenerator()->get_plugin_generator('mod_quiz')->create_instance(
[
'course' => $randomcourse->id,
'grade' => 100.0,
'sumgrades' => 2,
'layout' => '1,0',
],
);
$randomquizsettings = quiz_settings::create($randomquiz->id);
$structure = $randomquizsettings->get_structure();
$filtercondition = [
'filter' => [
'category' => [
'jointype' => \core_question\local\bank\condition::JOINTYPE_DEFAULT,
'values' => [$randomcategory->id],
'filteroptions' => ['includesubcategories' => true],
],
],
];
$structure->add_random_questions(1, 1, $filtercondition);
$structure = $randomquizsettings->get_structure();
$randomquestion = $structure->get_question_in_slot(1);
$this->assertEquals($randomquestion->contextid, $sitecontext->id);
$this->assertEquals($randomquestion->filtercondition['filter']['category']['values'][0], $randomcategory->id);
move_question_set_references($randomcategory->id, $randomcategory->id, $sitecontext->id, $coursecontext->id);
$structure = $randomquizsettings->get_structure();
$randomquestion = $structure->get_question_in_slot(1);
$this->assertEquals($randomquestion->contextid, $coursecontext->id);
$this->assertEquals($randomquestion->filtercondition['filter']['category']['values'][0], $randomcategory->id);
}
/**
* Update the context and category for a set reference.
*
* @covers ::move_question_set_references()
*/
public function test_move_question_set_references_category(): void {
$this->setAdminUser();
$sitecontext = \context_system::instance();
$sitetopcategory = question_get_top_category($sitecontext->id, true);
// Create a course with a quiz containing a random question from the system context.
$randomcourse = self::getDataGenerator()->create_course(['shortname' => 'Random']);
$coursecontext = \context_course::instance($randomcourse->id);
$coursetopcategory = question_get_top_category($coursecontext->id, true);
$randomquiz = self::getDataGenerator()->get_plugin_generator('mod_quiz')->create_instance(
[
'course' => $randomcourse->id,
'grade' => 100.0,
'sumgrades' => 2,
'layout' => '1,0',
],
);
$randomquizsettings = quiz_settings::create($randomquiz->id);
$structure = $randomquizsettings->get_structure();
$filtercondition = [
'filter' => [
'category' => [
'jointype' => \core_question\local\bank\condition::JOINTYPE_DEFAULT,
'values' => [$sitetopcategory->id],
'filteroptions' => ['includesubcategories' => true],
],
],
];
$structure->add_random_questions(1, 1, $filtercondition);
$structure = $randomquizsettings->get_structure();
$randomquestion = $structure->get_question_in_slot(1);
$this->assertEquals($randomquestion->contextid, $sitecontext->id);
$this->assertEquals($randomquestion->filtercondition['filter']['category']['values'][0], $sitetopcategory->id);
move_question_set_references($sitetopcategory->id, $coursetopcategory->id, $sitecontext->id, $coursecontext->id);
$structure = $randomquizsettings->get_structure();
$randomquestion = $structure->get_question_in_slot(1);
$this->assertEquals($randomquestion->contextid, $coursecontext->id);
$this->assertEquals($randomquestion->filtercondition['filter']['category']['values'][0], $coursetopcategory->id);
}
}