MDL-37781 Allocate workshop submissions without waiting for cron
authorDavid Mudrák <david@moodle.com>
Thu, 31 Jan 2013 02:31:57 +0000 (03:31 +0100)
committerDavid Mudrák <david@moodle.com>
Thu, 31 Jan 2013 10:35:07 +0000 (11:35 +0100)
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.

mod/workshop/allocation/scheduled/db/events.php [new file with mode: 0644]
mod/workshop/allocation/scheduled/lib.php
mod/workshop/allocation/scheduled/version.php

diff --git a/mod/workshop/allocation/scheduled/db/events.php b/mod/workshop/allocation/scheduled/db/events.php
new file mode 100644 (file)
index 0000000..d9137fc
--- /dev/null
@@ -0,0 +1,40 @@
+<?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/>.
+
+/**
+ * Defines event handlers
+ *
+ * @package     workshopallocation_scheduled
+ * @subpackage  mod_workshop
+ * @category    event
+ * @copyright   2013 David Mudrak <david@moodle.com>
+ * @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,
+    ),
+
+);
index 11095a9..8809e93 100644 (file)
@@ -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;
+}
index bc882cc..78c9a0b 100644 (file)
@@ -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,