diff --git a/.upgradenotes/MDL-78091-2025022518040058.yml b/.upgradenotes/MDL-78091-2025022518040058.yml new file mode 100644 index 00000000000..568baf3f3dd --- /dev/null +++ b/.upgradenotes/MDL-78091-2025022518040058.yml @@ -0,0 +1,11 @@ +issueNumber: MDL-78091 +notes: + mod_quiz: + - message: >- + Final deprecation of: + - mod_quiz\form\add_random_form::class + - mod_quiz\local\structure\slot_random::set_tags() + - mod_quiz\local\structure\slot_random::set_tags_by_id() + - const quiz_statistics\calculator::TIME_TO_CACHE + - quiz_add_random_questions() + type: removed diff --git a/mod/quiz/classes/form/add_random_form.php b/mod/quiz/classes/form/add_random_form.php deleted file mode 100644 index e9336ea117e..00000000000 --- a/mod/quiz/classes/form/add_random_form.php +++ /dev/null @@ -1,172 +0,0 @@ -. - -namespace mod_quiz\form; - -use core\check\performance\debugging; -use core_tag_tag; -use moodleform; - -defined('MOODLE_INTERNAL') || die(); - -require_once($CFG->libdir.'/formslib.php'); - - -/** - * The add random questions form. - * - * @package mod_quiz - * @copyright 1999 onwards Martin Dougiamas and others {@link http://moodle.com} - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - * @deprecated Moodle 4.3 MDL-72321. This form is new generated in a modal with mod_quiz/add_random_question_form.mustache - * @todo Final deprecation in Moodle 4.7 MDL-78091 - */ -class add_random_form extends moodleform { - - /** - * Deprecated. - * - * @return void - * @deprecated Moodle 4.3 MDL-72321 - * @todo Final deprecation in Moodle 4.7 MDL-78091 - */ - protected function definition() { - debugging( - 'add_random_form is deprecated. Please use mod_quiz/add_random_question_form.mustache instead.', - DEBUG_DEVELOPER - ); - global $OUTPUT, $PAGE, $CFG; - - $mform = $this->_form; - $mform->setDisableShortforms(); - - $contexts = $this->_customdata['contexts']; - $usablecontexts = $contexts->having_cap('moodle/question:useall'); - - // Random from existing category section. - $mform->addElement('header', 'existingcategoryheader', - get_string('randomfromexistingcategory', 'quiz')); - - $mform->addElement('questioncategory', 'category', get_string('category'), - ['contexts' => $usablecontexts, 'top' => true]); - $mform->setDefault('category', $this->_customdata['cat']); - - $mform->addElement('checkbox', 'includesubcategories', '', get_string('recurse', 'quiz')); - - $tops = question_get_top_categories_for_contexts(array_column($contexts->all(), 'id')); - $mform->hideIf('includesubcategories', 'category', 'in', $tops); - - if ($CFG->usetags) { - $tagstrings = []; - $tags = core_tag_tag::get_tags_by_area_in_contexts('core_question', 'question', $usablecontexts); - foreach ($tags as $tag) { - $tagstrings["{$tag->id},{$tag->name}"] = $tag->name; - } - $options = [ - 'multiple' => true, - 'noselectionstring' => get_string('anytags', 'quiz'), - ]; - $mform->addElement('autocomplete', 'fromtags', get_string('randomquestiontags', 'mod_quiz'), $tagstrings, $options); - $mform->addHelpButton('fromtags', 'randomquestiontags', 'mod_quiz'); - } - - // TODO: in the past, the drop-down used to only show sensible choices for - // number of questions to add. That is, if the currently selected filter - // only matched 9 questions (not already in the quiz), then the drop-down would - // only offer choices 1..9. This nice UI hint got lost when the UI became Ajax-y. - // We should add it back. - $mform->addElement('select', 'numbertoadd', get_string('randomnumber', 'quiz'), - $this->get_number_of_questions_to_add_choices()); - - $previewhtml = $OUTPUT->render_from_template('mod_quiz/random_question_form_preview', []); - $mform->addElement('html', $previewhtml); - - $mform->addElement('submit', 'existingcategory', get_string('addrandomquestion', 'quiz')); - - // If the manage categories plugins is enabled, add the elements to create a new category in the form. - if (\core\plugininfo\qbank::is_plugin_enabled(\qbank_managecategories\helper::PLUGINNAME)) { - // Random from a new category section. - $mform->addElement('header', 'newcategoryheader', - get_string('randomquestionusinganewcategory', 'quiz')); - - $mform->addElement('text', 'name', get_string('name'), 'maxlength="254" size="50"'); - $mform->setType('name', PARAM_TEXT); - - $mform->addElement('questioncategory', 'parent', get_string('parentcategory', 'question'), - ['contexts' => $usablecontexts, 'top' => true]); - $mform->addHelpButton('parent', 'parentcategory', 'question'); - - $mform->addElement('submit', 'newcategory', - get_string('createcategoryandaddrandomquestion', 'quiz')); - } - - // Cancel button. - $mform->addElement('cancel'); - $mform->closeHeaderBefore('cancel'); - - $mform->addElement('hidden', 'addonpage', 0, 'id="rform_qpage"'); - $mform->setType('addonpage', PARAM_SEQUENCE); - $mform->addElement('hidden', 'cmid', 0); - $mform->setType('cmid', PARAM_INT); - $mform->addElement('hidden', 'returnurl', 0); - $mform->setType('returnurl', PARAM_LOCALURL); - - // Add the javascript required to enhance this mform. - $PAGE->requires->js_call_amd('mod_quiz/add_random_form', 'init', [ - $mform->getAttribute('id'), - $contexts->lowest()->id, - $tops, - $CFG->usetags - ]); - } - - /** - * Deprecated. - * - * @param array $fromform - * @param array $files - * @return array - * @deprecated Moodle 4.3 MDL-72321 - * @todo Final deprecation in Moodle 4.7 MDL-78091 - */ - public function validation($fromform, $files) { - debugging( - 'add_random_form is deprecated. Please use mod_quiz/add_random_question_form.mustache instead.', - DEBUG_DEVELOPER - ); - $errors = parent::validation($fromform, $files); - - if (!empty($fromform['newcategory']) && trim($fromform['name']) == '') { - $errors['name'] = get_string('categorynamecantbeblank', 'question'); - } - - return $errors; - } - - /** - * Return an arbitrary array for the dropdown menu - * - * @param int $maxrand - * @return array of integers [1, 2, ..., 100] (or to the smaller of $maxrand and 100.) - */ - private function get_number_of_questions_to_add_choices($maxrand = 100) { - $randomcount = []; - for ($i = 1; $i <= min(100, $maxrand); $i++) { - $randomcount[$i] = $i; - } - return $randomcount; - } -} diff --git a/mod/quiz/classes/local/structure/slot_random.php b/mod/quiz/classes/local/structure/slot_random.php index a743f6eaaff..f4322d0f824 100644 --- a/mod/quiz/classes/local/structure/slot_random.php +++ b/mod/quiz/classes/local/structure/slot_random.php @@ -109,37 +109,19 @@ class slot_random { } /** - * Set some tags for this quiz slot. - * - * @param \core_tag_tag[] $tags - * * @deprecated since Moodle 4.3 - * @todo Final deprecation on Moodle 4.7 MDL-78091 */ + #[\core\attribute\deprecated(null, since: '4.3', mdl: 'MDL-72321', final: true)] public function set_tags($tags) { - debugging('Method set_tags() is deprecated, ' . - 'please do not use this function.', DEBUG_DEVELOPER); - $this->tags = []; - foreach ($tags as $tag) { - // We use $tag->id as the key for the array so not only it handles duplicates of the same tag being given, - // but also it is consistent with the behaviour of set_tags_by_id() below. - $this->tags[$tag->id] = $tag; - } + \core\deprecation::emit_deprecation_if_present([self::class, __FUNCTION__]); } /** - * Set some tags for this quiz slot. This function uses tag ids to find tags. - * - * @param int[] $tagids * @deprecated since Moodle 4.3 - * @todo Final deprecation on Moodle 4.7 MDL-78091 */ + #[\core\attribute\deprecated(null, since: '4.3', mdl: 'MDL-72321', final: true)] public function set_tags_by_id($tagids) { - debugging( - 'Method set_tags_by_id() is deprecated, please do not use this function.', - DEBUG_DEVELOPER - ); - $this->tags = \core_tag_tag::get_bulk($tagids, 'id, name'); + \core\deprecation::emit_deprecation_if_present([self::class, __FUNCTION__]); } /** diff --git a/mod/quiz/deprecatedlib.php b/mod/quiz/deprecatedlib.php index e0a6af910a7..1a9b5548596 100644 --- a/mod/quiz/deprecatedlib.php +++ b/mod/quiz/deprecatedlib.php @@ -313,3 +313,11 @@ function quiz_delete_override($quiz, $overrideid, $log = true) { function quiz_delete_all_overrides($quiz, $log = true) { \core\deprecation::emit_deprecation_if_present(__FUNCTION__); } + +/** + * @deprecated Since Moodle 4.3 MDL-72321 + */ +#[\core\attribute\deprecated('mod_quiz\structure::add_random_questions()', since: '4.3', mdl: 'MDL-72321', final: true)] +function quiz_add_random_questions(stdClass $quiz, int $addonpage, int $categoryid, int $number): void { + \core\deprecation::emit_deprecation_if_present(__FUNCTION__); +} diff --git a/mod/quiz/edit.php b/mod/quiz/edit.php index 39deda908f3..3258abefa8a 100644 --- a/mod/quiz/edit.php +++ b/mod/quiz/edit.php @@ -139,7 +139,18 @@ if ((optional_param('addrandom', false, PARAM_BOOL)) && confirm_sesskey()) { $addonpage = optional_param('addonpage', 0, PARAM_INT); $categoryid = required_param('categoryid', PARAM_INT); $randomcount = required_param('randomcount', PARAM_INT); - quiz_add_random_questions($quiz, $addonpage, $categoryid, $randomcount, $recurse); + + $filtercondition = [ + 'filter' => [ + 'category' => [ + 'jointype' => \core_question\local\bank\condition::JOINTYPE_DEFAULT, + 'values' => [$categoryid], + 'filteroptions' => ['includesubcategories' => $recurse], + ], + ], + ]; + + $structure->add_random_questions($addonpage, $randomcount, $filtercondition); quiz_delete_previews($quiz); $gradecalculator->recompute_quiz_sumgrades(); diff --git a/mod/quiz/locallib.php b/mod/quiz/locallib.php index d6464655742..4e20f8b256a 100644 --- a/mod/quiz/locallib.php +++ b/mod/quiz/locallib.php @@ -37,6 +37,7 @@ require_once($CFG->libdir . '/questionlib.php'); use core\di; use core\hook; +use core\exception\coding_exception; use core_question\local\bank\condition; use mod_quiz\access_manager; use mod_quiz\event\attempt_submitted; @@ -1758,7 +1759,8 @@ function quiz_add_quiz_question($questionid, $quiz, $page = 0, $maxmark = null) $questiontype = $DB->get_field('question', 'qtype', ['id' => $questionid]); if ($questiontype == 'random') { throw new coding_exception( - 'Adding "random" questions via quiz_add_quiz_question() is deprecated. Please use quiz_add_random_questions().' + 'Adding "random" questions via quiz_add_quiz_question() is deprecated. '. + 'Please use mod_quiz\structure::add_random_questions().' ); } @@ -1927,34 +1929,6 @@ function quiz_update_section_firstslots($quizid, $direction, $afterslot, $before update_field_with_unique_index('quiz_sections', 'firstslot', $firstslotschanges, ['quizid' => $quizid]); } -/** - * Add a random question to the quiz at a given point. - * @param stdClass $quiz the quiz settings. - * @param int $addonpage the page on which to add the question. - * @param int $categoryid the question category to add the question from. - * @param int $number the number of random questions to add. - * @deprecated Since Moodle 4.3 MDL-72321 - * @todo Final deprecation in Moodle 4.7 MDL-78091 - */ -function quiz_add_random_questions(stdClass $quiz, int $addonpage, int $categoryid, int $number): void { - debugging( - 'quiz_add_random_questions is deprecated. Please use mod_quiz\structure::add_random_questions() instead.', - DEBUG_DEVELOPER - ); - - $settings = quiz_settings::create($quiz->id); - $structure = structure::create_for_quiz($settings); - $structure->add_random_questions($addonpage, $number, [ - 'filter' => [ - 'category' => [ - 'jointype' => condition::JOINTYPE_DEFAULT, - 'values' => [$categoryid], - 'filteroptions' => ['includesubcategories' => false], - ], - ], - ]); -} - /** * Mark the activity completed (if required) and trigger the course_module_viewed event. * diff --git a/mod/quiz/report/statistics/classes/calculator.php b/mod/quiz/report/statistics/classes/calculator.php index e6ea21cd561..1b607b63187 100644 --- a/mod/quiz/report/statistics/classes/calculator.php +++ b/mod/quiz/report/statistics/classes/calculator.php @@ -121,13 +121,6 @@ class calculator { return $quizstats; } - /** - * @var int previously, the time after which statistics are automatically recomputed. - * @deprecated since Moodle 4.3. Use of pre-computed stats is no longer time-limited. - * @todo MDL-78091 Final deprecation in Moodle 4.7 - */ - const TIME_TO_CACHE = 900; // 15 minutes. - /** * Load cached statistics from the database. * diff --git a/question/bank/managecategories/tests/helper_test.php b/question/bank/managecategories/tests/helper_test.php index f502d0f1740..7cda13895b2 100644 --- a/question/bank/managecategories/tests/helper_test.php +++ b/question/bank/managecategories/tests/helper_test.php @@ -119,8 +119,8 @@ final class helper_test extends manage_category_test_base { MUST_EXIST ); - // The following 2 lines have to be after the quiz_add_random_questions() call above. - // Otherwise, quiz_add_random_questions() will to be "smart" and use them instead of creating a new "random" question. + // The following 2 lines have to be after the add_random_questions() call above. + // Otherwise, add_random_questions() will have to be "smart" and use them instead of creating a new "random" question. $q1b = $this->create_question_in_a_category('random', $qcat1->id); $q2c = $this->create_question_in_a_category('random', $qcat2->id);