コード例 #1
0
 public function test_get_next_adhoc_task()
 {
     $this->resetAfterTest(true);
     // Create an adhoc task.
     $task = new \core\task\adhoc_test_task();
     // Queue it.
     $task = \core\task\manager::queue_adhoc_task($task);
     $now = time();
     // Get it from the scheduler.
     $task = \core\task\manager::get_next_adhoc_task($now);
     $this->assertNotNull($task);
     $task->execute();
     \core\task\manager::adhoc_task_failed($task);
     // Should not get any task.
     $task = \core\task\manager::get_next_adhoc_task($now);
     $this->assertNull($task);
     // Should get the adhoc task (retry after delay).
     $task = \core\task\manager::get_next_adhoc_task($now + 120);
     $this->assertNotNull($task);
     $task->execute();
     \core\task\manager::adhoc_task_complete($task);
     // Should not get any task.
     $task = \core\task\manager::get_next_adhoc_task($now);
     $this->assertNull($task);
 }
コード例 #2
0
 /**
  * Store new setting
  *
  * @param mixed $data string or array, must not be NULL
  * @return string empty string if ok, string error message otherwise
  */
 public function write_setting($data)
 {
     $oldvalue = get_config($this->plugin, $this->name);
     if ($oldvalue == $data && !empty($data)) {
         return '';
     }
     if (!empty($data)) {
         $this->config_write($this->name, $data);
         $this->config_write('sharepoint_initialized', '0');
         $sharepointinit = new \local_o365\task\sharepointinit();
         \core\task\manager::queue_adhoc_task($sharepointinit);
     } else {
         // Support default value so it doesn't prompt for setting on install.
         $this->config_write($this->name, '');
     }
     return '';
 }
コード例 #3
0
 /**
  * This method process all events stored in the buffer.
  *
  * This is a multi purpose api. It does the following:-
  * 1. Write event data to tool_monitor_events
  * 2. Find out users that need to be notified about rule completion and schedule a task to send them messages.
  */
 public function process_buffer()
 {
     global $DB;
     $events = $this->flush();
     // Flush data.
     $select = "SELECT COUNT(id) FROM {tool_monitor_events} ";
     $now = time();
     $messagestosend = array();
     $allsubids = array();
     // Let us now process the events and check for subscriptions.
     foreach ($events as $eventobj) {
         $subscriptions = subscription_manager::get_subscriptions_by_event($eventobj);
         $idstosend = array();
         foreach ($subscriptions as $subscription) {
             $starttime = $now - $subscription->timewindow;
             $starttime = $starttime > $subscription->lastnotificationsent ? $starttime : $subscription->lastnotificationsent;
             if ($subscription->courseid == 0) {
                 // Site level subscription. Count all events.
                 $where = "eventname = :eventname AND timecreated >  :starttime";
                 $params = array('eventname' => $eventobj->eventname, 'starttime' => $starttime);
             } else {
                 // Course level subscription.
                 if ($subscription->cmid == 0) {
                     // All modules.
                     $where = "eventname = :eventname AND courseid = :courseid AND timecreated > :starttime";
                     $params = array('eventname' => $eventobj->eventname, 'courseid' => $eventobj->courseid, 'starttime' => $starttime);
                 } else {
                     // Specific module.
                     $where = "eventname = :eventname AND courseid = :courseid AND contextinstanceid = :cmid\n                                AND timecreated > :starttime";
                     $params = array('eventname' => $eventobj->eventname, 'courseid' => $eventobj->courseid, 'cmid' => $eventobj->contextinstanceid, 'starttime' => $starttime);
                 }
             }
             $sql = $select . "WHERE " . $where;
             $count = $DB->count_records_sql($sql, $params);
             if (!empty($count) && $count >= $subscription->frequency) {
                 $idstosend[] = $subscription->id;
                 // Trigger a subscription_criteria_met event.
                 // It's possible that the course has been deleted since the criteria was met, so in that case use
                 // the system context. Set it here and change later if needed.
                 $context = \context_system::instance();
                 // We can't perform if (!empty($subscription->courseid)) below as it uses the magic method
                 // __get to return the variable, which will always result in being empty.
                 $courseid = $subscription->courseid;
                 if (!empty($courseid)) {
                     if ($coursecontext = \context_course::instance($courseid, IGNORE_MISSING)) {
                         $context = $coursecontext;
                     }
                 }
                 $params = array('userid' => $subscription->userid, 'courseid' => $subscription->courseid, 'context' => $context, 'other' => array('subscriptionid' => $subscription->id));
                 $event = \tool_monitor\event\subscription_criteria_met::create($params);
                 $event->trigger();
             }
         }
         if (!empty($idstosend)) {
             $messagestosend[] = array('subscriptionids' => $idstosend, 'event' => $eventobj);
             $allsubids = array_merge($allsubids, $idstosend);
         }
     }
     if (!empty($allsubids)) {
         // Update the last trigger flag.
         list($sql, $params) = $DB->get_in_or_equal($allsubids, SQL_PARAMS_NAMED);
         $params['now'] = $now;
         $sql = "UPDATE {tool_monitor_subscriptions} SET lastnotificationsent = :now WHERE id {$sql}";
         $DB->execute($sql, $params);
     }
     // Schedule a task to send notification.
     if (!empty($messagestosend)) {
         $adhocktask = new notification_task();
         $adhocktask->set_custom_data($messagestosend);
         $adhocktask->set_component('tool_monitor');
         \core\task\manager::queue_adhoc_task($adhocktask);
     }
 }
