コード例 #1
0
 /**
  * Create the event from course record.
  *
  * @param \stdClass $course
  * @return course_module_instance_list_viewed
  */
 public static function create_from_course(\stdClass $course)
 {
     $params = array('context' => \context_course::instance($course->id));
     $event = \mod_book\event\course_module_instance_list_viewed::create($params);
     $event->add_record_snapshot('course', $course);
     return $event;
 }
コード例 #2
0
ファイル: index.php プロジェクト: pzhu2004/moodle
$course = $DB->get_record('course', array('id' => $id), '*', MUST_EXIST);
unset($id);
require_course_login($course, true);
$PAGE->set_pagelayout('incourse');
// Get all required strings
$strbooks = get_string('modulenameplural', 'mod_book');
$strbook = get_string('modulename', 'mod_book');
$strname = get_string('name');
$strintro = get_string('moduleintro');
$strlastmodified = get_string('lastmodified');
$PAGE->set_url('/mod/book/index.php', array('id' => $course->id));
$PAGE->set_title($course->shortname . ': ' . $strbooks);
$PAGE->set_heading($course->fullname);
$PAGE->navbar->add($strbooks);
echo $OUTPUT->header();
\mod_book\event\course_module_instance_list_viewed::create_from_course($course)->trigger();
// Get all the appropriate data
if (!($books = get_all_instances_in_course('book', $course))) {
    notice(get_string('thereareno', 'moodle', $strbooks), "{$CFG->wwwroot}/course/view.php?id={$course->id}");
    die;
}
$usesections = course_format_uses_sections($course->format);
$table = new html_table();
$table->attributes['class'] = 'generaltable mod_index';
if ($usesections) {
    $strsectionname = get_string('sectionname', 'format_' . $course->format);
    $table->head = array($strsectionname, $strname, $strintro);
    $table->align = array('center', 'left', 'left');
} else {
    $table->head = array($strlastmodified, $strname, $strintro);
    $table->align = array('left', 'left', 'left');
コード例 #3
0
ファイル: events_test.php プロジェクト: evltuma/moodle
 public function test_course_module_instance_list_viewed()
 {
     // There is no proper API to call to trigger this event, so what we are
     // doing here is simply making sure that the events returns the right information.
     $course = $this->getDataGenerator()->create_course();
     $params = array('context' => context_course::instance($course->id));
     $event = \mod_book\event\course_module_instance_list_viewed::create($params);
     // Triggering and capturing the event.
     $sink = $this->redirectEvents();
     $event->trigger();
     $events = $sink->get_events();
     $this->assertCount(1, $events);
     $event = reset($events);
     // Checking that the event contains the expected values.
     $this->assertInstanceOf('\\mod_book\\event\\course_module_instance_list_viewed', $event);
     $this->assertEquals(context_course::instance($course->id), $event->get_context());
     $expected = array($course->id, 'book', 'view all', 'index.php?id=' . $course->id, '');
     $this->assertEventLegacyLogData($expected, $event);
     $this->assertEventContextNotUsed($event);
 }
コード例 #4
0
 /**
  * Test that same events are not used twice to calculate conditions for a single subscription.
  */
 public function test_multiple_notification_not_sent()
 {
     global $USER;
     $this->resetAfterTest();
     $this->setAdminUser();
     $messagesink = $this->redirectMessages();
     // Generate data.
     $course = $this->getDataGenerator()->create_course();
     $toolgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
     $rulerecord = new stdClass();
     $rulerecord->courseid = $course->id;
     $rulerecord->eventname = '\\mod_book\\event\\course_module_instance_list_viewed';
     $rulerecord->frequency = 5;
     $rule = $toolgenerator->create_rule($rulerecord);
     $subrecord = new stdClass();
     $subrecord->courseid = $course->id;
     $subrecord->ruleid = $rule->id;
     $subrecord->userid = $USER->id;
     $toolgenerator->create_subscription($subrecord);
     for ($i = 0; $i < 7; $i++) {
         // Now let us trigger 7 instances of the event.
         $event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
         $event->trigger();
         $this->waitForSecond();
         // Add a second delay, to prevent time collisions.
     }
     $this->run_adhock_tasks();
     $messages = $messagesink->get_messages();
     $this->assertCount(1, $messages);
     // There should be only one message not 3.
     for ($i = 0; $i < 3; $i++) {
         // Now let us trigger 5 more instances of the event.
         $event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
         $event->trigger();
     }
     $this->run_adhock_tasks();
     $messages = $messagesink->get_messages();
     $this->assertCount(2, $messages);
     // There should be two messages now.
 }
コード例 #5
0
 /**
  * Tests the cleaning up of events.
  */
 public function test_clean_events()
 {
     global $DB;
     // Create the necessary items for testing.
     $user = $this->getDataGenerator()->create_user();
     $course = $this->getDataGenerator()->create_course();
     $bookgenerator = $this->getDataGenerator()->get_plugin_generator('mod_book');
     $book = $this->getDataGenerator()->create_module('book', array('course' => $course->id));
     $bookcontext = context_module::instance($book->cmid);
     $bookchapter = $bookgenerator->create_chapter(array('bookid' => $book->id));
     $course2 = $this->getDataGenerator()->create_course();
     $book2 = $this->getDataGenerator()->create_module('book', array('course' => $course2->id));
     $book2context = context_module::instance($book2->cmid);
     $book2chapter = $bookgenerator->create_chapter(array('bookid' => $book2->id));
     $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
     // Let's set some data for the rules we need before we can generate them.
     $rule = new stdClass();
     $rule->userid = $user->id;
     $rule->courseid = $course->id;
     $rule->plugin = 'mod_book';
     $rule->eventname = '\\mod_book\\event\\course_module_viewed';
     $rule->timewindow = 500;
     // Let's add a few rules we want to monitor.
     $rule1 = $monitorgenerator->create_rule($rule);
     $rule->eventname = '\\mod_book\\event\\course_module_instance_list_viewed';
     $rule2 = $monitorgenerator->create_rule($rule);
     // Add the same rules for the same course, but this time with a lower timewindow (used to test that we do not
     // remove an event for a course if there is still a rule where the maximum timewindow has not been reached).
     $rule->eventname = '\\mod_book\\event\\course_module_viewed';
     $rule->timewindow = 200;
     $rule3 = $monitorgenerator->create_rule($rule);
     $rule->eventname = '\\mod_book\\event\\course_module_instance_list_viewed';
     $rule4 = $monitorgenerator->create_rule($rule);
     // Add another rule in a different course.
     $rule->courseid = $course2->id;
     $rule->eventname = '\\mod_book\\event\\chapter_viewed';
     $rule->timewindow = 200;
     $rule5 = $monitorgenerator->create_rule($rule);
     // Add a site wide rule.
     $rule->courseid = 0;
     $rule->eventname = '\\mod_book\\event\\chapter_viewed';
     $rule->timewindow = 500;
     $rule6 = $monitorgenerator->create_rule($rule);
     // Now let's populate the tool_monitor table with the events associated with those rules.
     \mod_book\event\course_module_viewed::create_from_book($book, $bookcontext)->trigger();
     \mod_book\event\course_module_instance_list_viewed::create_from_course($course)->trigger();
     \mod_book\event\chapter_viewed::create_from_chapter($book, $bookcontext, $bookchapter)->trigger();
     // Let's trigger the viewed events again, but in another course. The rules created for these events are
     // associated with another course, so these events should get deleted when we trigger the cleanup task.
     \mod_book\event\course_module_viewed::create_from_book($book2, $book2context)->trigger();
     \mod_book\event\course_module_instance_list_viewed::create_from_course($course2)->trigger();
     // Trigger a chapter_viewed event in this course - this should not get deleted as the rule is site wide.
     \mod_book\event\chapter_viewed::create_from_chapter($book2, $book2context, $book2chapter)->trigger();
     // Trigger a bunch of other events.
     $eventparams = array('context' => context_course::instance($course->id));
     for ($i = 0; $i < 5; $i++) {
         \mod_quiz\event\course_module_instance_list_viewed::create($eventparams)->trigger();
         \mod_scorm\event\course_module_instance_list_viewed::create($eventparams)->trigger();
     }
     // Check that the events exist - there will be additional events for creating courses, modules and rules.
     $this->assertEquals(26, $DB->count_records('tool_monitor_events'));
     // Run the task and check that all the quiz, scorm and rule events are removed as well as the course_module_*
     // viewed events in the second course.
     $task = new \tool_monitor\task\clean_events();
     $task->execute();
     $events = $DB->get_records('tool_monitor_events');
     $this->assertEquals(4, count($events));
     $event1 = array_shift($events);
     $event2 = array_shift($events);
     $event3 = array_shift($events);
     $event4 = array_shift($events);
     $this->assertEquals('\\mod_book\\event\\course_module_viewed', $event1->eventname);
     $this->assertEquals($course->id, $event1->courseid);
     $this->assertEquals('\\mod_book\\event\\course_module_instance_list_viewed', $event2->eventname);
     $this->assertEquals($course->id, $event2->courseid);
     $this->assertEquals('\\mod_book\\event\\chapter_viewed', $event3->eventname);
     $this->assertEquals($course->id, $event3->courseid);
     $this->assertEquals('\\mod_book\\event\\chapter_viewed', $event4->eventname);
     $this->assertEquals($course2->id, $event4->courseid);
     // Update the timewindow for two of the rules.
     $updaterule = new stdClass();
     $updaterule->id = $rule1->id;
     $updaterule->timewindow = 0;
     \tool_monitor\rule_manager::update_rule($updaterule);
     $updaterule->id = $rule2->id;
     \tool_monitor\rule_manager::update_rule($updaterule);
     // Run the task and check that the events remain as we still have not reached the maximum timewindow.
     $task = new \tool_monitor\task\clean_events();
     $task->execute();
     $this->assertEquals(4, $DB->count_records('tool_monitor_events'));
     // Now, remove the rules associated with course_module_* events so they get deleted.
     \tool_monitor\rule_manager::delete_rule($rule1->id);
     \tool_monitor\rule_manager::delete_rule($rule2->id);
     \tool_monitor\rule_manager::delete_rule($rule3->id);
     \tool_monitor\rule_manager::delete_rule($rule4->id);
     // Run the task and check all the course_module_* events are gone.
     $task = new \tool_monitor\task\clean_events();
     $task->execute();
     // We now should only have the chapter_viewed events.
     $events = $DB->get_records('tool_monitor_events');
     $this->assertEquals(2, count($events));
     $event1 = array_shift($events);
     $event2 = array_shift($events);
     $this->assertEquals('\\mod_book\\event\\chapter_viewed', $event1->eventname);
     $this->assertEquals($course->id, $event1->courseid);
     $this->assertEquals('\\mod_book\\event\\chapter_viewed', $event2->eventname);
     $this->assertEquals($course2->id, $event2->courseid);
     // Set the timewindow of the rule for the event chapter_viewed in the second course to 0.
     $updaterule->id = $rule5->id;
     \tool_monitor\rule_manager::update_rule($updaterule);
     // Run the task.
     $task = new \tool_monitor\task\clean_events();
     $task->execute();
     // Check that nothing was deleted as we still have a site wide rule for the chapter_viewed event.
     $this->assertEquals(2, $DB->count_records('tool_monitor_events'));
     // Set the timewindow back to 500.
     $updaterule->id = $rule5->id;
     $updaterule->timewindow = 500;
     \tool_monitor\rule_manager::update_rule($updaterule);
     // Set the site rule timewindow to 0.
     $updaterule->id = $rule6->id;
     $updaterule->timewindow = 0;
     \tool_monitor\rule_manager::update_rule($updaterule);
     // Run the task.
     $task = new \tool_monitor\task\clean_events();
     $task->execute();
     // We now should only have one chapter_viewed event for the second course.
     $events = $DB->get_records('tool_monitor_events');
     $this->assertEquals(1, count($events));
     $event1 = array_shift($events);
     $this->assertEquals('\\mod_book\\event\\chapter_viewed', $event1->eventname);
     $this->assertEquals($course2->id, $event1->courseid);
     // Remove the site rule.
     \tool_monitor\rule_manager::delete_rule($rule6->id);
     // Remove the last remaining rule.
     \tool_monitor\rule_manager::delete_rule($rule5->id);
     // Run the task.
     $task = new \tool_monitor\task\clean_events();
     $task->execute();
     // There should be no events left.
     $this->assertEquals(0, $DB->count_records('tool_monitor_events'));
 }
コード例 #6
0
ファイル: index.php プロジェクト: covex-nn/moodle
unset($id);
require_course_login($course, true);
$PAGE->set_pagelayout('incourse');
// Get all required strings
$strbooks = get_string('modulenameplural', 'mod_book');
$strbook = get_string('modulename', 'mod_book');
$strname = get_string('name');
$strintro = get_string('moduleintro');
$strlastmodified = get_string('lastmodified');
$PAGE->set_url('/mod/book/index.php', array('id' => $course->id));
$PAGE->set_title($course->shortname . ': ' . $strbooks);
$PAGE->set_heading($course->fullname);
$PAGE->navbar->add($strbooks);
echo $OUTPUT->header();
$params = array('context' => context_course::instance($course->id));
$event = \mod_book\event\course_module_instance_list_viewed::create($params);
$event->trigger();
// Get all the appropriate data
if (!($books = get_all_instances_in_course('book', $course))) {
    notice(get_string('thereareno', 'moodle', $strbooks), "{$CFG->wwwroot}/course/view.php?id={$course->id}");
    die;
}
$usesections = course_format_uses_sections($course->format);
$table = new html_table();
$table->attributes['class'] = 'generaltable mod_index';
if ($usesections) {
    $strsectionname = get_string('sectionname', 'format_' . $course->format);
    $table->head = array($strsectionname, $strname, $strintro);
    $table->align = array('center', 'left', 'left');
} else {
    $table->head = array($strlastmodified, $strname, $strintro);
コード例 #7
0
 /**
  * Test the notification sending features.
  */
 public function test_process_event()
 {
     global $DB, $USER;
     $this->resetAfterTest();
     $this->setAdminUser();
     $msgsink = $this->redirectMessages();
     // Generate data.
     $course = $this->getDataGenerator()->create_course();
     $toolgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
     $rulerecord = new stdClass();
     $rulerecord->courseid = $course->id;
     $rulerecord->eventname = '\\mod_book\\event\\course_module_instance_list_viewed';
     $rulerecord->frequency = 1;
     $rule = $toolgenerator->create_rule($rulerecord);
     $subrecord = new stdClass();
     $subrecord->courseid = $course->id;
     $subrecord->ruleid = $rule->id;
     $subrecord->userid = $USER->id;
     $toolgenerator->create_subscription($subrecord);
     $recordexists = $DB->record_exists('task_adhoc', array('component' => 'tool_monitor'));
     $this->assertFalse($recordexists);
     // Now let us trigger the event.
     $event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
     $event->trigger();
     $this->verify_processed_data($msgsink);
     // Clean up.
     \tool_monitor\rule_manager::delete_rule($rule->id);
     $DB->delete_records('tool_monitor_events');
     // Let us create a rule with more than 1 frequency.
     $rulerecord->frequency = 5;
     $rule = $toolgenerator->create_rule($rulerecord);
     $subrecord->ruleid = $rule->id;
     $toolgenerator->create_subscription($subrecord);
     // Let us trigger events.
     for ($i = 0; $i < 5; $i++) {
         $event = \mod_book\event\course_module_instance_list_viewed::create_from_course($course);
         $event->trigger();
         if ($i != 4) {
             $this->verify_message_not_sent_yet($msgsink);
         }
     }
     $this->verify_processed_data($msgsink);
     // Clean up.
     \tool_monitor\rule_manager::delete_rule($rule->id);
     $DB->delete_records('tool_monitor_events');
     // Now let us create a rule specific to a module instance.
     $cm = new stdClass();
     $cm->course = $course->id;
     $book = $this->getDataGenerator()->create_module('book', $cm);
     $rulerecord->eventname = '\\mod_book\\event\\course_module_viewed';
     $rulerecord->cmid = $book->cmid;
     $rule = $toolgenerator->create_rule($rulerecord);
     $subrecord->ruleid = $rule->id;
     $toolgenerator->create_subscription($subrecord);
     // Let us trigger events.
     $params = array('context' => context_module::instance($book->cmid), 'objectid' => $book->id);
     for ($i = 0; $i < 5; $i++) {
         $event = \mod_book\event\course_module_viewed::create($params);
         $event->trigger();
         if ($i != 4) {
             $this->verify_message_not_sent_yet($msgsink);
         }
     }
     $this->verify_processed_data($msgsink);
     // Clean up.
     \tool_monitor\rule_manager::delete_rule($rule->id);
     $DB->delete_records('tool_monitor_events');
     // Now let us create a rule for event that happens in category context events.
     $rulerecord->eventname = '\\core\\event\\course_category_created';
     $rulerecord->courseid = 0;
     $rule = $toolgenerator->create_rule($rulerecord);
     $subrecord->courseid = 0;
     $subrecord->ruleid = $rule->id;
     $toolgenerator->create_subscription($subrecord);
     // Let us trigger events.
     for ($i = 0; $i < 5; $i++) {
         $this->getDataGenerator()->create_category();
         if ($i != 4) {
             $this->verify_message_not_sent_yet($msgsink);
         }
     }
     $this->verify_processed_data($msgsink);
     // Clean up.
     \tool_monitor\rule_manager::delete_rule($rule->id);
     $DB->delete_records('tool_monitor_events');
     // Now let us create a rule at site level.
     $rulerecord->eventname = '\\core\\event\\blog_entry_created';
     $rulerecord->courseid = 0;
     $rule = $toolgenerator->create_rule($rulerecord);
     $subrecord->courseid = 0;
     $subrecord->ruleid = $rule->id;
     $toolgenerator->create_subscription($subrecord);
     // Let us trigger events.
     $blog = new blog_entry();
     $blog->subject = "Subject of blog";
     $blog->userid = $USER->id;
     $states = blog_entry::get_applicable_publish_states();
     $blog->publishstate = reset($states);
     for ($i = 0; $i < 5; $i++) {
         $newblog = fullclone($blog);
         $newblog->add();
         if ($i != 4) {
             $this->verify_message_not_sent_yet($msgsink);
         }
     }
     $this->verify_processed_data($msgsink);
 }