From 29bddab8c853bba03b08b1e338f87206dd3d226d Mon Sep 17 00:00:00 2001 From: Simey Lameze Date: Fri, 22 Feb 2019 06:30:44 +0800 Subject: [PATCH] MDL-64881 mod_workshop: convert cron to scheduled task --- mod/workshop/classes/task/cron_task.php | 88 +++++++++++++++++++++++++ mod/workshop/db/tasks.php | 37 +++++++++++ mod/workshop/lang/en/workshop.php | 1 + mod/workshop/version.php | 2 +- 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 mod/workshop/classes/task/cron_task.php create mode 100644 mod/workshop/db/tasks.php diff --git a/mod/workshop/classes/task/cron_task.php b/mod/workshop/classes/task/cron_task.php new file mode 100644 index 00000000000..cf64925926d --- /dev/null +++ b/mod/workshop/classes/task/cron_task.php @@ -0,0 +1,88 @@ +. + +/** + * A scheduled task for workshop cron. + * + * @package mod_workshop + * @copyright 2019 Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace mod_workshop\task; + +defined('MOODLE_INTERNAL') || die(); + +/** + * The main scheduled task for the workshop. + * + * @package mod_workshop + * @copyright 2019 Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class cron_task extends \core\task\scheduled_task { + + /** + * Get a descriptive name for this task (shown to admins). + * + * @return string + */ + public function get_name() { + return get_string('crontask', 'mod_workshop'); + } + + /** + * Run workshop cron. + */ + public function execute() { + global $CFG, $DB; + + $now = time(); + + mtrace(' processing workshop subplugins ...'); + + // Now when the scheduled allocator had a chance to do its job. + // Check if there are some workshops to switch into the assessment phase. + $workshops = $DB->get_records_select("workshop", + "phase = 20 AND phaseswitchassessment = 1 AND submissionend > 0 AND submissionend < ?", [$now]); + + if (!empty($workshops)) { + mtrace('Processing automatic assessment phase switch in ' . count($workshops) . ' workshop(s) ... ', ''); + require_once($CFG->dirroot . '/mod/workshop/locallib.php'); + foreach ($workshops as $workshop) { + $cm = get_coursemodule_from_instance('workshop', $workshop->id, $workshop->course, false, MUST_EXIST); + $course = $DB->get_record('course', ['id' => $cm->course], '*', MUST_EXIST); + $workshop = new \workshop($workshop, $cm, $course); + $workshop->switch_phase(workshop::PHASE_ASSESSMENT); + + $params = [ + 'objectid' => $workshop->id, + 'context' => $workshop->context, + 'courseid' => $workshop->course->id, + 'other' => [ + 'workshopphase' => $workshop->phase + ] + ]; + $event = \mod_workshop\event\phase_switched::create($params); + $event->trigger(); + + // Disable the automatic switching now so that it is not executed again by accident. + // That can happen if the teacher changes the phase back to the submission one. + $DB->set_field('workshop', 'phaseswitchassessment', 0, ['id' => $workshop->id]); + } + mtrace('done'); + } + } +} diff --git a/mod/workshop/db/tasks.php b/mod/workshop/db/tasks.php new file mode 100644 index 00000000000..9af7246f0a2 --- /dev/null +++ b/mod/workshop/db/tasks.php @@ -0,0 +1,37 @@ +. + +/** + * Definition of workshop scheduled tasks. + * + * @package mod_workshop + * @copyright 2019 Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$tasks = [ + [ + 'classname' => '\mod_workshop\task\cron_task', + 'blocking' => 0, + 'minute' => '*', + 'hour' => '*', + 'day' => '*', + 'month' => '*', + 'dayofweek' => '*' + ] +]; diff --git a/mod/workshop/lang/en/workshop.php b/mod/workshop/lang/en/workshop.php index bb2978a5252..4151e822670 100644 --- a/mod/workshop/lang/en/workshop.php +++ b/mod/workshop/lang/en/workshop.php @@ -94,6 +94,7 @@ $string['configgradinggrade'] = 'Default maximum grade for assessment in worksho $string['configmaxbytes'] = 'Default maximum submission file size for all workshops on the site (subject to course limits and other local settings)'; $string['configstrategy'] = 'Default grading strategy for workshops'; $string['createsubmission'] = 'Start preparing your submission'; +$string['crontask'] = 'Background processing for workshop module'; $string['daysago'] = '{$a} days ago'; $string['daysleft'] = '{$a} days left'; $string['daystoday'] = 'today'; diff --git a/mod/workshop/version.php b/mod/workshop/version.php index 07b8d8077a2..0468fff0eac 100644 --- a/mod/workshop/version.php +++ b/mod/workshop/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2018120300; // The current module version (YYYYMMDDXX) +$plugin->version = 2018120301; // The current module version (YYYYMMDDXX) $plugin->requires = 2018112800; // Requires this Moodle version. $plugin->component = 'mod_workshop'; $plugin->cron = 60; // Give as a chance every minute.