コード例 #4
0
 /**
  * Handle role_deleted event
  *
  * Does the following:
  *     - Unfortunately the role has already been deleted when we hear about it here, and have no way to determine the affected
  *     users. Therefore, we have to do a global sync.
  *
  * @param \core\event\role_deleted $event The triggered event.
  * @return bool Success/Failure.
  */
 public static function handle_role_deleted(\core\event\role_deleted $event)
 {
     if (\local_o365\utils::is_configured() !== true) {
         return false;
     }
     $roleid = $event->objectid;
     // Role deletions can be heavy - run in cron.
     $spaccesssync = new \local_o365\task\sharepointaccesssync();
     $spaccesssync->set_custom_data(['roleid' => '*', 'userid' => '*', 'contextid' => null]);
     \core\task\manager::queue_adhoc_task($spaccesssync);
     return true;
 }
コード例 #5
0
function convert_with_ffmpeg_bg($filerecord, $tempdir, $tempfilename, $convfilenamebase, $convext)
{
    global $CFG;
    //init our fs object
    $fs = get_file_storage();
    $convfilename = $convfilenamebase . $convext;
    $placeholderfilename = "convertingmessage" . $convext;
    $filerecord->filename = $convfilename;
    $stored_file = $fs->create_file_from_pathname($filerecord, $CFG->dirroot . '/filter/poodll/' . $placeholderfilename);
    //we need this id later, to find the old draft file and remove it, in ad hoc task
    $filerecord->id = $stored_file->get_id();
    // set up task and add custom data
    $conv_task = new \filter_poodll\task\adhoc_convert_media();
    $qdata = array('filerecord' => $filerecord, 'filename' => $convfilename, 'tempdir' => $tempdir, 'tempfilename' => $tempfilename, 'convfilenamebase' => $convfilenamebase, 'convext' => $convext);
    $conv_task->set_custom_data($qdata);
    // queue it
    \core\task\manager::queue_adhoc_task($conv_task);
    //error_log('queeued:' . $convfilename);
    //error_log(print_r($qdata,true));
    return $stored_file;
}
コード例 #6
0
 /**
  * Called when an role has been removed.
  */
 public static function roledeleted(\core\event\role_unassigned $event)
 {
     global $CFG;
     if (\panopto_data::get_panopto_course_id($event->courseid) === false || $CFG->version < $requiredVersion) {
         return;
     }
     $task = new \block_panopto\task\update_user();
     $task->set_custom_data(array('courseid' => $event->courseid, 'relateduserid' => $event->relateduserid, 'contextid' => $event->contextid, 'eventtype' => "role"));
     if ($CFG->block_panopto_async_tasks) {
         \core\task\manager::queue_adhoc_task($task);
     } else {
         $task->execute();
     }
 }
