MDL-65976 completion: New course completion message provider

This commit is contained in:
Juan Leyva 2020-09-17 17:57:13 +02:00
parent e049d30613
commit 417e5b9f84
6 changed files with 67 additions and 2 deletions

View File

@ -570,9 +570,13 @@ class core_badges_badgeslib_testcase extends advanced_testcase {
$this->assertFalse($badge->is_issued($this->user->id));
// Mark course as complete.
$sink = $this->redirectEmails();
$sink = $this->redirectMessages();
$ccompletion->mark_complete();
$this->assertCount(1, $sink->get_messages());
// Two messages are generated: One for the course completed and the other one for the badge awarded.
$messages = $sink->get_messages();
$this->assertCount(2, $messages);
$this->assertEquals('badgerecipientnotice', $messages[0]->eventtype);
$this->assertEquals('coursecompleted', $messages[1]->eventtype);
$sink->close();
// Check if badge is awarded.

View File

@ -173,6 +173,36 @@ class completion_completion extends data_object {
\core\event\course_completed::create_from_completion($data)->trigger();
}
// Notify user.
$course = get_course($data->course);
$messagesubject = get_string('coursecompleted', 'completion');
$a = [
'coursename' => get_course_display_name_for_list($course),
'courselink' => (string) new moodle_url('/course/view.php', array('id' => $course->id)),
];
$messagebody = get_string('coursecompletedmessage', 'completion', $a);
$messageplaintext = html_to_text($messagebody);
$eventdata = new \core\message\message();
$eventdata->courseid = $course->id;
$eventdata->component = 'moodle';
$eventdata->name = 'coursecompleted';
$eventdata->userfrom = core_user::get_noreply_user();
$eventdata->userto = $data->userid;
$eventdata->notification = 1;
$eventdata->subject = $messagesubject;
$eventdata->fullmessage = $messageplaintext;
$eventdata->fullmessageformat = FORMAT_HTML;
$eventdata->fullmessagehtml = $messagebody;
$eventdata->smallmessage = $messageplaintext;
if ($courseimage = \core_course\external\course_summary_exporter::get_course_image($course)) {
$eventdata->customdata = [
'notificationpictureurl' => $courseimage,
];
}
message_send($eventdata);
return $result;
}

View File

@ -122,6 +122,7 @@ $string['courseaggregation_any'] = 'ANY selected courses to be completed';
$string['coursealreadycompleted'] = 'You have already completed this course';
$string['coursecomplete'] = 'Course complete';
$string['coursecompleted'] = 'Course completed';
$string['coursecompletedmessage'] = '<p>Congratulations!</p><p>You just completed the following course: <a href="{$a->courselink}">{$a->coursename}</a>.</p>';
$string['coursecompletion'] = 'Course completion';
$string['coursecompletioncondition'] = 'Condition: {$a}';
$string['coursegrade'] = 'Course grade';

View File

@ -1231,6 +1231,7 @@ $string['messageprovider:badgecreatornotice'] = 'Badge creator notifications';
$string['messageprovider:badgerecipientnotice'] = 'Badge recipient notifications';
$string['messageprovider:competencyplancomment'] = 'Comment posted on a learning plan';
$string['messageprovider:competencyusercompcomment'] = 'Comment posted on a competency';
$string['messageprovider:coursecompleted'] = 'Course completed';
$string['messageprovider:courserequestapproved'] = 'Course creation request approval notification';
$string['messageprovider:courserequested'] = 'Course creation request notification';
$string['messageprovider:courserequestrejected'] = 'Course creation request rejection notification';

View File

@ -86,6 +86,9 @@ $messageproviders = array (
),
),
// Course completed. Requires course completion configured at course level. It does not work with just activity progress.
'coursecompleted' => [],
// Badge award notification to a badge recipient.
'badgerecipientnotice' => array (
'defaults' => array(

View File

@ -978,6 +978,32 @@ class core_completionlib_testcase extends advanced_testcase {
$this->assertEventLegacyData($data, $event);
}
/**
* Test course completed message.
*/
public function test_course_completed_message() {
$this->setup_data();
$this->setAdminUser();
$completionauto = array('completion' => COMPLETION_TRACKING_AUTOMATIC);
$ccompletion = new completion_completion(array('course' => $this->course->id, 'userid' => $this->user->id));
// Mark course as complete and get the message.
$sink = $this->redirectMessages();
$ccompletion->mark_complete();
$messages = $sink->get_messages();
$sink->close();
$this->assertCount(1, $messages);
$message = array_pop($messages);
$this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
$this->assertEquals($this->user->id, $message->useridto);
$this->assertEquals('coursecompleted', $message->eventtype);
$this->assertEquals(get_string('coursecompleted', 'completion'), $message->subject);
$this->assertContains($this->course->fullname, $message->fullmessage);
}
/**
* Test course completed event.
*/