diff --git a/calendar/externallib.php b/calendar/externallib.php index c2053fa9d48..da95699fab3 100644 --- a/calendar/externallib.php +++ b/calendar/externallib.php @@ -227,21 +227,21 @@ class core_calendar_external extends external_api { $params['options']['timeend'] = PHP_INT_MAX; } + // Event list does not check visibility and permissions, we'll check that later. $eventlist = calendar_get_events($params['options']['timestart'], $params['options']['timeend'], $funcparam['users'], $funcparam['groups'], $funcparam['courses'], true, $params['options']['ignorehidden']); + // WS expects arrays. $events = array(); - foreach ($eventlist as $id => $event) { - $events[$id] = (array) $event; - } // We need to get events asked for eventids. - $eventsbyid = calendar_get_events_by_id($params['events']['eventids']); - foreach ($eventsbyid as $eventid => $eventobj) { + if ($eventsbyid = calendar_get_events_by_id($params['events']['eventids'])) { + $eventlist += $eventsbyid; + } + + foreach ($eventlist as $eventid => $eventobj) { $event = (array) $eventobj; - if (isset($events[$eventid])) { - continue; - } + if ($hassystemcap) { // User can see everything, no further check is needed. $events[$eventid] = $event; diff --git a/calendar/tests/externallib_test.php b/calendar/tests/externallib_test.php index 8a5b444b823..7619b2a56bc 100644 --- a/calendar/tests/externallib_test.php +++ b/calendar/tests/externallib_test.php @@ -370,6 +370,30 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase { $events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events); $this->assertEquals(1, count($events['events'])); $this->assertEquals(0, count($events['warnings'])); + + // Now, create an activity event. + $this->setAdminUser(); + $nexttime = time() + DAYSECS; + $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course->id, 'duedate' => $nexttime)); + + $this->setUser($user); + $paramevents = array ('courseids' => array($course->id)); + $options = array ('siteevents' => true, 'userevents' => true, 'timeend' => time() + WEEKSECS); + $events = core_calendar_external::get_calendar_events($paramevents, $options); + $events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events); + + $this->assertCount(5, $events['events']); + + // Hide the assignment. + set_coursemodule_visible($assign->cmid, 0); + // Empty all the caches that may be affected by this change. + accesslib_clear_all_caches_for_unit_testing(); + course_modinfo::clear_instance_cache(); + + $events = core_calendar_external::get_calendar_events($paramevents, $options); + $events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events); + // Expect one less. + $this->assertCount(4, $events['events']); } /**