+++ /dev/null
-<?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/>.
-
-/**
- * Contains class containing the calendar API.
- *
- * @package core_calendar
- * @copyright 2017 Mark Nelson <markn@moodle.com>
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-namespace core_calendar;
-
-defined('MOODLE_INTERNAL') || die();
-
-require_once($CFG->dirroot . '/calendar/lib.php');
-
-use core_calendar\local\api as local_api;
-
-/**
- * Class containing the calendar API.
- *
- * @package core_calendar
- * @copyright 2017 Mark Nelson <markn@moodle.com>
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class api {
-
- /**
- * Get calendar events
- *
- * @param int $tstart Start time of time range for events
- * @param int $tend End time of time range for events
- * @param array|int|boolean $users array of users, user id or boolean for all/no user events
- * @param array|int|boolean $groups array of groups, group id or boolean for all/no group events
- * @param array|int|boolean $courses array of courses, course id or boolean for all/no course events
- * @param boolean $withduration whether only events starting within time range selected
- * or events in progress/already started selected as well
- * @param boolean $ignorehidden whether to select only visible events or all events
- * @return array $events of selected events or an empty array if there aren't any (or there was an error)
- */
- public static function get_events($tstart, $tend, $users, $groups, $courses, $withduration = true, $ignorehidden = true) {
- $fixedparams = array_map(function($param) {
- if ($param === true) {
- return null;
- }
-
- if (!is_array($param)) {
- return [$param];
- }
-
- return $param;
- }, [$users, $groups, $courses]);
-
- $mapper = \core_calendar\local\event\core_container::get_event_mapper();
- $events = local_api::get_events(
- $tstart,
- $tend,
- null,
- null,
- null,
- null,
- 40,
- null,
- $fixedparams[0],
- $fixedparams[1],
- $fixedparams[2],
- $withduration,
- $ignorehidden
- );
-
- return array_reduce($events, function($carry, $event) use ($mapper) {
- return $carry + [$event->get_id() => $mapper->from_event_to_stdclass($event)];
- }, []);
- }
-}
$this->assertCount(1, $result[$course3->id]);
$this->assertEquals('Event 6', $result[$course3->id][0]->get_name());
}
+
+ /**
+ * Test that the get_legacy_events() function only returns activity events that are enabled.
+ */
+ public function test_get_legacy_events_with_disabled_module() {
+ global $DB;
+
+ $this->setAdminUser();
+
+ $course = $this->getDataGenerator()->create_course();
+
+ $assigngenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
+ $assigninstance = $assigngenerator->create_instance(['course' => $course->id]);
+
+ $lessongenerator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
+ $lessoninstance = $lessongenerator->create_instance(['course' => $course->id]);
+ $student = $this->getDataGenerator()->create_user();
+ $this->getDataGenerator()->enrol_user($student->id, $course->id, 'student');
+ $this->setUser($student);
+ $events = [
+ [
+ 'name' => 'Start of assignment',
+ 'description' => '',
+ 'format' => 1,
+ 'courseid' => $course->id,
+ 'groupid' => 0,
+ 'userid' => 2,
+ 'modulename' => 'assign',
+ 'instance' => $assigninstance->id,
+ 'eventtype' => 'due',
+ 'timestart' => time(),
+ 'timeduration' => 86400,
+ 'visible' => 1
+ ], [
+ 'name' => 'Start of lesson',
+ 'description' => '',
+ 'format' => 1,
+ 'courseid' => $course->id,
+ 'groupid' => 0,
+ 'userid' => 2,
+ 'modulename' => 'lesson',
+ 'instance' => $lessoninstance->id,
+ 'eventtype' => 'end',
+ 'timestart' => time(),
+ 'timeduration' => 86400,
+ 'visible' => 1
+ ]
+ ];
+ foreach ($events as $event) {
+ calendar_event::create($event, false);
+ }
+ $timestart = time() - 60;
+ $timeend = time() + 60;
+
+ // Get all events.
+ $events = \core_calendar\local\api::get_legacy_events($timestart, $timeend, true, 0, true);
+ $this->assertCount(2, $events);
+
+ // Disable the lesson module.
+ $modulerecord = $DB->get_record('modules', ['name' => 'lesson']);
+ $modulerecord->visible = 0;
+ $DB->update_record('modules', $modulerecord);
+
+ // Check that we only return the assign event.
+ $events = \core_calendar\local\api::get_legacy_events($timestart, $timeend, true, 0, true);
+ $this->assertCount(1, $events);
+ $event = reset($events);
+ $this->assertEquals('assign', $event->modulename);
+ }
+
+ /**
+ * Test for \core_calendar\local\api::get_legacy_events() when there are user and group overrides.
+ */
+ public function test_get_legacy_events_with_overrides() {
+ $generator = $this->getDataGenerator();
+
+ $course = $generator->create_course();
+
+ $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
+ if (!isset($params['course'])) {
+ $params['course'] = $course->id;
+ }
+
+ $instance = $plugingenerator->create_instance($params);
+
+ // Create users.
+ $useroverridestudent = $generator->create_user();
+ $group1student = $generator->create_user();
+ $group2student = $generator->create_user();
+ $group12student = $generator->create_user();
+ $nogroupstudent = $generator->create_user();
+
+ // Enrol users.
+ $generator->enrol_user($useroverridestudent->id, $course->id, 'student');
+ $generator->enrol_user($group1student->id, $course->id, 'student');
+ $generator->enrol_user($group2student->id, $course->id, 'student');
+ $generator->enrol_user($group12student->id, $course->id, 'student');
+ $generator->enrol_user($nogroupstudent->id, $course->id, 'student');
+
+ // Create groups.
+ $group1 = $generator->create_group(['courseid' => $course->id]);
+ $group2 = $generator->create_group(['courseid' => $course->id]);
+
+ // Add members to groups.
+ $generator->create_group_member(['groupid' => $group1->id, 'userid' => $group1student->id]);
+ $generator->create_group_member(['groupid' => $group2->id, 'userid' => $group2student->id]);
+ $generator->create_group_member(['groupid' => $group1->id, 'userid' => $group12student->id]);
+ $generator->create_group_member(['groupid' => $group2->id, 'userid' => $group12student->id]);
+ $now = time();
+
+ // Events with the same module name, instance and event type.
+ $events = [
+ [
+ 'name' => 'Assignment 1 due date',
+ 'description' => '',
+ 'format' => 0,
+ 'courseid' => $course->id,
+ 'groupid' => 0,
+ 'userid' => 2,
+ 'modulename' => 'assign',
+ 'instance' => $instance->id,
+ 'eventtype' => 'due',
+ 'timestart' => $now,
+ 'timeduration' => 0,
+ 'visible' => 1
+ ], [
+ 'name' => 'Assignment 1 due date - User override',
+ 'description' => '',
+ 'format' => 1,
+ 'courseid' => 0,
+ 'groupid' => 0,
+ 'userid' => $useroverridestudent->id,
+ 'modulename' => 'assign',
+ 'instance' => $instance->id,
+ 'eventtype' => 'due',
+ 'timestart' => $now + 86400,
+ 'timeduration' => 0,
+ 'visible' => 1,
+ 'priority' => CALENDAR_EVENT_USER_OVERRIDE_PRIORITY
+ ], [
+ 'name' => 'Assignment 1 due date - Group A override',
+ 'description' => '',
+ 'format' => 1,
+ 'courseid' => $course->id,
+ 'groupid' => $group1->id,
+ 'userid' => 2,
+ 'modulename' => 'assign',
+ 'instance' => $instance->id,
+ 'eventtype' => 'due',
+ 'timestart' => $now + (2 * 86400),
+ 'timeduration' => 0,
+ 'visible' => 1,
+ 'priority' => 1,
+ ], [
+ 'name' => 'Assignment 1 due date - Group B override',
+ 'description' => '',
+ 'format' => 1,
+ 'courseid' => $course->id,
+ 'groupid' => $group2->id,
+ 'userid' => 2,
+ 'modulename' => 'assign',
+ 'instance' => $instance->id,
+ 'eventtype' => 'due',
+ 'timestart' => $now + (3 * 86400),
+ 'timeduration' => 0,
+ 'visible' => 1,
+ 'priority' => 2,
+ ],
+ ];
+
+ foreach ($events as $event) {
+ calendar_event::create($event, false);
+ }
+
+ $timestart = $now - 100;
+ $timeend = $now + (3 * 86400);
+ $groups = [$group1->id, $group2->id];
+
+ // Get user override events.
+ $this->setUser($useroverridestudent);
+ $events = \core_calendar\local\api::get_legacy_events($timestart, $timeend, $useroverridestudent->id, $groups, $course->id);
+ $this->assertCount(1, $events);
+ $event = reset($events);
+ $this->assertEquals('Assignment 1 due date - User override', $event->name);
+
+ // Get event for user with override but with the timestart and timeend parameters only covering the original event.
+ $events = \core_calendar\local\api::get_legacy_events($timestart, $now, $useroverridestudent->id, $groups, $course->id);
+ $this->assertCount(0, $events);
+
+ // Get events for user that does not belong to any group and has no user override events.
+ $this->setUser($nogroupstudent);
+ $events = \core_calendar\local\api::get_legacy_events($timestart, $timeend, $nogroupstudent->id, $groups, $course->id);
+ $this->assertCount(1, $events);
+ $event = reset($events);
+ $this->assertEquals('Assignment 1 due date', $event->name);
+
+ // Get events for user that belongs to groups A and B and has no user override events.
+ $this->setUser($group12student);
+ $events = \core_calendar\local\api::get_legacy_events($timestart, $timeend, $group12student->id, $groups, $course->id);
+ $this->assertCount(1, $events);
+ $event = reset($events);
+ $this->assertEquals('Assignment 1 due date - Group B override', $event->name);
+
+ // Get events for user that belongs to group A and has no user override events.
+ $this->setUser($group1student);
+ $events = \core_calendar\local\api::get_legacy_events($timestart, $timeend, $group1student->id, $groups, $course->id);
+ $this->assertCount(1, $events);
+ $event = reset($events);
+ $this->assertEquals('Assignment 1 due date - Group A override', $event->name);
+
+ // Add repeating events.
+ $repeatingevents = [
+ [
+ 'name' => 'Repeating site event',
+ 'description' => '',
+ 'format' => 1,
+ 'courseid' => SITEID,
+ 'groupid' => 0,
+ 'userid' => 2,
+ 'repeatid' => $event->id,
+ 'modulename' => '0',
+ 'instance' => 0,
+ 'eventtype' => 'site',
+ 'timestart' => $now + 86400,
+ 'timeduration' => 0,
+ 'visible' => 1,
+ ],
+ [
+ 'name' => 'Repeating site event',
+ 'description' => '',
+ 'format' => 1,
+ 'courseid' => SITEID,
+ 'groupid' => 0,
+ 'userid' => 2,
+ 'repeatid' => $event->id,
+ 'modulename' => '0',
+ 'instance' => 0,
+ 'eventtype' => 'site',
+ 'timestart' => $now + (2 * 86400),
+ 'timeduration' => 0,
+ 'visible' => 1,
+ ],
+ ];
+
+ foreach ($repeatingevents as $event) {
+ calendar_event::create($event, false);
+ }
+
+ // Make sure repeating events are not filtered out.
+ $events = \core_calendar\local\api::get_legacy_events($timestart, $timeend, true, true, true);
+ $this->assertCount(3, $events);
+ }
}