MDL-67494 calendar: set userid to zero for shared events

This commit is contained in:
Simey Lameze
2021-03-03 16:31:24 +08:00
parent b528e38d53
commit bc6fa0ad98
5 changed files with 159 additions and 106 deletions
+82 -37
View File
@@ -235,9 +235,18 @@ class calendar_event {
$data->eventtype = 'user';
}
// Default to the current user.
// Only user and user override type of events should record the user id.
// For all other event types we set userid to 0 as they are considered shared events.
if (empty($data->userid)) {
$data->userid = $USER->id;
if ($this->allow_custom_userid($data)) {
$data->userid = $USER->id;
} else {
$data->userid = 0;
}
}
if (empty($data->courseid) && $data->eventtype == 'site') {
$data->courseid = SITEID;
}
if (!empty($data->timeduration) && is_array($data->timeduration)) {
@@ -315,6 +324,28 @@ class calendar_event {
return !empty($this->properties->{$key});
}
/**
* Decide whether user id should be stored on the event or not.
*
* Only user events and user overrides type of events should retain user id.
*
* @param stdClass $data The event data object.
* @return bool
*/
protected function allow_custom_userid(stdClass $data): bool {
if ($data->eventtype === 'user') {
return true;
}
$isactionevent = !empty($data->type) && $data->type == CALENDAR_EVENT_TYPE_ACTION;
$isuseroverride = !empty($data->priority) && $data->priority == CALENDAR_EVENT_USER_OVERRIDE_PRIORITY;
if ($isactionevent && $isuseroverride) {
return true;
}
return false;
}
/**
* Calculate the context value needed for an event.
*
@@ -489,49 +520,18 @@ class calendar_event {
}
if ($usingeditor) {
switch ($this->properties->eventtype) {
case 'user':
$this->properties->courseid = 0;
$this->properties->course = 0;
$this->properties->groupid = 0;
$this->properties->userid = $USER->id;
break;
case 'site':
$this->properties->courseid = SITEID;
$this->properties->course = SITEID;
$this->properties->groupid = 0;
$this->properties->userid = $USER->id;
break;
case 'course':
$this->properties->groupid = 0;
$this->properties->userid = $USER->id;
break;
case 'category':
$this->properties->groupid = 0;
$this->properties->category = 0;
$this->properties->userid = $USER->id;
break;
case 'group':
$this->properties->userid = $USER->id;
break;
default:
// We should NEVER get here, but just incase we do lets fail gracefully.
$usingeditor = false;
break;
}
// If we are actually using the editor, we recalculate the context because some default values
// were set when calculate_context() was called from the constructor.
if ($usingeditor) {
$this->properties->context = $this->calculate_context();
$this->editorcontext = $this->get_context();
}
$this->properties->context = $this->calculate_context();
$this->editorcontext = $this->get_context();
$editor = $this->properties->description;
$this->properties->format = $this->properties->description['format'];
$this->properties->description = $this->properties->description['text'];
}
$this->set_default_event_ids();
// Insert the event into the database.
$this->properties->id = $DB->insert_record('event', $this->properties);
@@ -676,6 +676,8 @@ class calendar_event {
$event->trigger();
}
} else {
$this->set_default_event_ids();
$DB->update_record('event', $this->properties);
$event = self::load($this->properties->id);
$this->properties = $event->properties();
@@ -870,6 +872,49 @@ class calendar_event {
return $properties;
}
/**
* Set the default event ids.
*/
protected function set_default_event_ids(): void {
global $USER;
$userid = (!empty($this->properties->userid)) ? $this->properties->userid : $USER->id;
switch ($this->properties->eventtype) {
case 'user':
$this->properties->courseid = 0;
$this->properties->course = 0;
$this->properties->groupid = 0;
$this->properties->userid = $userid;
break;
case 'site':
$this->properties->courseid = SITEID;
$this->properties->course = SITEID;
$this->properties->groupid = 0;
$this->properties->userid = 0;
break;
case 'course':
$this->properties->groupid = 0;
$this->properties->userid = 0;
break;
case 'category':
$this->properties->groupid = 0;
$this->properties->category = 0;
$this->properties->userid = 0;
break;
case 'group':
$this->properties->userid = 0;
break;
}
// Only user overrides type of events should store user's id.
$isactionevent = !empty($this->properties->type) && $this->properties->type == CALENDAR_EVENT_TYPE_ACTION;
$isuseroverride = $isactionevent && !empty($this->properties->priority) &&
$this->properties->priority == CALENDAR_EVENT_USER_OVERRIDE_PRIORITY;
if ($isuseroverride) {
$this->properties->userid = $userid;
}
}
/**
* Toggles the visibility of an event
*
+28 -28
View File
@@ -608,8 +608,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 6; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course1->id,
@@ -619,8 +619,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 6; $i < 12; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course2->id,
@@ -663,8 +663,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 6; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course1->id,
@@ -674,8 +674,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 6; $i < 12; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course2->id,
@@ -719,8 +719,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 6; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course1->id,
@@ -730,8 +730,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 6; $i < 12; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course2->id,
@@ -773,8 +773,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 21; $i++) {
$records[] = create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course1->id,
@@ -784,8 +784,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 21; $i < 41; $i++) {
$records[] = create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course2->id,
@@ -830,8 +830,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 41; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course1->id,
@@ -901,8 +901,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 21; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course1->id,
@@ -912,8 +912,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 21; $i < 41; $i++) {
create_event([
'name' => sprintf('Event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course2->id,
@@ -979,8 +979,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 11; $i++) {
$records[] = create_event([
'name' => sprintf('1 event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course1->id,
@@ -990,8 +990,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 11; $i++) {
$records[] = create_event([
'name' => sprintf('2 event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course1->id,
@@ -1002,8 +1002,8 @@ class core_calendar_event_vault_testcase extends advanced_testcase {
for ($i = 1; $i < 11; $i++) {
$records[] = create_event([
'name' => sprintf('3 event %d', $i),
'eventtype' => 'user',
'userid' => $user->id,
'eventtype' => 'due',
'userid' => 0,
'timesort' => $i,
'type' => CALENDAR_EVENT_TYPE_ACTION,
'courseid' => $course2->id,
+39 -35
View File
@@ -96,13 +96,6 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
} else {
$prop->repeat = 1;
}
if (empty($prop->userid)) {
if (!empty($userid)) {
$prop->userid = $userid;
} else {
$prop->userid = 0;
}
}
if (!isset($prop->courseid)) {
$prop->courseid = $SITE->id;
}
@@ -390,44 +383,54 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$this->setUser($user);
$events = core_calendar_external::get_calendar_events($paramevents, $options);
$events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events);
$this->assertEquals(2, count($events['events'])); // site, user.
$this->assertEquals(2, count($events['warnings'])); // course, group.
// There should be a single user event.
$this->assertEquals(1, count($events['events']));
// There should be only two events (course and group).
$this->assertEquals(2, count($events['warnings']));
$role = $DB->get_record('role', array('shortname' => 'student'));
$this->getDataGenerator()->enrol_user($user->id, $course->id, $role->id);
$events = core_calendar_external::get_calendar_events($paramevents, $options);
$events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events);
$this->assertEquals(4, count($events['events'])); // site, user, both course events.
$this->assertEquals(1, count($events['warnings'])); // group.
// There should be a site and both course events.
$this->assertEquals(3, count($events['events']));
// There should be a warning related to group event.
$this->assertEquals(1, count($events['warnings']));
$options = array ('siteevents' => true, 'userevents' => true, 'timeend' => time() + HOURSECS);
$events = core_calendar_external::get_calendar_events($paramevents, $options);
$events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events);
$this->assertEquals(3, count($events['events'])); // site, user, one course event.
$this->assertEquals(1, count($events['warnings'])); // group.
// There should be a site and a course event.
$this->assertEquals(2, count($events['events']));
// There should be a warning related to group event.
$this->assertEquals(1, count($events['warnings']));
groups_add_member($group, $user);
$events = core_calendar_external::get_calendar_events($paramevents, $options);
$events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events);
$this->assertEquals(4, count($events['events'])); // site, user, group, one course event.
// There should be a site, group, one course event.
$this->assertEquals(3, count($events['events']));
$this->assertEquals(0, count($events['warnings']));
$paramevents = array ('courseids' => array($course->id), 'groupids' => array($group->id));
$events = core_calendar_external::get_calendar_events($paramevents, $options);
$events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events);
$this->assertEquals(4, count($events['events'])); // site, user, group, one course event.
// There should be only site, course and group events.
$this->assertEquals(3, count($events['events']));
$this->assertEquals(0, count($events['warnings']));
$paramevents = array ('groupids' => array($group->id, 23));
$events = core_calendar_external::get_calendar_events($paramevents, $options);
$events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events);
$this->assertEquals(3, count($events['events'])); // site, user, group.
// There should be only site and group events.
$this->assertEquals(2, count($events['events']));
$this->assertEquals(1, count($events['warnings']));
$paramevents = array ('courseids' => array(23));
$events = core_calendar_external::get_calendar_events($paramevents, $options);
$events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events);
$this->assertEquals(2, count($events['events'])); // site, user.
// There should be a single site event.
$this->assertEquals(1, count($events['events']));
$this->assertEquals(1, count($events['warnings']));
$paramevents = array ();
@@ -468,7 +471,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$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']);
$this->assertCount(4, $events['events']);
// Hide the assignment.
set_coursemodule_visible($assign->cmid, 0);
@@ -479,7 +482,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$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']);
$this->assertCount(3, $events['events']);
// Create some category events.
$this->setAdminUser();
@@ -838,7 +841,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$now = time();
// Create two events - one for everybody in the course and one only for the first student.
$event1 = $this->create_calendar_event('Base event', 0, 'due', 0, $now + DAYSECS, $params + ['courseid' => $course->id]);
$event2 = $this->create_calendar_event('User event', $user->id, 'due', 0, $now + 2*DAYSECS, $params + ['courseid' => 0]);
$event2 = $this->create_calendar_event('User event', 0, 'user', 0, $now + 2 * DAYSECS, $params + ['courseid' => 0]);
// Retrieve course events for the second student - only one "Base event" is returned.
$this->setUser($user2);
@@ -850,14 +853,13 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$this->assertEquals(0, count($events['warnings']));
$this->assertEquals('Base event', $events['events'][0]['name']);
// Retrieve events for the first student - both events are returned.
// Retrieve events for the first student.
$this->setUser($user);
$events = core_calendar_external::get_calendar_events($paramevents, $options);
$events = external_api::clean_returnvalue(core_calendar_external::get_calendar_events_returns(), $events);
$this->assertEquals(2, count($events['events']));
$this->assertEquals(1, count($events['events']));
$this->assertEquals(0, count($events['warnings']));
$this->assertEquals('Base event', $events['events'][0]['name']);
$this->assertEquals('User event', $events['events'][1]['name']);
// Retrieve events by id as a teacher, 'User event' should be returned since teacher has access to this course.
$this->setUser($teacher);
@@ -1720,7 +1722,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$timedurationuntil->add($interval);
$formdata = [
'id' => 0,
'userid' => $user->id,
'userid' => 0,
'modulename' => '',
'instance' => 0,
'visible' => 1,
@@ -1781,7 +1783,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$timedurationuntil->add($interval);
$formdata = [
'id' => 0,
'userid' => $user->id,
'userid' => 0,
'modulename' => '',
'instance' => 0,
'visible' => 1,
@@ -1827,7 +1829,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
);
$event = $result['event'];
$this->assertEquals($user->id, $event['userid']);
$this->assertEquals(0, $event['userid']);
$this->assertEquals($formdata['eventtype'], $event['eventtype']);
$this->assertEquals($formdata['name'], $event['name']);
}
@@ -1847,7 +1849,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$timedurationuntil->add($interval);
$formdata = [
'id' => 0,
'userid' => $user->id,
'userid' => 0,
'modulename' => '',
'instance' => 0,
'visible' => 1,
@@ -1958,7 +1960,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
);
$event = $result['event'];
$this->assertEquals($user->id, $event['userid']);
$this->assertEquals(0, $event['userid']);
$this->assertEquals($formdata['eventtype'], $event['eventtype']);
$this->assertEquals($formdata['name'], $event['name']);
$this->assertEquals($formdata['courseid'], $event['course']['id']);
@@ -2046,7 +2048,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$timedurationuntil->add($interval);
$formdata = [
'id' => 0,
'userid' => $user->id,
'userid' => 0,
'modulename' => '',
'instance' => 0,
'visible' => 1,
@@ -2162,7 +2164,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
);
$event = $result['event'];
$this->assertEquals($user->id, $event['userid']);
$this->assertEquals(0, $event['userid']);
$this->assertEquals($formdata['eventtype'], $event['eventtype']);
$this->assertEquals($formdata['name'], $event['name']);
$this->assertEquals($group->id, $event['groupid']);
@@ -2185,7 +2187,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$timedurationuntil->add($interval);
$formdata = [
'id' => 0,
'userid' => $user->id,
'userid' => 0,
'modulename' => '',
'instance' => 0,
'visible' => 1,
@@ -2236,7 +2238,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
);
$event = $result['event'];
$this->assertEquals($user->id, $event['userid']);
$this->assertEquals(0, $event['userid']);
$this->assertEquals($formdata['eventtype'], $event['eventtype']);
$this->assertEquals($formdata['name'], $event['name']);
$this->assertEquals($group->id, $event['groupid']);
@@ -2259,7 +2261,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$timedurationuntil->add($interval);
$formdata = [
'id' => 0,
'userid' => $user->id,
'userid' => 0,
'modulename' => '',
'instance' => 0,
'visible' => 1,
@@ -2309,7 +2311,7 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
);
$event = $result['event'];
$this->assertEquals($user->id, $event['userid']);
$this->assertEquals(0, $event['userid']);
$this->assertEquals($formdata['eventtype'], $event['eventtype']);
$this->assertEquals($formdata['name'], $event['name']);
$this->assertEquals($group->id, $event['groupid']);
@@ -2581,8 +2583,10 @@ class core_calendar_externallib_testcase extends externallib_advanced_testcase {
$category = $generator->create_category(['visible' => 0]);
$name = 'Category Event (category: ' . $category->id . ')';
$record = new stdClass();
$record->eventtype = 'category';
$record->categoryid = $category->id;
$categoryevent = $this->create_calendar_event($name, $USER->id, 'category', 0, time(), $record);
$record->userid = 0;
$categoryevent = $this->create_calendar_event($name, 0, 'category', 0, time(), $record);
$events = [
'eventids' => [$categoryevent->id]
+6 -6
View File
@@ -154,8 +154,8 @@ class core_calendar_local_api_testcase extends advanced_testcase {
'courseid' => $course->id,
'modulename' => 'assign',
'instance' => $moduleinstance->id,
'userid' => 1,
'eventtype' => 'user',
'userid' => 0,
'eventtype' => 'due',
'repeats' => 0,
'timestart' => 1,
];
@@ -205,8 +205,8 @@ class core_calendar_local_api_testcase extends advanced_testcase {
'courseid' => $course->id,
'modulename' => 'assign',
'instance' => $moduleinstance->id,
'userid' => 1,
'eventtype' => 'user',
'userid' => 0,
'eventtype' => 'due',
'repeats' => 0,
'timestart' => 1,
];
@@ -257,8 +257,8 @@ class core_calendar_local_api_testcase extends advanced_testcase {
'courseid' => $course->id,
'modulename' => 'assign',
'instance' => $moduleinstance->id,
'userid' => 1,
'eventtype' => 'user',
'userid' => 0,
'eventtype' => 'due',
'repeats' => 0,
'timestart' => 1,
];
+4
View File
@@ -1139,19 +1139,23 @@ EOD;
break;
case 'group':
unset($record->categoryid);
unset($record->userid);
break;
case 'course':
unset($record->categoryid);
unset($record->groupid);
unset($record->userid);
break;
case 'category':
unset($record->courseid);
unset($record->groupid);
unset($record->userid);
break;
case 'site':
unset($record->categoryid);
unset($record->courseid);
unset($record->groupid);
unset($record->userid);
break;
}