. /** * List of deprecated mod_quiz functions. * * @package mod_quiz * @copyright 2021 Shamim Rezaie * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ use mod_quiz\access_manager; use mod_quiz\quiz_settings; use mod_quiz\task\update_overdue_attempts; /** * @deprecated since Moodle 3.11 */ function quiz_get_completion_state() { $completionclass = \mod_quiz\completion\custom_completion::class; throw new coding_exception(__FUNCTION__ . "() has been removed, please use the '{$completionclass}' class instead"); } /** * @deprecated since Moodle 4.0 */ function quiz_retrieve_tags_for_slot_ids() { throw new coding_exception(__FUNCTION__ . '() has been removed.'); } /** * Verify that the question exists, and the user has permission to use it. * * @deprecated in 4.1 use mod_quiz\structure::has_use_capability(...) instead. * * @param stdClass $quiz the quiz settings. * @param int $slot which question in the quiz to test. * @return bool whether the user can use this question. */ function quiz_has_question_use($quiz, $slot) { global $DB; debugging('Deprecated. Please use mod_quiz\structure::has_use_capability instead.'); $sql = 'SELECT q.* FROM {quiz_slots} slot JOIN {question_references} qre ON qre.itemid = slot.id JOIN {question_bank_entries} qbe ON qbe.id = qre.questionbankentryid JOIN {question_versions} qve ON qve.questionbankentryid = qbe.id JOIN {question} q ON q.id = qve.questionid WHERE slot.quizid = ? AND slot.slot = ? AND qre.component = ? AND qre.questionarea = ?'; $question = $DB->get_record_sql($sql, [$quiz->id, $slot, 'mod_quiz', 'slot']); if (!$question) { return false; } return question_has_capability_on($question, 'use'); } /** * @copyright 2012 the Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @deprecated since Moodle 4.2. Code moved to mod_quiz\task\update_overdue_attempts. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ class mod_quiz_overdue_attempt_updater { /** * @deprecated since Moodle 4.2. Code moved to mod_quiz\task\update_overdue_attempts. that was. */ public function update_overdue_attempts($timenow, $processto) { debugging('mod_quiz_overdue_attempt_updater has been deprecated. The code wsa moved to ' . 'mod_quiz\task\update_overdue_attempts.'); return (new update_overdue_attempts())->update_all_overdue_attempts((int) $timenow, (int) $processto); } /** * @deprecated since Moodle 4.2. Code moved to mod_quiz\task\update_overdue_attempts. */ public function get_list_of_overdue_attempts($processto) { debugging('mod_quiz_overdue_attempt_updater has been deprecated. The code wsa moved to ' . 'mod_quiz\task\update_overdue_attempts.'); return (new update_overdue_attempts())->get_list_of_overdue_attempts((int) $processto); } } /** * Class for quiz exceptions. Just saves a couple of arguments on the * constructor for a moodle_exception. * * @copyright 2008 Tim Hunt * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since Moodle 2.0 * @deprecated since Moodle 4.2. Please just use moodle_exception. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ class moodle_quiz_exception extends moodle_exception { /** * Constructor. * * @param quiz_settings $quizobj the quiz the error relates to. * @param string $errorcode The name of the string from error.php to print. * @param mixed $a Extra words and phrases that might be required in the error string. * @param string $link The url where the user will be prompted to continue. * If no url is provided the user will be directed to the site index page. * @param string|null $debuginfo optional debugging information. * @deprecated since Moodle 4.2. Please just use moodle_exception. */ public function __construct($quizobj, $errorcode, $a = null, $link = '', $debuginfo = null) { debugging('Class moodle_quiz_exception is deprecated. ' . 'Please use a standard moodle_exception instead.', DEBUG_DEVELOPER); if (!$link) { $link = $quizobj->view_url(); } parent::__construct($errorcode, 'quiz', $link, $a, $debuginfo); } } /** * Update the sumgrades field of the quiz. This needs to be called whenever * the grading structure of the quiz is changed. For example if a question is * added or removed, or a question weight is changed. * * You should call {@see quiz_delete_previews()} before you call this function. * * @param stdClass $quiz a quiz. * @deprecated since Moodle 4.2. Please use grade_calculator::recompute_quiz_sumgrades. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ function quiz_update_sumgrades($quiz) { debugging('quiz_update_sumgrades is deprecated. ' . 'Please use a standard grade_calculator::recompute_quiz_sumgrades instead.', DEBUG_DEVELOPER); quiz_settings::create($quiz->id)->get_grade_calculator()->recompute_quiz_sumgrades(); } /** * Update the sumgrades field of the attempts at a quiz. * * @param stdClass $quiz a quiz. * @deprecated since Moodle 4.2. Please use grade_calculator::recompute_all_attempt_sumgrades. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ function quiz_update_all_attempt_sumgrades($quiz) { debugging('quiz_update_all_attempt_sumgrades is deprecated. ' . 'Please use a standard grade_calculator::recompute_all_attempt_sumgrades instead.', DEBUG_DEVELOPER); quiz_settings::create($quiz->id)->get_grade_calculator()->recompute_all_attempt_sumgrades(); } /** * Update the final grade at this quiz for all students. * * This function is equivalent to calling quiz_save_best_grade for all * users, but much more efficient. * * @param stdClass $quiz the quiz settings. * @deprecated since Moodle 4.2. Please use grade_calculator::recompute_all_final_grades. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ function quiz_update_all_final_grades($quiz) { debugging('quiz_update_all_final_grades is deprecated. ' . 'Please use a standard grade_calculator::recompute_all_final_grades instead.', DEBUG_DEVELOPER); quiz_settings::create($quiz->id)->get_grade_calculator()->recompute_all_final_grades(); } /** * The quiz grade is the maximum that student's results are marked out of. When it * changes, the corresponding data in quiz_grades and quiz_feedback needs to be * rescaled. After calling this function, you probably need to call * quiz_update_all_attempt_sumgrades, grade_calculator::recompute_all_final_grades(); * quiz_update_grades. (At least, that is what this comment has said for years, but * it seems to call recompute_all_final_grades itself.) * * @param float $newgrade the new maximum grade for the quiz. * @param stdClass $quiz the quiz we are updating. Passed by reference so its * grade field can be updated too. * @return bool indicating success or failure. * @deprecated since Moodle 4.2. Please use grade_calculator::update_quiz_maximum_grade. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ function quiz_set_grade($newgrade, $quiz) { debugging('quiz_set_grade is deprecated. ' . 'Please use a standard grade_calculator::update_quiz_maximum_grade instead.', DEBUG_DEVELOPER); quiz_settings::create($quiz->id)->get_grade_calculator()->update_quiz_maximum_grade($newgrade); return true; } /** * Save the overall grade for a user at a quiz in the quiz_grades table * * @param stdClass $quiz The quiz for which the best grade is to be calculated and then saved. * @param int $userid The userid to calculate the grade for. Defaults to the current user. * @param array $attempts The attempts of this user. Useful if you are * looping through many users. Attempts can be fetched in one master query to * avoid repeated querying. * @return bool Indicates success or failure. * @deprecated since Moodle 4.2. Please use grade_calculator::update_quiz_maximum_grade. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ function quiz_save_best_grade($quiz, $userid = null, $attempts = []) { debugging('quiz_save_best_grade is deprecated. ' . 'Please use a standard grade_calculator::recompute_final_grade instead.', DEBUG_DEVELOPER); quiz_settings::create($quiz->id)->get_grade_calculator()->recompute_final_grade($userid, $attempts); return true; } /** * Calculate the overall grade for a quiz given a number of attempts by a particular user. * * @param stdClass $quiz the quiz settings object. * @param array $attempts an array of all the user's attempts at this quiz in order. * @return float the overall grade * @deprecated since Moodle 4.2. No direct replacement. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ function quiz_calculate_best_grade($quiz, $attempts) { debugging('quiz_calculate_best_grade is deprecated with no direct replacement. It was only used ' . 'in one place in the quiz code so this logic is now private to grade_calculator.', DEBUG_DEVELOPER); switch ($quiz->grademethod) { case QUIZ_ATTEMPTFIRST: $firstattempt = reset($attempts); return $firstattempt->sumgrades; case QUIZ_ATTEMPTLAST: $lastattempt = end($attempts); return $lastattempt->sumgrades; case QUIZ_GRADEAVERAGE: $sum = 0; $count = 0; foreach ($attempts as $attempt) { if (!is_null($attempt->sumgrades)) { $sum += $attempt->sumgrades; $count++; } } if ($count == 0) { return null; } return $sum / $count; case QUIZ_GRADEHIGHEST: default: $max = null; foreach ($attempts as $attempt) { if ($attempt->sumgrades > $max) { $max = $attempt->sumgrades; } } return $max; } } /** * Return the attempt with the best grade for a quiz * * Which attempt is the best depends on $quiz->grademethod. If the grade * method is GRADEAVERAGE then this function simply returns the last attempt. * @return stdClass The attempt with the best grade * @param stdClass $quiz The quiz for which the best grade is to be calculated * @param array $attempts An array of all the attempts of the user at the quiz * @deprecated since Moodle 4.2. No direct replacement. * @todo MDL-76612 Final deprecation in Moodle 4.6 */ function quiz_calculate_best_attempt($quiz, $attempts) { debugging('quiz_calculate_best_attempt is deprecated with no direct replacement. ' . 'It was not used anywhere!', DEBUG_DEVELOPER); switch ($quiz->grademethod) { case QUIZ_ATTEMPTFIRST: foreach ($attempts as $attempt) { return $attempt; } break; case QUIZ_GRADEAVERAGE: // We need to do something with it. case QUIZ_ATTEMPTLAST: foreach ($attempts as $attempt) { $final = $attempt; } return $final; default: case QUIZ_GRADEHIGHEST: $max = -1; foreach ($attempts as $attempt) { if ($attempt->sumgrades > $max) { $max = $attempt->sumgrades; $maxattempt = $attempt; } } return $maxattempt; } } /** * Deletes a quiz override from the database and clears any corresponding calendar events * * @deprecated since Moodle 4.4 * @todo MDL-80944 Final deprecation in Moodle 4.8 * @param stdClass $quiz The quiz object. * @param int $overrideid The id of the override being deleted * @param bool $log Whether to trigger logs. * @return bool true on success */ #[\core\attribute\deprecated('override_manager::delete_override_by_id', since: '4.4')] function quiz_delete_override($quiz, $overrideid, $log = true) { \core\deprecation::emit_deprecation_if_present(__FUNCTION__); $quizsettings = quiz_settings::create($quiz->id); $quizsettings->get_override_manager()->delete_overrides_by_id( ids: [$overrideid], shouldlog: $log, ); return true; } /** * Deletes all quiz overrides from the database and clears any corresponding calendar events * * @deprecated since Moodle 4.4 * @todo MDL-80944 Final deprecation in Moodle 4.8 * @param stdClass $quiz The quiz object. * @param bool $log Whether to trigger logs. */ #[\core\attribute\deprecated('override_manager::delete_all_overrides', since: '4.4')] function quiz_delete_all_overrides($quiz, $log = true) { \core\deprecation::emit_deprecation_if_present(__FUNCTION__); $quizsettings = quiz_settings::create($quiz->id); $quizsettings->get_override_manager()->delete_all_overrides(shouldlog: $log); }