MDL-47162 core_message: Add course id to message eventdata

This commit is contained in:
Amanda Doughty 2016-07-20 12:40:34 +01:00 committed by Eloy Lafuente (stronk7)
parent 577bd70d38
commit cc350fd9c8
34 changed files with 345 additions and 76 deletions

View file

@ -722,7 +722,8 @@ function badges_notify_badge_award(badge $badge, $userid, $issued, $filepathhash
$plaintext = html_to_text($message);
// Notify recipient.
$eventdata = new stdClass();
$eventdata = new \core\message\message();
$eventdata->courseid = $badge->courseid;
$eventdata->component = 'moodle';
$eventdata->name = 'badgerecipientnotice';
$eventdata->userfrom = $userfrom;
@ -758,7 +759,8 @@ function badges_notify_badge_award(badge $badge, $userid, $issued, $filepathhash
$creatormessage = get_string('creatorbody', 'badges', $a);
$creatorsubject = get_string('creatorsubject', 'badges', $badge->name);
$eventdata = new stdClass();
$eventdata = new \core\message\message();
$eventdata->courseid = $badge->courseid;
$eventdata->component = 'moodle';
$eventdata->name = 'badgecreatornotice';
$eventdata->userfrom = $userfrom;

View file

@ -122,7 +122,7 @@ abstract class scanner {
$subject = get_string('emailsubject', 'antivirus', format_string($site->fullname));
$admins = get_admins();
foreach ($admins as $admin) {
$eventdata = new \stdClass();
$eventdata = new \core\message\message();
$eventdata->component = 'moodle';
$eventdata->name = 'errors';
$eventdata->userfrom = get_admin();

View file

@ -33,6 +33,7 @@ defined('MOODLE_INTERNAL') || die();
* Extra information about event.
*
* - int messageid: the id of the message.
* - int courseid: the id of the related course.
* }
*
* @package core
@ -46,9 +47,10 @@ class message_sent extends base {
* @param int $userfromid
* @param int $usertoid
* @param int $messageid
* @param int|null $courseid
* @return message_sent
*/
public static function create_from_ids($userfromid, $usertoid, $messageid) {
public static function create_from_ids($userfromid, $usertoid, $messageid, $courseid = null) {
// We may be sending a message from the 'noreply' address, which means we are not actually sending a
// message from a valid user. In this case, we will set the userid to 0.
// Check if the userid is valid.
@ -56,6 +58,10 @@ class message_sent extends base {
$userfromid = 0;
}
if (is_null($courseid)) {
$courseid = SITEID;
}
$event = self::create(array(
'userid' => $userfromid,
'context' => \context_system::instance(),
@ -64,7 +70,8 @@ class message_sent extends base {
// In earlier versions it can either be the id in the 'message_read' or 'message' table.
// Now it is always the id from 'message' table. Please note that the record is still moved
// to the 'message_read' table later when message marked as read.
'messageid' => $messageid
'messageid' => $messageid,
'courseid' => $courseid
)
));
@ -143,6 +150,10 @@ class message_sent extends base {
if (!isset($this->other['messageid'])) {
throw new \coding_exception('The \'messageid\' value must be set in other.');
}
if (!isset($this->other['courseid'])) {
debugging('The \'courseid\' value must be set in other.', DEBUG_DEVELOPER);
}
}
public static function get_objectid_mapping() {
@ -155,6 +166,7 @@ class message_sent extends base {
$othermapped = array();
// The messages table could vary for older events - so cannot be mapped.
$othermapped['messageid'] = array('db' => base::NOT_MAPPED, 'restore' => base::NOT_MAPPED);
$othermapped['courseid'] = array('db' => base::NOT_MAPPED, 'restore' => base::NOT_MAPPED);
return $othermapped;
}
}

View file

@ -50,7 +50,7 @@ class manager {
*
* NOTE: to be used from message_send() only.
*
* @param \stdClass|\core\message\message $eventdata fully prepared event data for processors
* @param \core\message\message $eventdata fully prepared event data for processors
* @param \stdClass $savemessage the message saved in 'message' table
* @param array $processorlist list of processors for target user
* @return int $messageid the id from 'message' or 'message_read' table (false is not returned)
@ -63,11 +63,24 @@ class manager {
throw new \coding_exception('Message should be of type stdClass or \core\message\message');
}
if ($eventdata instanceof \stdClass) {
if (!isset($eventdata->courseid)) {
$eventdata->courseid = null;
}
debugging('eventdata as \stdClass is deprecated. Please use core\message\message instead.', DEBUG_DEVELOPER);
}
require_once($CFG->dirroot.'/message/lib.php'); // This is most probably already included from messagelib.php file.
if (empty($processorlist)) {
// Trigger event for sending a message - we need to do this before marking as read!
\core\event\message_sent::create_from_ids($eventdata->userfrom->id, $eventdata->userto->id, $savemessage->id)->trigger();
\core\event\message_sent::create_from_ids(
$eventdata->userfrom->id,
$eventdata->userto->id,
$savemessage->id,
$eventdata->courseid
)->trigger();
if ($savemessage->notification or empty($CFG->messaging)) {
// If they have deselected all processors and its a notification mark it read. The user doesn't want to be bothered.
@ -132,7 +145,12 @@ class manager {
}
// Trigger event for sending a message - must be done before marking as read.
\core\event\message_sent::create_from_ids($eventdata->userfrom->id, $eventdata->userto->id, $savemessage->id)->trigger();
\core\event\message_sent::create_from_ids(
$eventdata->userfrom->id,
$eventdata->userto->id,
$savemessage->id,
$eventdata->courseid
)->trigger();
if (empty($CFG->messaging)) {
// If messaging is disabled and they previously had forum notifications handled by the popup processor

View file

@ -56,6 +56,12 @@ defined('MOODLE_INTERNAL') || die();
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class message {
/** @var int Course id. */
private $courseid;
/** @var string Module name. */
private $modulename;
/** @var string Component name. */
private $component;
@ -104,10 +110,31 @@ class message {
/** @var string Name of the attachment. Note:- not all processors support this.*/
private $attachname;
/** @var int The time the message was created.*/
private $timecreated;
/** @var array a list of properties that is allowed for each message. */
private $properties = array('component', 'name', 'userfrom', 'userto', 'subject', 'fullmessage', 'fullmessageformat',
'fullmessagehtml', 'smallmessage', 'notification', 'contexturl', 'contexturlname', 'savedmessageid',
'replyto', 'attachment', 'attachname');
private $properties = array(
'courseid',
'modulename',
'component',
'name',
'userfrom',
'userto',
'subject',
'fullmessage',
'fullmessageformat',
'fullmessagehtml',
'smallmessage',
'notification',
'contexturl',
'contexturlname',
'replyto',
'savedmessageid',
'attachment',
'attachname',
'timecreated'
);
/** @var array property to store any additional message processor specific content */
private $additionalcontent = array();

View file

@ -798,7 +798,7 @@ class checker {
array('style' => 'font-size:smaller; color:#333;')));
foreach ($admins as $admin) {
$message = new \stdClass();
$message = new \core\message\message();
$message->component = 'moodle';
$message->name = 'availableupdate';
$message->userfrom = get_admin();

View file

@ -2655,7 +2655,7 @@ abstract class enrol_plugin {
$subject = get_string('expirymessageenrolledsubject', 'enrol_'.$name, $a);
$body = get_string('expirymessageenrolledbody', 'enrol_'.$name, $a);
$message = new stdClass();
$message = new \core\message\message();
$message->notification = 1;
$message->component = 'enrol_'.$name;
$message->name = 'expiry_notification';
@ -2716,7 +2716,7 @@ abstract class enrol_plugin {
$subject = get_string('expirymessageenrollersubject', 'enrol_'.$name, $a);
$body = get_string('expirymessageenrollerbody', 'enrol_'.$name, $a);
$message = new stdClass();
$message = new \core\message\message();
$message->notification = 1;
$message->component = 'enrol_'.$name;
$message->name = 'expiry_notification';

View file

@ -51,12 +51,20 @@ require_once(__DIR__ . '/../message/lib.php');
* earlier versions did not do it consistently either.
*
* @category message
* @param stdClass|\core\message\message $eventdata information about the message (component, userfrom, userto, ...)
* @param \core\message\message $eventdata information about the message (component, userfrom, userto, ...)
* @return mixed the integer ID of the new message or false if there was a problem with submitted data
*/
function message_send($eventdata) {
global $CFG, $DB;
if ($eventdata instanceof \stdClass) {
if (!isset($eventdata->courseid)) {
$eventdata->courseid = null;
}
debugging('eventdata as \stdClass is deprecated. Please use core\message\message instead.', DEBUG_DEVELOPER);
}
//new message ID to return
$messageid = false;
@ -119,6 +127,7 @@ function message_send($eventdata) {
// Create the message object
$savemessage = new stdClass();
$savemessage->courseid = $eventdata->courseid;
$savemessage->useridfrom = $eventdata->userfrom->id;
$savemessage->useridto = $eventdata->userto->id;
$savemessage->subject = $eventdata->subject;

View file

@ -424,7 +424,8 @@ class core_phpunit_advanced_testcase extends advanced_testcase {
$user2 = $this->getDataGenerator()->create_user();
// Any core message will do here.
$message1 = new stdClass();
$message1 = new \core\message\message();
$message1->courseid = 1;
$message1->component = 'moodle';
$message1->name = 'instantmessage';
$message1->userfrom = $user1;
@ -436,7 +437,8 @@ class core_phpunit_advanced_testcase extends advanced_testcase {
$message1->smallmessage = 'small message';
$message1->notification = 0;
$message2 = new stdClass();
$message2 = new \core\message\message();
$message2->courseid = 1;
$message2->component = 'moodle';
$message2->name = 'instantmessage';
$message2->userfrom = $user2;
@ -501,7 +503,8 @@ class core_phpunit_advanced_testcase extends advanced_testcase {
$sink = $this->redirectMessages();
$message3 = new stdClass();
$message3 = new \core\message\message();
$message3->courseid = 1;
$message3->component = 'xxxx_yyyyy';
$message3->name = 'instantmessage';
$message3->userfrom = $user2;
@ -547,7 +550,8 @@ class core_phpunit_advanced_testcase extends advanced_testcase {
$this->assertTrue(phpunit_util::is_redirecting_messages());
$this->assertEquals(1, $sink->count());
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = get_admin();

View file

@ -1109,7 +1109,7 @@ function portfolio_insane_notify_admins($insane, $instances=false) {
$smallbody = get_string('insanebodysmall', 'portfolio', $a);
foreach ($admins as $admin) {
$eventdata = new stdClass();
$eventdata = new \core\message\message();
$eventdata->modulename = 'portfolio';
$eventdata->component = 'portfolio';
$eventdata->name = 'notices';

View file

@ -48,6 +48,7 @@ class core_message_testcase extends advanced_testcase {
$user = $this->getDataGenerator()->create_user();
$message = new \core\message\message();
$message->courseid = SITEID;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $USER;
@ -82,6 +83,7 @@ class core_message_testcase extends advanced_testcase {
$stdclass = $message->get_eventobject_for_processor('test');
$this->assertSame($message->courseid, $stdclass->courseid);
$this->assertSame($message->component, $stdclass->component);
$this->assertSame($message->name, $stdclass->name);
$this->assertSame($message->userfrom, $stdclass->userfrom);
@ -143,6 +145,7 @@ class core_message_testcase extends advanced_testcase {
// Extra content for all types of messages.
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -171,9 +174,19 @@ class core_message_testcase extends advanced_testcase {
$this->assertRegExp('/test message body test/', $email->body);
$sink->clear();
// Test that event fired includes the courseid.
$eventsink = $this->redirectEvents();
$messageid = message_send($message);
$events = $eventsink->get_events();
$event = reset($events);
$this->assertEquals($message->courseid, $event->other['courseid']);
$eventsink->clear();
$sink->clear();
// Extra content for small message only. Shouldn't show up in emails as we sent fullmessage and fullmessagehtml only in
// the emails.
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -199,6 +212,14 @@ class core_message_testcase extends advanced_testcase {
$this->assertNotEmpty($email->header);
$this->assertNotEmpty($email->body);
$this->assertNotRegExp('/test message body test/', $email->body);
// Test that event fired includes the courseid.
$eventsink = $this->redirectEvents();
$messageid = message_send($message);
$events = $eventsink->get_events();
$event = reset($events);
$this->assertEquals($message->courseid, $event->other['courseid']);
$eventsink->close();
$sink->close();
}
}

View file

@ -37,7 +37,8 @@ class core_messagelib_testcase extends advanced_testcase {
$preferences = get_message_output_default_preferences();
$this->assertTrue($preferences->$disableprovidersetting == 1);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = get_admin();
@ -189,7 +190,8 @@ class core_messagelib_testcase extends advanced_testcase {
$user2 = $this->getDataGenerator()->create_user();
// Test basic message redirection.
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -225,7 +227,8 @@ class core_messagelib_testcase extends advanced_testcase {
$this->assertFalse($DB->record_exists('message', array()));
$DB->delete_records('message_read', array());
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1->id;
@ -263,7 +266,8 @@ class core_messagelib_testcase extends advanced_testcase {
// Test phpunit problem detection.
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'xxxxx';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -298,7 +302,8 @@ class core_messagelib_testcase extends advanced_testcase {
// Invalid users.
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -314,7 +319,8 @@ class core_messagelib_testcase extends advanced_testcase {
$this->assertFalse($messageid);
$this->assertDebuggingCalled('Attempt to send msg to unknown user');
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = -1;
@ -330,7 +336,8 @@ class core_messagelib_testcase extends advanced_testcase {
$this->assertFalse($messageid);
$this->assertDebuggingCalled('Attempt to send msg from unknown user');
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -349,7 +356,8 @@ class core_messagelib_testcase extends advanced_testcase {
// Some debugging hints for devs.
unset($user2->emailstop);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -393,7 +401,8 @@ class core_messagelib_testcase extends advanced_testcase {
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'none', $user2);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -420,7 +429,8 @@ class core_messagelib_testcase extends advanced_testcase {
$CFG->messaging = 0;
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -447,7 +457,8 @@ class core_messagelib_testcase extends advanced_testcase {
$CFG->messaging = 1;
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -474,7 +485,8 @@ class core_messagelib_testcase extends advanced_testcase {
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -504,7 +516,8 @@ class core_messagelib_testcase extends advanced_testcase {
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -537,7 +550,8 @@ class core_messagelib_testcase extends advanced_testcase {
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email,popup', $user2);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -570,7 +584,8 @@ class core_messagelib_testcase extends advanced_testcase {
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'popup', $user2);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -604,7 +619,8 @@ class core_messagelib_testcase extends advanced_testcase {
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'none', $user2);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -635,7 +651,8 @@ class core_messagelib_testcase extends advanced_testcase {
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2);
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -716,7 +733,8 @@ class core_messagelib_testcase extends advanced_testcase {
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -778,7 +796,8 @@ class core_messagelib_testcase extends advanced_testcase {
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = $user1;
@ -835,7 +854,8 @@ class core_messagelib_testcase extends advanced_testcase {
);
$file = $fs->create_file_from_string($filerecord, 'Test content');
$message = new stdClass();
$message = new \core\message\message();
$message->courseid = 1;
$message->component = 'moodle';
$message->name = 'instantmessage';
$message->userfrom = get_admin();

View file

@ -119,6 +119,8 @@ information provided here is intended especially for developers.
* Webservice function mod_assign_get_submissions returns a new field 'gradingstatus' from each submission.
* The return signature for the antivirus::scan_file() function has changed.
The calling function will now handle removal of infected files from Moodle based on the new integer return value.
* The first parameter $eventdata of \core\manager::send_message() should be \core\message. usage of \stdClass is depecated.
* message_sent::create_from_ids has an additional required parameter $courseid with a default value of SITEID.
=== 3.1 ===