diff --git a/calendar/classes/external/calendar_event_exporter.php b/calendar/classes/external/calendar_event_exporter.php index ad97c962745..a4d24adf056 100644 --- a/calendar/classes/external/calendar_event_exporter.php +++ b/calendar/classes/external/calendar_event_exporter.php @@ -93,6 +93,8 @@ class calendar_event_exporter extends event_exporter_base { $values = parent::get_other_values($output); $event = $this->event; + $course = $this->related['course']; + $hascourse = !empty($course); // By default all events that can be edited are // draggable. @@ -109,12 +111,9 @@ class calendar_event_exporter extends event_exporter_base { $values['editurl'] = $editurl->out(false); } else if ($event->get_type() == 'category') { $url = $event->get_category()->get_proxied_instance()->get_view_link(); - } else if ($event->get_type() == 'course') { - $url = course_get_url($event->get_course()->get('id') ?: SITEID); } else { // TODO MDL-58866 We do not have any way to find urls for events outside of course modules. - $course = $event->get_course()->get('id') ?: SITEID; - $url = course_get_url($course); + $url = course_get_url($hascourse ? $course : SITEID); } $values['url'] = $url->out(false); @@ -165,11 +164,10 @@ class calendar_event_exporter extends event_exporter_base { } // Include course's shortname into the event name, if applicable. - $course = $this->event->get_course(); - if ($course && $course->get('id') && $course->get('id') !== SITEID) { + if ($hascourse && $course->id !== SITEID) { $eventnameparams = (object) [ 'name' => $values['popupname'], - 'course' => format_string($course->get('shortname'), true, [ + 'course' => format_string($course->shortname, true, [ 'context' => $this->related['context'], ]) ]; diff --git a/calendar/tests/calendar_event_exporter_test.php b/calendar/tests/calendar_event_exporter_test.php index 5ae3edbfd7b..4bfdd96edb9 100644 --- a/calendar/tests/calendar_event_exporter_test.php +++ b/calendar/tests/calendar_event_exporter_test.php @@ -26,6 +26,9 @@ defined('MOODLE_INTERNAL') || die(); use core_calendar\external\calendar_event_exporter; use core_calendar\local\event\container; +use core_calendar\type_factory; + +require_once(__DIR__ . '/helpers.php'); /** * Calendar event exporter testcase. @@ -147,4 +150,83 @@ class core_calendar_event_exporter_testcase extends advanced_testcase { $this->assertEquals($expected, $result['maxdaytimestamp']); $this->assertEquals($max[1], $result['maxdayerror']); } + + /** + * Exporting a course event should generate the course URL. + */ + public function test_calendar_event_exporter_course_url_course_event() { + global $CFG, $PAGE; + require_once($CFG->dirroot . '/course/lib.php'); + + $this->resetAfterTest(true); + $this->setAdminUser(); + $generator = $this->getDataGenerator(); + $user = $generator->create_user(); + $course = $generator->create_course(); + $context = context_course::instance($course->id); + $now = time(); + $mapper = container::get_event_mapper(); + $legacyevent = create_event([ + 'courseid' => $course->id, + 'userid' => 1, + 'eventtype' => 'course', + 'timestart' => $now + ]); + $event = $mapper->from_legacy_event_to_event($legacyevent); + $exporter = new calendar_event_exporter($event, [ + 'context' => $context, + 'course' => $course, + 'moduleinstance' => null, + 'daylink' => new moodle_url(''), + 'type' => type_factory::get_calendar_instance(), + 'today' => $now + ]); + + $courseurl = course_get_url($course->id); + $expected = $courseurl->out(false); + $renderer = $PAGE->get_renderer('core_calendar'); + $exportedevent = $exporter->export($renderer); + + // The exported URL should be for the course. + $this->assertEquals($expected, $exportedevent->url); + } + + /** + * Exporting a user event should generate the site course URL. + */ + public function test_calendar_event_exporter_course_url_user_event() { + global $CFG, $PAGE; + require_once($CFG->dirroot . '/course/lib.php'); + + $this->resetAfterTest(true); + $this->setAdminUser(); + $generator = $this->getDataGenerator(); + $user = $generator->create_user(); + $context = context_user::instance($user->id); + $now = time(); + $mapper = container::get_event_mapper(); + $legacyevent = create_event([ + 'courseid' => 0, + 'userid' => $user->id, + 'eventtype' => 'user', + 'timestart' => $now + ]); + $event = $mapper->from_legacy_event_to_event($legacyevent); + $exporter = new calendar_event_exporter($event, [ + 'context' => $context, + 'course' => null, + 'moduleinstance' => null, + 'daylink' => new moodle_url(''), + 'type' => type_factory::get_calendar_instance(), + 'today' => $now + ]); + + $courseurl = course_get_url(SITEID); + $expected = $courseurl->out(false); + $renderer = $PAGE->get_renderer('core_calendar'); + $exportedevent = $exporter->export($renderer); + + // The exported URL should be for the site course. + $this->assertEquals($expected, $exportedevent->url); + } }