コード例 #7
0
ファイル: observers.php プロジェクト: jamesmcq/o365-moodle
 /**
  * Handle calendar_unsubscribed event - queue calendar sync jobs for cron.
  *
  * @param \local_o365\event\calendar_unsubscribed $event The triggered event.
  * @return bool Success/Failure.
  */
 public static function handle_calendar_unsubscribed(\local_o365\event\calendar_unsubscribed $event)
 {
     $eventdata = $event->get_data();
     $calunsubscribe = new \local_o365\feature\calsync\task\syncoldevents();
     $calunsubscribe->set_custom_data(['caltype' => $eventdata['other']['caltype'], 'caltypeid' => isset($eventdata['other']['caltypeid']) ? $eventdata['other']['caltypeid'] : 0, 'userid' => $eventdata['userid'], 'timecreated' => time()]);
     \core\task\manager::queue_adhoc_task($calunsubscribe);
     return true;
 }
コード例 #8
0
ファイル: lib.php プロジェクト: Chocolate-lightning/moodle
/**
 * Course section deletion, using an adhoc task for deletion of the modules it contains.
 * 1. Schedule all modules within the section for adhoc removal.
 * 2. Move all modules to course section 0.
 * 3. Delete the resulting empty section.
 *
 * @param \stdClass $section the section to schedule for deletion.
 * @param bool $forcedeleteifnotempty whether to force section deletion if it contains modules.
 * @return bool true if the section was scheduled for deletion, false otherwise.
 */
function course_delete_section_async($section, $forcedeleteifnotempty = true)
{
    global $DB, $USER;
    // Objects only, and only valid ones.
    if (!is_object($section) || empty($section->id)) {
        return false;
    }
    // Does the object currently exist in the DB for removal (check for stale objects).
    $section = $DB->get_record('course_sections', array('id' => $section->id));
    if (!$section || !$section->section) {
        // No section exists, or the section is 0. Can't proceed.
        return false;
    }
    // Check whether the section can be removed.
    if (!$forcedeleteifnotempty && (!empty($section->sequence) || !empty($section->summary))) {
        return false;
    }
    $format = course_get_format($section->course);
    $sectionname = $format->get_section_name($section);
    // Flag those modules having no existing deletion flag. Some modules may have been scheduled for deletion manually, and we don't
    // want to create additional adhoc deletion tasks for these. Moving them to section 0 will suffice.
    $affectedmods = $DB->get_records_select('course_modules', 'course = ? AND section = ? AND deletioninprogress <> ?', [$section->course, $section->id, 1], '', 'id');
    $DB->set_field('course_modules', 'deletioninprogress', '1', ['course' => $section->course, 'section' => $section->id]);
    // Move all modules to section 0.
    $modules = $DB->get_records('course_modules', ['section' => $section->id], '');
    $sectionzero = $DB->get_record('course_sections', ['course' => $section->course, 'section' => '0']);
    foreach ($modules as $mod) {
        moveto_module($mod, $sectionzero);
    }
    // Create and queue an adhoc task for the deletion of the modules.
    $removaltask = new \core_course\task\course_delete_modules();
    $data = array('cms' => $affectedmods, 'userid' => $USER->id, 'realuserid' => \core\session\manager::get_realuser()->id);
    $removaltask->set_custom_data($data);
    \core\task\manager::queue_adhoc_task($removaltask);
    // Delete the now empty section, passing in only the section number, which forces the function to fetch a new object.
    // The refresh is needed because the section->sequence is now stale.
    $result = $format->delete_section($section->section, $forcedeleteifnotempty);
    // Trigger an event for course section deletion.
    if ($result) {
        $context = \context_course::instance($section->course);
        $event = \core\event\course_section_deleted::create(array('objectid' => $section->id, 'courseid' => $section->course, 'context' => $context, 'other' => array('sectionnum' => $section->section, 'sectionname' => $sectionname)));
        $event->add_record_snapshot('course_sections', $section);
        $event->trigger();
    }
    rebuild_course_cache($section->course, true);
    return $result;
}
コード例 #9
0
ファイル: adhoc_task_test.php プロジェクト: evltuma/moodle
 /**
  * Test future adhoc task execution.
  */
 public function test_get_next_adhoc_task_future()
 {
     $this->resetAfterTest(true);
     $now = time();
     // Create an adhoc task in future.
     $task = new \core\task\adhoc_test_task();
     $task->set_next_run_time($now + 1000);
     \core\task\manager::queue_adhoc_task($task);
     // Fetching the next task should not return anything.
     $this->assertNull(\core\task\manager::get_next_adhoc_task($now));
     // Fetching in the future should return the task.
     $task = \core\task\manager::get_next_adhoc_task($now + 1020);
     $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
     $task->execute();
     \core\task\manager::adhoc_task_complete($task);
 }
