From 337c3fa74cb92a571112f498ae7cf36674b3589c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Mudr=C3=A1k?= Date: Thu, 31 Jan 2013 03:31:57 +0100 Subject: [PATCH] MDL-37781 Allocate workshop submissions without waiting for cron Now we are checking for the need to execute the allocator every time the main view.php is displayed to any user. Previously this was done by cron only. --- .../allocation/scheduled/db/events.php | 40 ++++++++++++++++ mod/workshop/allocation/scheduled/lib.php | 47 +++++++++++++++++++ mod/workshop/allocation/scheduled/version.php | 2 +- 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 mod/workshop/allocation/scheduled/db/events.php diff --git a/mod/workshop/allocation/scheduled/db/events.php b/mod/workshop/allocation/scheduled/db/events.php new file mode 100644 index 00000000000..d9137fc881a --- /dev/null +++ b/mod/workshop/allocation/scheduled/db/events.php @@ -0,0 +1,40 @@ +. + +/** + * Defines event handlers + * + * @package workshopallocation_scheduled + * @subpackage mod_workshop + * @category event + * @copyright 2013 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$handlers = array( + + // The workshop main page is displayed to the user + 'workshop_viewed' => array( + 'handlerfile' => '/mod/workshop/allocation/scheduled/lib.php', + 'handlerfunction' => 'workshopallocation_scheduled_workshop_viewed', + 'schedule' => 'instant', + 'internal' => 1, + ), + +); diff --git a/mod/workshop/allocation/scheduled/lib.php b/mod/workshop/allocation/scheduled/lib.php index 11095a97b58..8809e93def2 100644 --- a/mod/workshop/allocation/scheduled/lib.php +++ b/mod/workshop/allocation/scheduled/lib.php @@ -285,3 +285,50 @@ function workshopallocation_scheduled_cron() { // todo inform the teachers about the results } } + +//////////////////////////////////////////////////////////////////////////////// +// Events API +//////////////////////////////////////////////////////////////////////////////// + +/** + * Handler for the 'workshop_viewed' event + * + * This does the same job as {@link workshopallocation_scheduled_cron()} but for the + * single workshop. The idea is that we do not need to wait forcron to execute. + * Displaying the workshop main view.php can trigger the scheduled allocation, too. + * + * @param stdClass $event event data + * @return bool + */ +function workshopallocation_scheduled_workshop_viewed($event) { + global $DB; + + $workshop = $event->workshop; + $now = time(); + + // Non-expensive check to see if the scheduled allocation can even happen. + if ($workshop->phase == workshop::PHASE_SUBMISSION and $workshop->submissionend > 0 and $workshop->submissionend < $now) { + + // Make sure the scheduled allocation has been configured for this workshop, that it has not + // been executed yet and that the passed workshop record is still valid. + $sql = "SELECT a.id + FROM {workshopallocation_scheduled} a + JOIN {workshop} w ON a.workshopid = w.id + WHERE w.id = :workshopid + AND a.enabled = 1 + AND w.phase = :phase + AND w.submissionend > 0 + AND w.submissionend < :now + AND (a.timeallocated IS NULL OR a.timeallocated < w.submissionend)"; + $params = array('workshopid' => $workshop->id, 'phase' => workshop::PHASE_SUBMISSION, 'now' => $now); + + if ($DB->record_exists_sql($sql, $params)) { + // Allocate submissions for assessments. + $allocator = $workshop->allocator_instance('scheduled'); + $result = $allocator->execute(); + // todo inform the teachers about the results + } + } + + return true; +} diff --git a/mod/workshop/allocation/scheduled/version.php b/mod/workshop/allocation/scheduled/version.php index 9bb53cecd91..7f5b3f26d5a 100644 --- a/mod/workshop/allocation/scheduled/version.php +++ b/mod/workshop/allocation/scheduled/version.php @@ -27,7 +27,7 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'workshopallocation_scheduled'; -$plugin->version = 2012112900; +$plugin->version = 2012112901; $plugin->requires = 2012112900; $plugin->dependencies = array( 'workshopallocation_random' => 2012112900,