From b294665c2115c7cd2dd1bae0761357e12103321f Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 17 Sep 2020 17:57:13 +0200 Subject: [PATCH] MDL-65976 completion: New course completion message provider --- badges/tests/badgeslib_test.php | 8 ++++++-- completion/completion_completion.php | 30 ++++++++++++++++++++++++++++ lang/en/completion.php | 1 + lang/en/moodle.php | 1 + lib/db/messages.php | 3 +++ lib/tests/completionlib_test.php | 26 ++++++++++++++++++++++++ 6 files changed, 67 insertions(+), 2 deletions(-) diff --git a/badges/tests/badgeslib_test.php b/badges/tests/badgeslib_test.php index 596c67e853b..c4ec0e1acf6 100644 --- a/badges/tests/badgeslib_test.php +++ b/badges/tests/badgeslib_test.php @@ -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. diff --git a/completion/completion_completion.php b/completion/completion_completion.php index 04b05c4abf7..4ddc81ab281 100644 --- a/completion/completion_completion.php +++ b/completion/completion_completion.php @@ -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; } diff --git a/lang/en/completion.php b/lang/en/completion.php index 40918982454..5a84a6ffe26 100644 --- a/lang/en/completion.php +++ b/lang/en/completion.php @@ -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'] = '

Congratulations!

You just completed the following course: {$a->coursename}.

'; $string['coursecompletion'] = 'Course completion'; $string['coursecompletioncondition'] = 'Condition: {$a}'; $string['coursegrade'] = 'Course grade'; diff --git a/lang/en/moodle.php b/lang/en/moodle.php index f5a35c18d4a..bf203b59069 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -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'; diff --git a/lib/db/messages.php b/lib/db/messages.php index eeef52e06a4..1ffde1bb76a 100644 --- a/lib/db/messages.php +++ b/lib/db/messages.php @@ -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( diff --git a/lib/tests/completionlib_test.php b/lib/tests/completionlib_test.php index 53e4071882f..7b5ff6034c1 100644 --- a/lib/tests/completionlib_test.php +++ b/lib/tests/completionlib_test.php @@ -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. */