コード例 #10
0
 private function process_publish_allocations()
 {
     $now = time();
     if ($this->ratingallocate->accesstimestop < $now) {
         global $USER, $OUTPUT;
         $this->origdbrecord->{this_db\ratingallocate::PUBLISHED} = true;
         $this->origdbrecord->{this_db\ratingallocate::PUBLISHDATE} = time();
         $this->origdbrecord->{this_db\ratingallocate::NOTIFICATIONSEND} = -1;
         $this->ratingallocate = new ratingallocate_db_wrapper($this->origdbrecord);
         $this->db->update_record(this_db\ratingallocate::TABLE, $this->origdbrecord);
         // create the instance
         $domination = new mod_ratingallocate\task\send_distribution_notification();
         // set blocking if required (it probably isn't)
         // $domination->set_blocking(true);
         // add custom data
         $domination->set_component('mod_ratingallocate');
         $domination->set_custom_data(array('userid' => $USER->id, 'ratingallocateid' => $this->ratingallocateid));
         // queue it
         \core\task\manager::queue_adhoc_task($domination);
         //Logging
         $event = \mod_ratingallocate\event\allocation_published::create_simple(context_course::instance($this->course->id), $this->ratingallocateid);
         $event->trigger();
         /* @var $renderer mod_ratingallocate_renderer */
         $renderer = $this->get_renderer();
         $renderer->add_notification(get_string('distribution_published', ratingallocate_MOD_NAME), self::NOTIFY_SUCCESS);
         return $this->process_default();
     }
 }
コード例 #11
0
         $_SESSION["notice"]["message"] = $doupload["message"];
         $_SESSION["notice"]["type"] = "error";
         $do = "submitpaper";
     }
 } else {
     if ($post['submissiontype'] == 2) {
         $turnitintooltwosubmission->prepare_text_submission($cm, $post);
     }
 }
 if ($do == "submission_success") {
     // Kent - New method.
     // Delete any old status.
     $DB->delete_records('turnitintooltwo_sub_status', array('submissionid' => $turnitintooltwosubmission->id));
     $task = new \mod_turnitintooltwo\task\submit_assignment();
     $task->set_custom_data(array('userid' => $USER->id, 'tiiid' => $turnitintooltwoassignment->turnitintooltwo->id, 'submissionid' => $turnitintooltwosubmission->id, 'submissionpart' => $post['submissionpart'], 'subtime' => time()));
     \core\task\manager::queue_adhoc_task($task, null, 10);
     turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "queue submission", 'view.php?id=' . $cm->id, "Queued turnitin submission: " . " '" . $post['submissiontitle'] . "'", $cm->id, $post['studentsname'], array('submissionid' => $turnitintooltwosubmission->id));
     redirect(new moodle_url('/mod/turnitintooltwo/view.php', array('id' => $id, 'do' => 'submission_queued', 'submissionid' => $turnitintooltwosubmission->id, 'view_context' => $viewcontext)));
     exit;
     // Kent - New method.
     // Log successful submission to Moodle.
     turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "add submission", 'view.php?id=' . $cm->id, get_string('addsubmissiondesc', 'turnitintooltwo') . " '" . $post['submissiontitle'] . "'", $cm->id, $post['studentsname']);
     $tiisubmission = $turnitintooltwosubmission->do_tii_submission($cm, $turnitintooltwoassignment);
     $_SESSION["digital_receipt"] = $tiisubmission;
     $_SESSION["digital_receipt"]["is_manual"] = 0;
     if ($tiisubmission['success'] == true) {
         $lockedassignment = new stdClass();
         $lockedassignment->id = $turnitintooltwoassignment->turnitintooltwo->id;
         $lockedassignment->submitted = 1;
         $DB->update_record('turnitintooltwo', $lockedassignment);
         $lockedpart = new stdClass();