Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Library code used by quiz cron.
 *
 * @package   mod_quiz
 * @copyright 2012 the Open University
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
> * @todo MDL-76612 delete this file as part of Moodle 4.6 development. */ > * @deprecated This file is no longer required in Moodle 4.2+.
<
defined('MOODLE_INTERNAL') || die();
< require_once($CFG->dirroot . '/mod/quiz/locallib.php'); < < < /** < * This class holds all the code for automatically updating all attempts that have < * gone over their time limit. < * < * @copyright 2012 the Open University < * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later < */ < class mod_quiz_overdue_attempt_updater { < < /** < * Do the processing required. < * @param int $timenow the time to consider as 'now' during the processing. < * @param int $processto only process attempt with timecheckstate longer ago than this. < * @return array with two elements, the number of attempt considered, and how many different quizzes that was. < */ < public function update_overdue_attempts($timenow, $processto) { < global $DB; < < $attemptstoprocess = $this->get_list_of_overdue_attempts($processto); < < $course = null; < $quiz = null; < $cm = null; < < $count = 0; < $quizcount = 0; < foreach ($attemptstoprocess as $attempt) { < try { < < // If we have moved on to a different quiz, fetch the new data. < if (!$quiz || $attempt->quiz != $quiz->id) { < $quiz = $DB->get_record('quiz', array('id' => $attempt->quiz), '*', MUST_EXIST); < $cm = get_coursemodule_from_instance('quiz', $attempt->quiz); < $quizcount += 1; < } < < // If we have moved on to a different course, fetch the new data. < if (!$course || $course->id != $quiz->course) { < $course = $DB->get_record('course', array('id' => $quiz->course), '*', MUST_EXIST); < }
> debugging('This file is no longer required in Moodle 4.2+. Please do not include/require it.', DEBUG_DEVELOPER);
< // Make a specialised version of the quiz settings, with the relevant overrides. < $quizforuser = clone($quiz); < $quizforuser->timeclose = $attempt->usertimeclose; < $quizforuser->timelimit = $attempt->usertimelimit; < < // Trigger any transitions that are required. < $attemptobj = new quiz_attempt($attempt, $quizforuser, $cm, $course); < $attemptobj->handle_if_time_expired($timenow, false); < $count += 1; < < } catch (moodle_exception $e) { < // If an error occurs while processing one attempt, don't let that kill cron. < mtrace("Error while processing attempt {$attempt->id} at {$attempt->quiz} quiz:"); < mtrace($e->getMessage()); < mtrace($e->getTraceAsString()); < // Close down any currently open transactions, otherwise one error < // will stop following DB changes from being committed. < $DB->force_transaction_rollback(); < } < } < < $attemptstoprocess->close(); < return array($count, $quizcount); < } < < /** < * @return moodle_recordset of quiz_attempts that need to be processed because time has < * passed. The array is sorted by courseid then quizid. < */ < public function get_list_of_overdue_attempts($processto) { < global $DB; < < < // SQL to compute timeclose and timelimit for each attempt: < $quizausersql = quiz_get_attempt_usertime_sql( < "iquiza.state IN ('inprogress', 'overdue') AND iquiza.timecheckstate <= :iprocessto"); < < // This query should have all the quiz_attempts columns. < return $DB->get_recordset_sql(" < SELECT quiza.*, < quizauser.usertimeclose, < quizauser.usertimelimit < < FROM {quiz_attempts} quiza < JOIN {quiz} quiz ON quiz.id = quiza.quiz < JOIN ( $quizausersql ) quizauser ON quizauser.id = quiza.id < < WHERE quiza.state IN ('inprogress', 'overdue') < AND quiza.timecheckstate <= :processto < ORDER BY quiz.course, quiza.quiz", < < array('processto' => $processto, 'iprocessto' => $processto)); < } < }
> require_once($CFG->dirroot . '/mod/quiz/locallib.php'); > require_once($CFG->dirroot . '/mod/quiz/deprecatedlib.php');