Browse Source

Merge pull request #68 from sudile/dev-notifications

Notification improvements
SABERES_37_STABLE
Flotter Totte 8 years ago
committed by GitHub
parent
commit
6c13e4a223
  1. 40
      db/messages.php
  2. 25
      db/upgrade.php
  3. 26
      edit.php
  4. 10
      edit_form.php
  5. 16
      lang/en/enrol_apply.php
  6. 145
      lib.php
  7. 64
      notification.php
  8. 22
      settings.php
  9. 2
      version.php

40
db/messages.php

@ -0,0 +1,40 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package enrol_apply
* @copyright 2016 sudile GbR (http://www.sudile.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @author Johannes Burk <johannes.burk@sudile.com>
*/
defined('MOODLE_INTERNAL') || die();
$messageproviders = array (
// Notify teacher/manager that a student has applied for a course enrolment.
'application' => array (
'capability' => 'enrol/apply:manageapplications'
),
// Notify student that his application was confirmed.
'confirmation' => array (),
// Notify student that his application was canceled.
'cancelation' => array (),
// Notify student that his application was deferred (put on a waiting list).
'waitinglist' => array (),
);

25
db/upgrade.php

@ -67,6 +67,31 @@ function xmldb_enrol_apply_upgrade($oldversion) {
}
}
if ($oldversion < 2016060803) {
// Convert old notification settings.
$enrolapply = enrol_get_plugin('apply');
$sendmailtoteacher = $enrolapply->get_config('sendmailtoteacher');
$notifycoursebased = $sendmailtoteacher;
$enrolapply->set_config('notifycoursebased', $notifycoursebased);
$enrolapply->set_config('sendmailtoteacher', null);
$sendmailtomanager = $enrolapply->get_config('sendmailtomanager');
$notifyglobal = $sendmailtomanager ? '$@ALL@$' : '';
$enrolapply->set_config('notifyglobal', $notifyglobal);
$enrolapply->set_config('sendmailtomanager', null);
$instances = $DB->get_records('enrol', array('enrol' => 'apply'));
foreach ($instances as $instance) {
$sendmailtoteacher = $instance->customint3;
$notify = $sendmailtoteacher ? '$@ALL@$' : '';
$instance->customtext2 = $notify;
$instance->customint3 = null;
$instance->customint4 = null;
$DB->update_record('enrol', $instance, true);
}
}
return true;
}

26
edit.php

@ -61,19 +61,39 @@ if ($instanceid) {
$instance->courseid = $course->id;
}
// Process notify setting for editing...
// Convert to array for use with multi-select element.
$notify = array('$@NONE@$');
if ($instance->customtext2 != '') {
$notify = explode(',', $instance->customtext2);
}
$instance->notify = $notify;
$mform = new enrol_apply_edit_form(null, array($instance, $plugin, $context));
if ($mform->is_cancelled()) {
redirect($return);
} else if ($data = $mform->get_data()) {
// Process notify setting for storing...
// Note: Mostly copied from admin_setting_users_with_capability::write_setting().
$notify = $data->notify;
// If all is selected, remove any explicit options.
if (in_array('$@ALL@$', $notify)) {
$notify = array('$@ALL@$');
}
// None never needs to be written to the DB.
if (in_array('$@NONE@$', $notify)) {
unset($notify[array_search('$@NONE@$', $notify)]);
}
// Convert back to string for storing in enrol table.
$data->customtext2 = implode(',', $notify);
if ($instance->id) {
$instance->status = $data->status;
$instance->name = $data->name;
$instance->customtext1 = $data->customtext1;
$instance->customtext2 = $data->customtext2;
$instance->customint1 = $data->customint1;
$instance->customint2 = $data->customint2;
$instance->customint3 = $data->customint3;
$instance->roleid = $data->roleid;
$instance->timemodified = time();
$DB->update_record('enrol', $instance);
@ -85,8 +105,8 @@ if ($mform->is_cancelled()) {
'roleid' => $data->roleid,
'customint1' => $data->customint1,
'customint2' => $data->customint2,
'customint3' => $data->customint3,
'customtext1' => $data->customtext1);
'customtext1' => $data->customtext1,
'customtext2' => $data->customtext2);
$plugin->add_instance($course, $fields);
}

10
edit_form.php

