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 bc882cc785f..78c9a0b4bef 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 = 2012061700; +$plugin->version = 2012061701; $plugin->requires = 2012061700; $plugin->dependencies = array( 'workshopallocation_random' => 2012061700, diff --git a/mod/workshop/version.php b/mod/workshop/version.php index 09b062539c0..fe9fdc69c9c 100644 --- a/mod/workshop/version.php +++ b/mod/workshop/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$module->version = 2012061700; // the current module version (YYYYMMDDXX) +$module->version = 2012061701; // the current module version (YYYYMMDDXX) $module->requires = 2012061700; // requires this Moodle version $module->component = 'mod_workshop'; // full name of the plugin (used for diagnostics) $module->cron = 60; // give as a chance every minute diff --git a/mod/workshop/view.php b/mod/workshop/view.php index e5817dd263f..621bd46770d 100644 --- a/mod/workshop/view.php +++ b/mod/workshop/view.php @@ -59,6 +59,24 @@ $workshop->log('view'); $completion = new completion_info($course); $completion->set_module_viewed($cm); +// Fire the event +events_trigger('workshop_viewed', (object)array( + 'workshop' => $workshop, + 'user' => $USER, +)); + +// If the phase is to be switched, do it asap. This just has to happen after triggering +// the event so that the scheduled allocator had a chance to allocate submissions. +if ($workshop->phase == workshop::PHASE_SUBMISSION and $workshop->phaseswitchassessment + and $workshop->submissionend > 0 and $workshop->submissionend < time()) { + $workshop->switch_phase(workshop::PHASE_ASSESSMENT); + $workshop->log('update switch phase', $workshop->view_url(), $workshop->phase); + // Disable the automatic switching now so that it is not executed again by accident + // if the teacher changes the phase back to the submission one. + $DB->set_field('workshop', 'phaseswitchassessment', 0, array('id' => $workshop->id)); + $workshop->phaseswitchassessment = 0; +} + if (!is_null($editmode) && $PAGE->user_allowed_editing()) { $USER->editing = $editmode; }