Merge branch 'MDL-84617-main' of https://github.com/sarjona/moodle

This commit is contained in:
Andrew Nicols
2025-03-07 11:43:10 +08:00
8 changed files with 202 additions and 309 deletions
@@ -0,0 +1,7 @@
issueNumber: MDL-84617
notes:
core_calendar:
- message: >-
prepare_for_view(), calendar_add_event_metadata() functions have
been removed.
type: removed
@@ -0,0 +1,7 @@
issueNumber: MDL-84617
notes:
core_calendar:
- message: >-
calendar_get_courselink(), calendar_events_by_day() functions have
been deprecated.
type: deprecated
@@ -0,0 +1,5 @@
issueNumber: MDL-84617
notes:
core_calendar:
- message: 'core_calendar_renderer::event() method has been removed.'
type: removed
+155
View File
@@ -140,3 +140,158 @@ function calendar_format_event_time($event, $now, $linkparams = null, $usecommon
return $OUTPUT->render($humanperiod);
}
/**
* @deprecated 3.9
*/
#[\core\attribute\deprecated(
replacement: 'calendar_add_event_metadata no longer used',
since: '3.9',
mdl: 'MDL-58866',
final: true,
)]
function calendar_add_event_metadata() {
\core\deprecation::emit_deprecation_if_present(__FUNCTION__);
}
/**
* Get a HTML link to a course.
*
* @param int|stdClass $course the course id or course object
* @return string a link to the course (as HTML); empty if the course id is invalid
*
* @deprecated since 5.0
* @todo MDL-84268 Final deprecation in Moodle 6.0.
*/
#[\core\attribute\deprecated(
replacement: 'calendar_get_courselink no longer used',
since: '5.0',
mdl: 'MDL-84617',
)]
function calendar_get_courselink($course) {
\core\deprecation::emit_deprecation_if_present(__FUNCTION__);
if (!$course) {
return '';
}
if (!is_object($course)) {
$course = calendar_get_course_cached($coursecache, $course);
}
$context = \context_course::instance($course->id);
$fullname = format_string($course->fullname, true, ['context' => $context]);
$url = new \moodle_url('/course/view.php', ['id' => $course->id]);
$link = \html_writer::link($url, $fullname);
return $link;
}
/**
* Get per-day basis events
*
* @param array $events list of events
* @param int $month the number of the month
* @param int $year the number of the year
* @param array $eventsbyday event on specific day
* @param array $durationbyday duration of the event in days
* @param array $typesbyday event type (eg: site, course, user, or group)
* @param array $courses list of courses
* @return void
*
* @deprecated since 5.0
* @todo MDL-84268 Final deprecation in Moodle 6.0.
*/
#[\core\attribute\deprecated(
replacement: 'calendar_events_by_day not used since 3.4',
since: '5.0',
mdl: 'MDL-84617',
)]
function calendar_events_by_day($events, $month, $year, &$eventsbyday, &$durationbyday, &$typesbyday, &$courses) {
\core\deprecation::emit_deprecation_if_present(__FUNCTION__);
$calendartype = \core_calendar\type_factory::get_calendar_instance();
$eventsbyday = [];
$typesbyday = [];
$durationbyday = [];
if ($events === false) {
return;
}
foreach ($events as $event) {
$startdate = $calendartype->timestamp_to_date_array($event->timestart);
if ($event->timeduration) {
$enddate = $calendartype->timestamp_to_date_array($event->timestart + $event->timeduration - 1);
} else {
$enddate = $startdate;
}
// Simple arithmetic: $year * 13 + $month is a distinct integer for each distinct ($year, $month) pair.
if (!($startdate['year'] * 13 + $startdate['mon'] <= $year * 13 + $month) &&
($enddate['year'] * 13 + $enddate['mon'] >= $year * 13 + $month)) {
continue;
}
$eventdaystart = intval($startdate['mday']);
if ($startdate['mon'] == $month && $startdate['year'] == $year) {
// Give the event to its day.
$eventsbyday[$eventdaystart][] = $event->id;
// Mark the day as having such an event.
if ($event->courseid == SITEID && $event->groupid == 0) {
$typesbyday[$eventdaystart]['startsite'] = true;
// Set event class for site event.
$events[$event->id]->class = 'calendar_event_site';
} else if ($event->courseid != 0 && $event->courseid != SITEID && $event->groupid == 0) {
$typesbyday[$eventdaystart]['startcourse'] = true;
// Set event class for course event.
$events[$event->id]->class = 'calendar_event_course';
} else if ($event->groupid) {
$typesbyday[$eventdaystart]['startgroup'] = true;
// Set event class for group event.
$events[$event->id]->class = 'calendar_event_group';
} else if ($event->userid) {
$typesbyday[$eventdaystart]['startuser'] = true;
// Set event class for user event.
$events[$event->id]->class = 'calendar_event_user';
}
}
if ($event->timeduration == 0) {
// Proceed with the next.
continue;
}
// The event starts on $month $year or before.
if ($startdate['mon'] == $month && $startdate['year'] == $year) {
$lowerbound = intval($startdate['mday']);
} else {
$lowerbound = 0;
}
// Also, it ends on $month $year or later.
if ($enddate['mon'] == $month && $enddate['year'] == $year) {
$upperbound = intval($enddate['mday']);
} else {
$upperbound = calendar_days_in_month($month, $year);
}
// Mark all days between $lowerbound and $upperbound (inclusive) as duration.
for ($i = $lowerbound + 1; $i <= $upperbound; ++$i) {
$durationbyday[$i][] = $event->id;
if ($event->courseid == SITEID && $event->groupid == 0) {
$typesbyday[$i]['durationsite'] = true;
} else if ($event->courseid != 0 && $event->courseid != SITEID && $event->groupid == 0) {
$typesbyday[$i]['durationcourse'] = true;
} else if ($event->groupid) {
$typesbyday[$i]['durationgroup'] = true;
} else if ($event->userid) {
$typesbyday[$i]['durationuser'] = true;
}
}
}
return;
}
+3 -197
View File
@@ -1180,17 +1180,11 @@ class calendar_information {
}
/**
* Initialize calendar information
*
* @deprecated 3.4
* @param stdClass $course object
* @param array $coursestoload An array of courses [$course->id => $course]
* @param bool $ignorefilters options to use filter
*/
public function prepare_for_view(stdClass $course, array $coursestoload, $ignorefilters = false) {
debugging('The prepare_for_view() function has been deprecated. Please update your code to use set_sources()',
DEBUG_DEVELOPER);
$this->set_sources($course, $coursestoload);
#[\core\attribute\deprecated('prepare_for_view', since: '3.4', mdl: 'MDL-59890', final: true)]
public function prepare_for_view() {
\core\deprecation::emit_deprecation_if_present([self::class, __FUNCTION__]);
}
/**
@@ -1516,28 +1510,6 @@ function calendar_get_starting_weekday() {
return $calendartype->get_starting_weekday();
}
/**
* Get a HTML link to a course.
*
* @param int|stdClass $course the course id or course object
* @return string a link to the course (as HTML); empty if the course id is invalid
*/
function calendar_get_courselink($course) {
if (!$course) {
return '';
}
if (!is_object($course)) {
$course = calendar_get_course_cached($coursecache, $course);
}
$context = \context_course::instance($course->id);
$fullname = format_string($course->fullname, true, array('context' => $context));
$url = new \moodle_url('/course/view.php', array('id' => $course->id));
$link = \html_writer::link($url, $fullname);
return $link;
}
/**
* Get current module cache.
*
@@ -1585,72 +1557,6 @@ function calendar_get_group_cached($groupid) {
return $groupscache[$groupid];
}
/**
* Add calendar event metadata
*
* @deprecated since 3.9
*
* @param stdClass $event event info
* @return stdClass $event metadata
*/
function calendar_add_event_metadata($event) {
debugging('This function is no longer used', DEBUG_DEVELOPER);
global $CFG, $OUTPUT;
// Support multilang in event->name.
$event->name = format_string($event->name, true);
if (!empty($event->modulename)) { // Activity event.
// The module name is set. I will assume that it has to be displayed, and
// also that it is an automatically-generated event. And of course that the
// instace id and modulename are set correctly.
$instances = get_fast_modinfo($event->courseid)->get_instances_of($event->modulename);
if (!array_key_exists($event->instance, $instances)) {
return;
}
$module = $instances[$event->instance];
$modulename = $module->get_module_type_name(false);
if (get_string_manager()->string_exists($event->eventtype, $event->modulename)) {
// Will be used as alt text if the event icon.
$eventtype = get_string($event->eventtype, $event->modulename);
} else {
$eventtype = '';
}
$event->icon = '<img src="' . s($module->get_icon_url()) . '" alt="' . s($eventtype) .
'" title="' . s($modulename) . '" class="icon" />';
$event->referer = html_writer::link($module->url, $event->name);
$event->courselink = calendar_get_courselink($module->get_course());
$event->cmid = $module->id;
} else if ($event->courseid == SITEID) { // Site event.
$event->icon = '<img src="' . $OUTPUT->image_url('i/siteevent') . '" alt="' .
get_string('siteevent', 'calendar') . '" class="icon" />';
$event->cssclass = 'calendar_event_site';
} else if ($event->courseid != 0 && $event->courseid != SITEID && $event->groupid == 0) { // Course event.
$event->icon = '<img src="' . $OUTPUT->image_url('i/courseevent') . '" alt="' .
get_string('courseevent', 'calendar') . '" class="icon" />';
$event->courselink = calendar_get_courselink($event->courseid);
$event->cssclass = 'calendar_event_course';
} else if ($event->groupid) { // Group event.
if ($group = calendar_get_group_cached($event->groupid)) {
$groupname = format_string($group->name, true, \context_course::instance($group->courseid));
} else {
$groupname = '';
}
$event->icon = \html_writer::empty_tag('image', array('src' => $OUTPUT->image_url('i/groupevent'),
'alt' => get_string('groupevent', 'calendar'), 'title' => $groupname, 'class' => 'icon'));
$event->courselink = calendar_get_courselink($event->courseid) . ', ' . $groupname;
$event->cssclass = 'calendar_event_group';
} else if ($event->userid) { // User event.
$event->icon = '<img src="' . $OUTPUT->image_url('i/userevent') . '" alt="' .
get_string('userevent', 'calendar') . '" class="icon" />';
$event->cssclass = 'calendar_event_user';
}
return $event;
}
/**
* Get calendar events by id.
*
@@ -1961,106 +1867,6 @@ function calendar_sub_month($month, $year) {
return $calendartype->get_prev_month($year, $month);
}
/**
* Get per-day basis events
*
* @param array $events list of events
* @param int $month the number of the month
* @param int $year the number of the year
* @param array $eventsbyday event on specific day
* @param array $durationbyday duration of the event in days
* @param array $typesbyday event type (eg: site, course, user, or group)
* @param array $courses list of courses
* @return void
*/
function calendar_events_by_day($events, $month, $year, &$eventsbyday, &$durationbyday, &$typesbyday, &$courses) {
$calendartype = \core_calendar\type_factory::get_calendar_instance();
$eventsbyday = array();
$typesbyday = array();
$durationbyday = array();
if ($events === false) {
return;
}
foreach ($events as $event) {
$startdate = $calendartype->timestamp_to_date_array($event->timestart);
if ($event->timeduration) {
$enddate = $calendartype->timestamp_to_date_array($event->timestart + $event->timeduration - 1);
} else {
$enddate = $startdate;
}
// Simple arithmetic: $year * 13 + $month is a distinct integer for each distinct ($year, $month) pair.
if (!($startdate['year'] * 13 + $startdate['mon'] <= $year * 13 + $month) &&
($enddate['year'] * 13 + $enddate['mon'] >= $year * 13 + $month)) {
continue;
}
$eventdaystart = intval($startdate['mday']);
if ($startdate['mon'] == $month && $startdate['year'] == $year) {
// Give the event to its day.
$eventsbyday[$eventdaystart][] = $event->id;
// Mark the day as having such an event.
if ($event->courseid == SITEID && $event->groupid == 0) {
$typesbyday[$eventdaystart]['startsite'] = true;
// Set event class for site event.
$events[$event->id]->class = 'calendar_event_site';
} else if ($event->courseid != 0 && $event->courseid != SITEID && $event->groupid == 0) {
$typesbyday[$eventdaystart]['startcourse'] = true;
// Set event class for course event.
$events[$event->id]->class = 'calendar_event_course';
} else if ($event->groupid) {
$typesbyday[$eventdaystart]['startgroup'] = true;
// Set event class for group event.
$events[$event->id]->class = 'calendar_event_group';
} else if ($event->userid) {
$typesbyday[$eventdaystart]['startuser'] = true;
// Set event class for user event.
$events[$event->id]->class = 'calendar_event_user';
}
}
if ($event->timeduration == 0) {
// Proceed with the next.
continue;
}
// The event starts on $month $year or before.
if ($startdate['mon'] == $month && $startdate['year'] == $year) {
$lowerbound = intval($startdate['mday']);
} else {
$lowerbound = 0;
}
// Also, it ends on $month $year or later.
if ($enddate['mon'] == $month && $enddate['year'] == $year) {
$upperbound = intval($enddate['mday']);
} else {
$upperbound = calendar_days_in_month($month, $year);
}
// Mark all days between $lowerbound and $upperbound (inclusive) as duration.
for ($i = $lowerbound + 1; $i <= $upperbound; ++$i) {
$durationbyday[$i][] = $event->id;
if ($event->courseid == SITEID && $event->groupid == 0) {
$typesbyday[$i]['durationsite'] = true;
} else if ($event->courseid != 0 && $event->courseid != SITEID && $event->groupid == 0) {
$typesbyday[$i]['durationcourse'] = true;
} else if ($event->groupid) {
$typesbyday[$i]['durationgroup'] = true;
} else if ($event->userid) {
$typesbyday[$i]['durationuser'] = true;
}
}
}
return;
}
/**
* Returns the courses to load events for.
*
+9 -105
View File
@@ -84,112 +84,16 @@ class core_calendar_renderer extends plugin_renderer_base {
}
/**
* Displays an event
*
* @deprecated since 3.9
*
* @param calendar_event $event
* @param bool $showactions
* @return string
* @deprecated 3.9
*/
public function event(calendar_event $event, $showactions=true) {
global $CFG;
debugging('This function is no longer used', DEBUG_DEVELOPER);
$event = calendar_add_event_metadata($event);
$context = $event->context;
$output = '';
$output .= $this->output->box_start('card-header clearfix');
if (calendar_edit_event_allowed($event) && $showactions) {
if (calendar_delete_event_allowed($event)) {
$editlink = new moodle_url(CALENDAR_URL.'event.php', array('action' => 'edit', 'id' => $event->id));
$deletelink = new moodle_url(CALENDAR_URL.'delete.php', array('id' => $event->id));
if (!empty($event->calendarcourseid)) {
$editlink->param('course', $event->calendarcourseid);
$deletelink->param('course', $event->calendarcourseid);
}
} else {
$params = array('update' => $event->cmid, 'return' => true, 'sesskey' => sesskey());
$editlink = new moodle_url('/course/mod.php', $params);
$deletelink = null;
}
$commands = html_writer::start_tag('div', array('class' => 'commands float-sm-end'));
$commands .= html_writer::start_tag('a', array('href' => $editlink));
$str = get_string('tt_editevent', 'calendar');
$commands .= $this->output->pix_icon('t/edit', $str);
$commands .= html_writer::end_tag('a');
if ($deletelink != null) {
$commands .= html_writer::start_tag('a', array('href' => $deletelink));
$str = get_string('tt_deleteevent', 'calendar');
$commands .= $this->output->pix_icon('t/delete', $str);
$commands .= html_writer::end_tag('a');
}
$commands .= html_writer::end_tag('div');
$output .= $commands;
}
if (!empty($event->icon)) {
$output .= $event->icon;
} else {
$output .= $this->output->spacer(array('height' => 16, 'width' => 16));
}
if (!empty($event->referer)) {
$output .= $this->output->heading($event->referer, 3, array('class' => 'referer'));
} else {
$output .= $this->output->heading(
format_string($event->name, false, array('context' => $context)),
3,
array('class' => 'name d-inline-block')
);
}
// Show subscription source if needed.
if (!empty($event->subscription) && $CFG->calendar_showicalsource) {
if (!empty($event->subscription->url)) {
$source = html_writer::link($event->subscription->url,
get_string('subscriptionsource', 'calendar', $event->subscription->name));
} else {
// File based ical.
$source = get_string('subscriptionsource', 'calendar', $event->subscription->name);
}
$output .= html_writer::tag('div', $source, array('class' => 'subscription'));
}
if (!empty($event->courselink)) {
$output .= html_writer::tag('div', $event->courselink);
}
if (!empty($event->time)) {
$output .= html_writer::tag('span', $event->time, array('class' => 'date float-sm-end me-1'));
} else {
$humantime = \core_calendar\output\humandate::create_from_timestamp(
timestamp: $event->timestart,
near: null,
timeonly: true,
);
$output .= html_writer::tag('span', $this->output->render($humantime));
}
if (!empty($event->actionurl)) {
$actionlink = html_writer::link(new moodle_url($event->actionurl), $event->actionname);
$output .= html_writer::tag('div', $actionlink, ['class' => 'action']);
}
$output .= $this->output->box_end();
$eventdetailshtml = '';
$eventdetailsclasses = '';
$eventdetailshtml .= format_text($event->description, $event->format, array('context' => $context));
$eventdetailsclasses .= 'description card-block';
if (isset($event->cssclass)) {
$eventdetailsclasses .= ' '.$event->cssclass;
}
if (!empty($eventdetailshtml)) {
$output .= html_writer::tag('div', $eventdetailshtml, array('class' => $eventdetailsclasses));
}
$eventhtml = html_writer::tag('div', $output, array('class' => 'card'));
return html_writer::tag('div', $eventhtml, array('class' => 'event', 'id' => 'event_' . $event->id));
#[\core\attribute\deprecated(
replacement: 'event no longer used',
since: '3.9',
mdl: 'MDL-58866',
final: true,
)]
public function event() {
\core\deprecation::emit_deprecation_if_present(__FUNCTION__);
}
/**
+9 -7
View File
@@ -34,7 +34,6 @@ $string['calendarpreferences'] = 'Calendar preferences';
$string['calendartypes'] = 'Calendar types';
$string['calendarurlcopiedtoclipboard'] = 'Calendar URL copied to clipboard';
$string['category'] = 'Category';
$string['categoryevent'] = 'Category event';
$string['clickhide'] = 'click to hide';
$string['clickshow'] = 'click to show';
$string['colcalendar'] = 'Calendar';
@@ -49,7 +48,6 @@ $string['copycalendarurl'] = 'Copy calendar URL';
$string['copyurl'] = 'Copy URL';
$string['course'] = 'Course';
$string['coursecalendarlink'] = 'Course calendar';
$string['courseevent'] = 'Course event';
$string['courseevents'] = 'Course events';
$string['categoryevents'] = 'Category events';
$string['courses'] = 'Courses';
@@ -156,7 +154,6 @@ $string['generateurlbutton'] = 'Get calendar URL';
$string['gotoactivity'] = 'Go to activity';
$string['gotocalendar'] = 'Go to calendar';
$string['group'] = 'Group';
$string['groupevent'] = 'Group event';
$string['groupevents'] = 'Group events';
$string['eventtypesite'] = 'site';
$string['eventtypecategory'] = 'category';
@@ -235,7 +232,6 @@ $string['sat'] = 'Sat';
$string['saturday'] = 'Saturday';
$string['shown'] = 'shown';
$string['site'] = 'Site';
$string['siteevent'] = 'Site event';
$string['siteevents'] = 'Site events';
$string['spanningevents'] = 'Events underway';
$string['subscriptions'] = 'Subscriptions';
@@ -256,8 +252,6 @@ $string['timeperiod'] = 'Time period';
$string['today'] = 'Today';
$string['todayplustitle'] = 'Today {$a}';
$string['tomorrow'] = 'Tomorrow';
$string['tt_deleteevent'] = 'Delete event';
$string['tt_editevent'] = 'Edit event';
$string['tue'] = 'Tue';
$string['tuesday'] = 'Tuesday';
$string['typeclose'] = 'Close event';
@@ -273,7 +267,6 @@ $string['upcomingevents'] = 'Upcoming events';
$string['upcomingeventsfor'] = 'Upcoming events for:';
$string['urlforical'] = 'URL for iCalendar export, for subscribing to calendar';
$string['user'] = 'User';
$string['userevent'] = 'User event';
$string['userevents'] = 'User events';
$string['viewupcomingactivitiesdue'] = 'View the upcoming activities due';
$string['wed'] = 'Wed';
@@ -293,3 +286,12 @@ $string['coursecalendar'] = '{$a} calendar';
// Deprecated since Moodle 4.5.
$string['importcalendarexternal'] = 'Import an external calendar?';
$string['nocalendarsubscriptions'] = 'No calendar subscriptions yet. Do you want to {$a}';
// Deprecated since Moodle 5.0.
$string['categoryevent'] = 'Category event';
$string['courseevent'] = 'Course event';
$string['groupevent'] = 'Group event';
$string['siteevent'] = 'Site event';
$string['tt_deleteevent'] = 'Delete event';
$string['tt_editevent'] = 'Edit event';
$string['userevent'] = 'User event';
+7
View File
@@ -166,3 +166,10 @@ version_help,core_badges
atto_h5p,core_h5p
atto_h5p_description,core_h5p
sqliteextensionisnotpresentinphp,core_install
siteevent,core_calendar
categoryevent,core_calendar
courseevent,core_calendar
groupevent,core_calendar
tt_deleteevent,core_calendar
tt_editevent,core_calendar
userevent,core_calendar