@ -60,7 +60,15 @@ class enrol_apply_edit_form extends moodleform {
$mform->addElement('select', 'customint2', get_string('show_extra_user_profile', 'enrol_apply'), $options);
$mform->setDefault('customint2', $plugin->get_config('customint2'));
$mform->addElement('advcheckbox', 'customint3', get_string('sendmailtoteacher', 'enrol_apply'));
$choices = array(
'$@NONE@$' => get_string('nobody'),
'$@ALL@$' => get_string('everyonewhocan', 'admin', get_capability_string('enrol/apply:manageapplications')));
$users = get_enrolled_users($context, 'enrol/apply:manageapplications');
foreach ($users as $userid => $user) {
$choices[$userid] = fullname($user);
}
$select = $mform->addElement('select', 'notify', get_string('notify_desc', 'enrol_apply'), $choices);
$select->setMultiple(true);
$mform->addElement('hidden', 'id');
$mform->setType('id', PARAM_INT);

16
lang/en/enrol_apply.php

@ -50,8 +50,20 @@ $string['cancelmailcontent_desc'] = 'Please use the following special marks to r
$string['notify_heading'] = 'Notification settings';
$string['notify_desc'] = 'Define who gets notified about new enrolment applications.';
$string['sendmailtoteacher'] = 'Send email notification to teachers';
$string['sendmailtomanager'] = 'Send email notification to managers';
$string['notifycoursebased'] = "New enrolment application notification (instance based, eg. course teachers)";
$string['notifycoursebased_desc'] = "Default for new instances: Notify everyone who have the 'Manage apply enrolment' capability for the corresponding course (eg. teachers and managers)";
$string['notifyglobal'] = "New enrolment application notification (global, eg. global managers and admins)";
$string['notifyglobal_desc'] = "Define who gets notified about new enrolment applications for any course.";
$string['messageprovider:application'] = 'Course enrolment application notifications';
$string['messageprovider:confirmation'] = 'Course enrolment application confirmation notifications';
$string['messageprovider:cancelation'] = 'Course enrolment application cancelation notifications';
$string['messageprovider:waitinglist'] = 'Course enrolment application defer notifications';
$string['newapplicationnotification'] = 'There is a new course enrolment application awaiting review.';
$string['applicationconfirmednotification'] = 'Your course enrolment application was confirmed.';
$string['applicationcancelednotification'] = 'Your course enrolment application was canceled.';
$string['applicationdeferrednotification'] = 'Your course enrolment application was deferred (you are currently on the waiting list).';
$string['confirmusers'] = 'Enrol Confirm';
$string['confirmusers_desc'] = 'Users in gray colored rows are on the waiting list.';

145
lib.php

@ -200,8 +200,7 @@ class enrol_apply_plugin extends enrol_plugin {
$fields['roleid'] = $this->get_config('roleid', 0);
$fields['customint1'] = $this->get_config('show_standard_user_profile');
$fields['customint2'] = $this->get_config('show_extra_user_profile');
$fields['customint3'] = $this->get_config('sendmailtoteacher');
$fields['customint4'] = $this->get_config('sendmailtomanager');
$fields['customtext2'] = $this->get_config('notifycoursebased') ? '$@ALL@$' : '';
return $fields;
}
@ -230,9 +229,12 @@ class enrol_apply_plugin extends enrol_plugin {
$this->update_user_enrol($instance, $userenrolment->userid, ENROL_USER_ACTIVE);
$DB->delete_records('enrol_apply_applicationinfo', array('userenrolmentid' => $enrol));
$subject = get_config('enrol_apply', 'confirmmailsubject');
$body = get_config('enrol_apply', 'confirmmailcontent');
$this->send_mail_to_applicant($instance, $userenrolment->userid, $subject, $body);
$this->notify_applicant(
$instance,
$userenrolment->userid,
'confirmation',
get_config('enrol_apply', 'confirmmailsubject'),
get_config('enrol_apply', 'confirmmailcontent'));
}
}
@ -255,9 +257,12 @@ class enrol_apply_plugin extends enrol_plugin {
$this->update_user_enrol($instance, $userenrolment->userid, ENROL_APPLY_USER_WAIT);
$subject = get_config('enrol_apply', 'waitmailsubject');
$body = get_config('enrol_apply', 'waitmailcontent');
$this->send_mail_to_applicant($instance, $userenrolment->userid, $subject, $body);
$this->notify_applicant(
$instance,
$userenrolment->userid,
'waitinglist',
get_config('enrol_apply', 'waitmailsubject'),
get_config('enrol_apply', 'waitmailcontent'));
}
}
}
@ -286,26 +291,41 @@ class enrol_apply_plugin extends enrol_plugin {
$this->unenrol_user($instance, $userenrolment->userid);
$DB->delete_records('enrol_apply_applicationinfo', array('userenrolmentid' => $enrol));
$subject = get_config('enrol_apply', 'cancelmailsubject');
$body = get_config('enrol_apply', 'cancelmailcontent');
$this->send_mail_to_applicant($instance, $userenrolment->userid, $subject, $body);
$this->notify_applicant(
$instance,
$userenrolment->userid,
'cancelation',
get_config('enrol_apply', 'cancelmailsubject'),
get_config('enrol_apply', 'cancelmailcontent'));
}
}
private function send_mail_to_applicant($instance, $userid, $subject, $body) {
global $DB;
private function notify_applicant($instance, $userid, $type, $subject, $content) {
global $CFG;
require_once($CFG->dirroot.'/enrol/apply/notification.php');
// Required for course_get_url() function.
require_once($CFG->dirroot.'/course/lib.php');
$course = get_course($instance->courseid);
$user = core_user::get_user($userid);
$body = $this->update_mail_content($body, $course, $user);
$contact = core_user::get_support_user();
email_to_user($user, $contact, $subject, html_to_text($body), $body);
$content = $this->update_mail_content($content, $course, $user);
$message = new enrol_apply_notification(
$user,
core_user::get_support_user(),
$type,
$subject,
$content,
course_get_url($course));
message_send($message);
}
private function send_application_notification($instance, $userid, $data) {
global $CFG, $PAGE;
require_once($CFG->dirroot.'/enrol/apply/notification.php');
// Required for course_get_url() function.
require_once($CFG->dirroot.'/course/lib.php');
$renderer = $PAGE->get_renderer('enrol_apply');
@ -328,45 +348,98 @@ class enrol_apply_plugin extends enrol_plugin {
$extrauserfields = $user->profile;
}
// Send notification to Teachers? Instance depending.
if ($instance->customint3 == 1) {
$context = context_course::instance($instance->courseid);
$editingteacherroles = get_archetype_roles('editingteacher');
$editingteacherrole = reset($editingteacherroles);
$teachers = get_role_users($editingteacherrole->id, $context);
// Send notification to users with manageapplications in course context (instance depending)?
$courseuserstonotify = $this->get_notifycoursebased_users($instance);
if (!empty($courseuserstonotify)) {
$manageurl = new moodle_url("/enrol/apply/manage.php", array('id' => $instance->id));
$body = $renderer->application_notification_mail_body(
$content = $renderer->application_notification_mail_body(
$course,
$user,
$manageurl,
$data->applydescription,
$standarduserfields,
$extrauserfields);
foreach ($teachers as $teacher) {
email_to_user($teacher, $contact, get_string('mailtoteacher_suject', 'enrol_apply'), html_to_text($body), $body);
foreach ($courseuserstonotify as $user) {
$message = new enrol_apply_notification(
$user,
$contact,
'application',
get_string('mailtoteacher_suject', 'enrol_apply'),
$content,
$manageurl);
message_send($message);
}
}
// Send notification to managers in system context?
if (get_config('enrol_apply', 'sendmailtomanager') == 1) {
$context = context_system::instance();
$managerroles = get_archetype_roles('manager');
$managerrole = reset($editingteacherroles);
$managers = get_role_users($managerrole->id, $context);
// Send notification to users with manageapplications in system context?
$globaluserstonotify = $this->get_notifyglobal_users();
$globaluserstonotify = array_udiff($globaluserstonotify, $courseuserstonotify, function($usera, $userb) {
return $usera->id == $userb->id ? 0 : -1;
});
if (!empty($globaluserstonotify)) {
$manageurl = new moodle_url('/enrol/apply/manage.php');
$body = $renderer->application_notification_mail_body(
$content = $renderer->application_notification_mail_body(
$course,
$user,
$manageurl,
$data->applydescription,
$standarduserfields,
$extrauserfields);
foreach ($managers as $manager) {
email_to_user($manager, $contact, get_string('mailtoteacher_suject', 'enrol_apply'), html_to_text($body), $body);
foreach ($globaluserstonotify as $user) {
$message = new enrol_apply_notification(
$user,
$contact,
'application',
get_string('mailtoteacher_suject', 'enrol_apply'),
$content,
$manageurl);
message_send($message);
}
}
}
/**
* Returns enrolled users of a course who should be notified about new course enrolment applications.
*
* Note: mostly copied from get_users_from_config() function in moodlelib.php.
* @param array $instance Enrol apply instance record.
* @return array Array of user IDs.
*/
public function get_notifycoursebased_users($instance) {
$value = $instance->customtext2;
if (empty($value) or $value === '$@NONE@$') {
return array();
}
$context = context_course::instance($instance->courseid);
// We have to make sure that users still have the necessary capability,
// it should be faster to fetch them all first and then test if they are present
// instead of validating them one-by-one.
$users = get_enrolled_users($context, 'enrol/apply:manageapplications');
if ($value === '$@ALL@$') {
return $users;
}
$result = array(); // Result in correct order.
$allowed = explode(',', $value);
foreach ($allowed as $uid) {
if (isset($users[$uid])) {
$user = $users[$uid];
$result[$user->id] = $user;
}
}
return $result;
}
/**
* Returns users who should be notified about new course enrolment applications.
* @return array Array of user IDs.
*/
public function get_notifyglobal_users() {
return get_users_from_config($this->get_config('notifyglobal'), 'enrol/apply:manageapplications');
}
private function update_mail_content($content, $course, $user) {

64
notification.php

@ -0,0 +1,64 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* @package enrol_apply
* @copyright 2016 sudile GbR (http://www.sudile.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @author Johannes Burk <johannes.burk@sudile.com>
*/
defined('MOODLE_INTERNAL') || die();
class enrol_apply_notification extends \core\message\message {
public function __construct($to, $from, $type, $subject, $content, $url) {
$this->component = 'enrol_apply';
switch ($type) {
case 'application':
$this->name = 'application';
$this->smallmessage = get_string('newapplicationnotification', 'enrol_apply');
break;
case 'confirmation':
$this->name = 'confirmation';
$this->smallmessage = get_string('applicationconfirmednotification', 'enrol_apply');
break;
case 'cancelation':
$this->name = 'cancelation';
$this->smallmessage = get_string('applicationcancelednotification', 'enrol_apply');
break;
case 'waitinglist':
$this->name = 'waitinglist';
$this->smallmessage = get_string('applicationdeferrednotification', 'enrol_apply');
break;
default:
throw new invalid_parameter_exception('Invalid enrol_apply notification type.');
break;
}
$this->userfrom = $from;
$this->userto = $to;
$this->subject = $subject;
$this->fullmessage = html_to_text($content);
$this->fullmessageformat = FORMAT_PLAIN;
$this->fullmessagehtml = $content;
$this->notification = true;
$this->contexturl = $url;
$this->contexturlname = get_string('course');
}
}

22
settings.php

@ -90,16 +90,12 @@ if ($ADMIN->fulltree) {
'enrol_apply_notify',
get_string('notify_heading', 'enrol_apply'),
get_string('notify_desc', 'enrol_apply')));
$settings->add(new admin_setting_configcheckbox(
'enrol_apply/sendmailtoteacher',
get_string('sendmailtoteacher', 'enrol_apply'),
'',
0));
$settings->add(new admin_setting_configcheckbox(
'enrol_apply/sendmailtomanager',
get_string('sendmailtomanager', 'enrol_apply'),
'',
0));
$settings->add(new admin_setting_users_with_capability(
'enrol_apply/notifyglobal',
get_string('notifyglobal', 'enrol_apply'),
get_string('notifyglobal_desc', 'enrol_apply'),
array(),
'enrol/apply:manageapplications'));
// Enrol instance defaults...
$settings->add(new admin_setting_heading('enrol_manual_defaults',
@ -130,6 +126,12 @@ if ($ADMIN->fulltree) {
$settings->add(new admin_setting_configselect('enrol_apply/roleid',
get_string('defaultrole', 'role'), '', $student->id, $options));
}
$settings->add(new admin_setting_configcheckbox(
'enrol_apply/notifycoursebased',
get_string('notifycoursebased', 'enrol_apply'),
get_string('notifycoursebased_desc', 'enrol_apply'),
0));
}
if ($hassiteconfig) { // Needs this condition or there is error on login page.

2
version.php

@ -24,7 +24,7 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2016060800;
$plugin->version = 2016060803;
$plugin->requires = 2011080100;
$plugin->maturity = MATURITY_STABLE;
$plugin->release = 'Enrolment upon approval plugin Version 3.1-a';

Loading…
Cancel
Save