MDL-39961 Events: Replace Legacy events - User

This change includes:
* Added user_updated event, replacing old event
* Added user_created event, replacing old event
* Added user_deleted event, replacing old event
* Added user_loggedout event, replacing old event
* Added user_enrolment_created event, replacing old event
* Added user_enrolment_deleted event, replacing old event
* Added user_enrolment_updated event, replacing old event
This commit is contained in:
Rajesh Taneja
2013-09-02 16:10:05 +08:00
committed by Damyon Wiese
parent 80032fea02
commit bb78e249cd
38 changed files with 1519 additions and 339 deletions
+4 -9
View File
@@ -27,6 +27,7 @@ require('../../../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/csvlib.class.php');
require_once($CFG->dirroot.'/user/profile/lib.php');
require_once($CFG->dirroot.'/user/lib.php');
require_once($CFG->dirroot.'/group/lib.php');
require_once($CFG->dirroot.'/cohort/lib.php');
require_once('locallib.php');
@@ -654,9 +655,8 @@ if ($formdata = $mform2->is_cancelled()) {
}
if ($doupdate or $existinguser->password !== $oldpw) {
// we want only users that were really updated
$DB->update_record('user', $existinguser);
// We want only users that were really updated.
user_update_user($existinguser, false);
$upt->track('status', $struserupdated);
$usersupdated++;
@@ -668,8 +668,6 @@ if ($formdata = $mform2->is_cancelled()) {
profile_save_data($existinguser);
}
events_trigger('user_updated', $existinguser);
if ($bulk == UU_BULK_UPDATED or $bulk == UU_BULK_ALL) {
if (!in_array($user->id, $SESSION->bulk_users)) {
$SESSION->bulk_users[] = $user->id;
@@ -789,8 +787,7 @@ if ($formdata = $mform2->is_cancelled()) {
$upt->track('password', '-', 'normal', false);
}
// create user - insert_record ignores any extra properties
$user->id = $DB->insert_record('user', $user);
$user->id = user_create_user($user, false);
$upt->track('username', html_writer::link(new moodle_url('/user/profile.php', array('id'=>$user->id)), s($user->username)), 'normal', false);
// pre-process custom profile menu fields data from csv file
@@ -812,8 +809,6 @@ if ($formdata = $mform2->is_cancelled()) {
// make sure user context exists
context_user::instance($user->id);
events_trigger('user_created', $user);
if ($bulk == UU_BULK_NEW or $bulk == UU_BULK_ALL) {
if (!in_array($user->id, $SESSION->bulk_users)) {
$SESSION->bulk_users[] = $user->id;
+4 -9
View File
@@ -4,6 +4,7 @@
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/authlib.php');
require_once($CFG->dirroot.'/user/filters/lib.php');
require_once($CFG->dirroot.'/user/lib.php');
$delete = optional_param('delete', 0, PARAM_INT);
$confirm = optional_param('confirm', '', PARAM_ALPHANUM); //md5 confirmation hash
@@ -123,12 +124,9 @@
if ($user = $DB->get_record('user', array('id'=>$suspend, 'mnethostid'=>$CFG->mnet_localhost_id, 'deleted'=>0))) {
if (!is_siteadmin($user) and $USER->id != $user->id and $user->suspended != 1) {
$user->suspended = 1;
$user->timemodified = time();
$DB->set_field('user', 'suspended', $user->suspended, array('id'=>$user->id));
$DB->set_field('user', 'timemodified', $user->timemodified, array('id'=>$user->id));
// force logout
// Force logout.
session_kill_user($user->id);
events_trigger('user_updated', $user);
user_update_user($user, false);
}
}
redirect($returnurl);
@@ -139,10 +137,7 @@
if ($user = $DB->get_record('user', array('id'=>$unsuspend, 'mnethostid'=>$CFG->mnet_localhost_id, 'deleted'=>0))) {
if ($user->suspended != 0) {
$user->suspended = 0;
$user->timemodified = time();
$DB->set_field('user', 'suspended', $user->suspended, array('id'=>$user->id));
$DB->set_field('user', 'timemodified', $user->timemodified, array('id'=>$user->id));
events_trigger('user_updated', $user);
user_update_user($user, false);
}
}
redirect($returnurl);
+2 -2
View File
@@ -284,6 +284,7 @@ class auth_plugin_db extends auth_plugin_base {
$remove_users = $DB->get_records_sql($sql, $params);
if (!empty($remove_users)) {
require_once($CFG->dirroot.'/user/lib.php');
$trace->output(get_string('auth_dbuserstoremove','auth_db', count($remove_users)));
foreach ($remove_users as $user) {
@@ -294,8 +295,7 @@ class auth_plugin_db extends auth_plugin_base {
$updateuser = new stdClass();
$updateuser->id = $user->id;
$updateuser->suspended = 1;
$updateuser->timemodified = time();
$DB->update_record('user', $updateuser);
user_update_user($updateuser, false);
$trace->output(get_string('auth_dbsuspenduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)), 1);
}
}
+3 -5
View File
@@ -87,17 +87,15 @@ class auth_plugin_email extends auth_plugin_base {
function user_signup($user, $notify=true) {
global $CFG, $DB;
require_once($CFG->dirroot.'/user/profile/lib.php');
require_once($CFG->dirroot.'/user/lib.php');
$user->password = hash_internal_user_password($user->password);
$user->id = $DB->insert_record('user', $user);
$user->id = user_create_user($user, false);
/// Save any custom profile field information
// Save any custom profile field information.
profile_save_data($user);
$user = $DB->get_record('user', array('id'=>$user->id));
events_trigger('user_created', $user);
if (! send_confirmation_email($user)) {
print_error('auth_emailnoemail','auth_email');
}
+26 -27
View File
@@ -78,6 +78,7 @@ if (!defined('LDAP_OPT_DIAGNOSTIC_MESSAGE')) {
require_once($CFG->libdir.'/authlib.php');
require_once($CFG->libdir.'/ldaplib.php');
require_once($CFG->dirroot.'/user/lib.php');
/**
* LDAP authentication plugin.
@@ -550,7 +551,7 @@ class auth_plugin_ldap extends auth_plugin_base {
print_error('auth_ldap_create_error', 'auth_ldap');
}
$user->id = $DB->insert_record('user', $user);
$user->id = user_create_user($user, false);
// Save any custom profile field information
profile_save_data($user);
@@ -562,7 +563,6 @@ class auth_plugin_ldap extends auth_plugin_base {
update_internal_user_password($user, $plainslashedpassword);
$user = $DB->get_record('user', array('id'=>$user->id));
events_trigger('user_created', $user);
if (! send_confirmation_email($user)) {
print_error('noemail', 'auth_ldap');
@@ -612,12 +612,12 @@ class auth_plugin_ldap extends auth_plugin_base {
if (!$this->user_activate($username)) {
return AUTH_CONFIRM_FAIL;
}
$DB->set_field('user', 'confirmed', 1, array('id'=>$user->id));
$user->confirmed = 1;
if ($user->firstaccess == 0) {
$DB->set_field('user', 'firstaccess', time(), array('id'=>$user->id));
$user->firstaccess = time();
}
$euser = $DB->get_record('user', array('id' => $user->id));
events_trigger('user_updated', $euser);
require_once($CFG->dirroot.'/user/lib.php');
user_update_user($user, false);
return AUTH_CONFIRM_OK;
}
} else {
@@ -806,10 +806,8 @@ class auth_plugin_ldap extends auth_plugin_base {
$updateuser = new stdClass();
$updateuser->id = $user->id;
$updateuser->suspended = 1;
$DB->update_record('user', $updateuser);
user_update_user($updateuser, false);
echo "\t"; print_string('auth_dbsuspenduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)); echo "\n";
$euser = $DB->get_record('user', array('id' => $user->id));
events_trigger('user_updated', $euser);
session_kill_user($user->id);
}
} else {
@@ -835,10 +833,8 @@ class auth_plugin_ldap extends auth_plugin_base {
$updateuser->id = $user->id;
$updateuser->auth = $this->authtype;
$updateuser->suspended = 0;
$DB->update_record('user', $updateuser);
user_update_user($updateuser, false);
echo "\t"; print_string('auth_dbreviveduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)); echo "\n";
$euser = $DB->get_record('user', array('id' => $user->id));
events_trigger('user_updated', $euser);
}
} else {
print_string('nouserentriestorevive', 'auth_ldap');
@@ -950,10 +946,10 @@ class auth_plugin_ldap extends auth_plugin_base {
$user->lang = $CFG->lang;
}
$id = $DB->insert_record('user', $user);
$id = user_create_user($user, false);
echo "\t"; print_string('auth_dbinsertuser', 'auth_db', array('name'=>$user->username, 'id'=>$id)); echo "\n";
$euser = $DB->get_record('user', array('id' => $id));
events_trigger('user_created', $euser);
if (!empty($this->config->forcechangepassword)) {
set_user_preference('auth_forcepasswordchange', 1, $id);
}
@@ -1011,22 +1007,25 @@ class auth_plugin_ldap extends auth_plugin_base {
$updatekeys = array_keys($newinfo);
}
foreach ($updatekeys as $key) {
if (isset($newinfo[$key])) {
$value = $newinfo[$key];
} else {
$value = '';
}
if (!empty($updatekeys)) {
$newuser = new stdClass();
$newuser->id = $userid;
if (!empty($this->config->{'field_updatelocal_' . $key})) {
if ($user->{$key} != $value) { // only update if it's changed
$DB->set_field('user', $key, $value, array('id'=>$userid));
foreach ($updatekeys as $key) {
if (isset($newinfo[$key])) {
$value = $newinfo[$key];
} else {
$value = '';
}
if (!empty($this->config->{'field_updatelocal_' . $key})) {
// Only update if it's changed.
if ($user->{$key} != $value) {
$newuser->$key = $value;
}
}
}
}
if (!empty($updatekeys)) {
$euser = $DB->get_record('user', array('id' => $userid));
events_trigger('user_updated', $euser);
user_update_user($newuser, false);
}
} else {
return false;
+2 -2
View File
@@ -216,6 +216,7 @@ class auth_plugin_mnet extends auth_plugin_base {
global $CFG, $DB;
require_once $CFG->dirroot . '/mnet/xmlrpc/client.php';
require_once $CFG->libdir . '/gdlib.php';
require_once($CFG->dirroot.'/user/lib.php');
// verify the remote host is configured locally before attempting RPC call
if (! $remotehost = $DB->get_record('mnet_host', array('wwwroot' => $remotepeer->wwwroot, 'deleted' => 0))) {
@@ -361,8 +362,7 @@ class auth_plugin_mnet extends auth_plugin_base {
if (empty($localuser->firstaccess)) { // Now firstaccess, grab it here
$localuser->firstaccess = time();
}
$DB->update_record('user', $localuser);
user_update_user($localuser, false);
if (!$firsttime) {
// repeat customer! let the IDP know about enrolments
+33 -1
View File
@@ -72,7 +72,7 @@ class core_badges_observer {
/**
* Triggered when 'course_completed' event is triggered.
*
* @param \core\event\course_completed $event
* @param \core\event\course_completed $event
*/
public static function course_criteria_review(\core\event\course_completed $event) {
global $DB, $CFG;
@@ -105,4 +105,36 @@ class core_badges_observer {
}
}
}
/**
* Triggered when 'user_updated' event happens.
*
* @param \core\event\user_updated $event event generated when user profile is updated.
*/
public static function profile_criteria_review(\core\event\user_updated $event) {
global $DB, $CFG;
if (!empty($CFG->enablebadges)) {
require_once($CFG->dirroot.'/lib/badgeslib.php');
$userid = $event->objectid;
if ($rs = $DB->get_records('badge_criteria', array('criteriatype' => BADGE_CRITERIA_TYPE_PROFILE))) {
foreach ($rs as $r) {
$badge = new badge($r->badgeid);
if (!$badge->is_active() || $badge->is_issued($userid)) {
continue;
}
if ($badge->criteria[BADGE_CRITERIA_TYPE_PROFILE]->review($userid)) {
$badge->criteria[BADGE_CRITERIA_TYPE_PROFILE]->mark_complete($userid);
if ($badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]->review($userid)) {
$badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]->mark_complete($userid);
$badge->issue($userid);
}
}
}
}
}
}
}
+19
View File
@@ -260,4 +260,23 @@ class core_badgeslib_testcase extends advanced_testcase {
$this->assertDebuggingCalled('Error baking badge image!');
$this->assertTrue($badge->is_issued($this->user->id));
}
/**
* Test badges observer when user_updated event is fired.
*/
public function test_badges_observer_profile_criteria_review() {
$badge = new badge($this->coursebadge);
$this->assertFalse($badge->is_issued($this->user->id));
$criteria_overall = award_criteria::build(array('criteriatype' => BADGE_CRITERIA_TYPE_OVERALL, 'badgeid' => $badge->id));
$criteria_overall->save(array('agg' => BADGE_CRITERIA_AGGREGATION_ANY));
$criteria_overall1 = award_criteria::build(array('criteriatype' => BADGE_CRITERIA_TYPE_PROFILE, 'badgeid' => $badge->id));
$criteria_overall1->save(array('agg' => BADGE_CRITERIA_AGGREGATION_ALL, 'field_address' => 'address'));
$this->user->address = 'Test address';
user_update_user($this->user, false);
// Check if badge is awarded.
$this->assertDebuggingCalled('Error baking badge image!');
$this->assertTrue($badge->is_issued($this->user->id));
}
}
+11 -1
View File
@@ -257,7 +257,17 @@ class enrol_manual_editselectedusers_operation extends enrol_bulk_enrolment_oper
foreach ($user->enrolments as $enrolment) {
$enrolment->courseid = $enrolment->enrolmentinstance->courseid;
$enrolment->enrol = 'manual';
events_trigger('user_enrol_modified', $enrolment);
// Trigger event.
$event = \core\event\user_enrolment_updated::create(
array(
'objectid' => $enrolment->id,
'courseid' => $enrolment->courseid,
'context' => context_course::instance($enrolment->courseid),
'relateduserid' => $user->id,
'other' => array('enrol' => 'manual')
)
);
$event->trigger();
}
}
return true;
+102
View File
@@ -0,0 +1,102 @@
<?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/>.
/**
* Event observer for meta enrolment plugin.
*
* @package enrol_meta
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once($CFG->dirroot.'/enrol/meta/locallib.php');
/**
* Event observer for enrol_meta.
*
* @package enrol_meta
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class enrol_meta_observer extends enrol_meta_handler {
/**
* Triggered via user_enrolment_created event.
*
* @param \core\event\user_enrolment_created $event
* @return bool true on success.
*/
public static function user_enrolment_created(\core\event\user_enrolment_created $event) {
if (!enrol_is_enabled('meta')) {
// No more enrolments for disabled plugins.
return true;
}
if ($event->other['enrol'] === 'meta') {
// Prevent circular dependencies - we can not sync meta enrolments recursively.
return true;
}
self::sync_course_instances($event->courseid, $event->relateduserid);
return true;
}
/**
* Triggered via user_enrolment_deleted event.
*
* @param \core\event\user_enrolment_deleted $event
* @return bool true on success.
*/
public static function user_enrolment_deleted(\core\event\user_enrolment_deleted $event) {
if (!enrol_is_enabled('meta')) {
// This is slow, let enrol_meta_sync() deal with disabled plugin.
return true;
}
if ($event->other['enrol'] === 'meta') {
// Prevent circular dependencies - we can not sync meta enrolments recursively.
return true;
}
self::sync_course_instances($event->courseid, $event->relateduserid);
return true;
}
/**
* Triggered via user_enrolment_updated event.
*
* @param \core\event\user_enrolment_updated $event
* @return bool true on success
*/
public static function user_enrolment_updated(\core\event\user_enrolment_updated $event) {
if (!enrol_is_enabled('meta')) {
// No modifications if plugin disabled.
return true;
}
if ($event->other['enrol'] === 'meta') {
// Prevent circular dependencies - we can not sync meta enrolments recursively.
return true;
}
self::sync_course_instances($event->courseid, $event->relateduserid);
return true;
}
}
+17 -21
View File
@@ -41,27 +41,6 @@ $handlers = array (
'internal' => 1,
),
'user_enrolled' => array (
'handlerfile' => '/enrol/meta/locallib.php',
'handlerfunction' => array('enrol_meta_handler', 'user_enrolled'),
'schedule' => 'instant',
'internal' => 1,
),
'user_unenrolled' => array (
'handlerfile' => '/enrol/meta/locallib.php',
'handlerfunction' => array('enrol_meta_handler', 'user_unenrolled'),
'schedule' => 'instant',
'internal' => 1,
),
'user_enrol_modified' => array (
'handlerfile' => '/enrol/meta/locallib.php',
'handlerfunction' => array('enrol_meta_handler', 'user_enrol_modified'),
'schedule' => 'instant',
'internal' => 1,
),
'course_deleted' => array (
'handlerfile' => '/enrol/meta/locallib.php',
'handlerfunction' => array('enrol_meta_handler', 'course_deleted'),
@@ -69,3 +48,20 @@ $handlers = array (
'internal' => 1,
),
);
// List of observers.
$observers = array(
array(
'eventname' => '\core\event\user_enrolment_created',
'callback' => 'enrol_meta_observer::user_enrolment_created',
),
array(
'eventname' => '\core\event\user_enrolment_deleted',
'callback' => 'enrol_meta_observer::user_enrolment_deleted',
),
array(
'eventname' => '\core\event\user_enrolment_updated',
'callback' => 'enrol_meta_observer::user_enrolment_updated',
),
);
-66
View File
@@ -293,72 +293,6 @@ class enrol_meta_handler {
return true;
}
/**
* Triggered via user enrolled event.
* @static
* @param stdClass $ue
* @return bool success
*/
public static function user_enrolled($ue) {
if (!enrol_is_enabled('meta')) {
// no more enrolments for disabled plugins
return true;
}
if ($ue->enrol === 'meta') {
// prevent circular dependencies - we can not sync meta enrolments recursively
return true;
}
self::sync_course_instances($ue->courseid, $ue->userid);
return true;
}
/**
* Triggered via user unenrolled event.
* @static
* @param stdClass $ue
* @return bool success
*/
public static function user_unenrolled($ue) {
if (!enrol_is_enabled('meta')) {
// This is slow, let enrol_meta_sync() deal with disabled plugin.
return true;
}
if ($ue->enrol === 'meta') {
// prevent circular dependencies - we can not sync meta enrolments recursively
return true;
}
self::sync_course_instances($ue->courseid, $ue->userid);
return true;
}
/**
* Triggered via user enrolment modification event.
* @static
* @param stdClass $ue
* @return bool success
*/
public static function user_enrol_modified($ue) {
if (!enrol_is_enabled('meta')) {
// no modifications if plugin disabled
return true;
}
if ($ue->enrol === 'meta') {
// prevent circular dependencies - we can not sync meta enrolments recursively
return true;
}
self::sync_course_instances($ue->courseid, $ue->userid);
return true;
}
/**
* Triggered via course_deleted event.
* @static
+108
View File
@@ -439,4 +439,112 @@ class enrol_meta_plugin_testcase extends advanced_testcase {
delete_course($course4, false);
}
/**
* Test user_enrolment_created event.
*/
public function test_user_enrolment_created_observer() {
global $DB;
$this->resetAfterTest();
$metaplugin = enrol_get_plugin('meta');
$user1 = $this->getDataGenerator()->create_user();
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$student = $DB->get_record('role', array('shortname' => 'student'));
$e1 = $metaplugin->add_instance($course2, array('customint1' => $course1->id));
$enrol1 = $DB->get_record('enrol', array('id' => $e1));
// Enrol user and capture event.
$sink = $this->redirectEvents();
$metaplugin->enrol_user($enrol1, $user1->id, $student->id);
$events = $sink->get_events();
$sink->close();
$event = array_shift($events);
// Test Event.
$dbuserenrolled = $DB->get_record('user_enrolments', array('userid' => $user1->id));
$this->assertInstanceOf('\core\event\user_enrolment_created', $event);
$this->assertEquals($dbuserenrolled->id, $event->objectid);
$this->assertEquals('user_enrolled', $event->get_legacy_eventname());
$expectedlegacyeventdata = $dbuserenrolled;
$expectedlegacyeventdata->enrol = 'meta';
$expectedlegacyeventdata->courseid = $course2->id;
$this->assertEventLegacyData($expectedlegacyeventdata, $event);
}
/**
* Test user_enrolment_deleted observer.
*/
public function test_user_enrolment_deleted_observer() {
global $DB;
$this->resetAfterTest(true);
$metalplugin = enrol_get_plugin('meta');
$user1 = $this->getDataGenerator()->create_user();
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$student = $DB->get_record('role', array('shortname'=>'student'));
$e1 = $metalplugin->add_instance($course2, array('customint1' => $course1->id));
$enrol1 = $DB->get_record('enrol', array('id' => $e1));
// Enrol user.
$metalplugin->enrol_user($enrol1, $user1->id, $student->id);
$this->assertEquals(1, $DB->count_records('user_enrolments'));
// Unenrol user and capture event.
$sink = $this->redirectEvents();
$metalplugin->unenrol_user($enrol1, $user1->id);
$events = $sink->get_events();
$sink->close();
$event = array_pop($events);
$this->assertEquals(0, $DB->count_records('user_enrolments'));
$this->assertInstanceOf('\core\event\user_enrolment_deleted', $event);
$this->assertEquals('user_unenrolled', $event->get_legacy_eventname());
}
/**
* Test user_enrolment_updated event.
*/
public function test_user_enrolment_updated_observer() {
global $DB;
$this->resetAfterTest(true);
$metalplugin = enrol_get_plugin('meta');
$user1 = $this->getDataGenerator()->create_user();
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$student = $DB->get_record('role', array('shortname'=>'student'));
$e1 = $metalplugin->add_instance($course2, array('customint1' => $course1->id));
$enrol1 = $DB->get_record('enrol', array('id' => $e1));
// Enrol user.
$metalplugin->enrol_user($enrol1, $user1->id, $student->id);
$this->assertEquals(1, $DB->count_records('user_enrolments'));
// Updated enrolment for user and capture event.
$sink = $this->redirectEvents();
$metalplugin->update_user_enrol($enrol1, $user1->id, ENROL_USER_SUSPENDED, null, time());
$events = $sink->get_events();
$sink->close();
$event = array_shift($events);
// Test Event.
$dbuserenrolled = $DB->get_record('user_enrolments', array('userid' => $user1->id));
$this->assertInstanceOf('\core\event\user_enrolment_updated', $event);
$this->assertEquals($dbuserenrolled->id, $event->objectid);
$this->assertEquals('user_enrol_modified', $event->get_legacy_eventname());
$expectedlegacyeventdata = $dbuserenrolled;
$expectedlegacyeventdata->enrol = 'meta';
$expectedlegacyeventdata->courseid = $course2->id;
$this->assertEventLegacyData($expectedlegacyeventdata, $event);
}
}
+37
View File
@@ -279,4 +279,41 @@ class core_enrollib_testcase extends advanced_testcase {
// It should be course 1.
$this->assertEquals($sharedcourse->id, $course1->id);
}
/**
* Test user enrolment created event.
*/
public function test_user_enrolment_created_event() {
global $DB;
$this->resetAfterTest();
$studentrole = $DB->get_record('role', array('shortname'=>'student'));
$this->assertNotEmpty($studentrole);
$admin = get_admin();
$course1 = $this->getDataGenerator()->create_course();
$maninstance1 = $DB->get_record('enrol', array('courseid'=>$course1->id, 'enrol'=>'manual'), '*', MUST_EXIST);
$manual = enrol_get_plugin('manual');
$this->assertNotEmpty($manual);
// Enrol user and capture event.
$sink = $this->redirectEvents();
$manual->enrol_user($maninstance1, $admin->id, $studentrole->id);
$events = $sink->get_events();
$sink->close();
$event = array_shift($events);
$dbuserenrolled = $DB->get_record('user_enrolments', array('userid' => $admin->id));
$this->assertInstanceOf('\core\event\user_enrolment_created', $event);
$this->assertEquals($dbuserenrolled->id, $event->objectid);
$this->assertEquals('user_enrolled', $event->get_legacy_eventname());
$expectedlegacyeventdata = $dbuserenrolled;
$expectedlegacyeventdata->enrol = $manual->get_name();
$expectedlegacyeventdata->courseid = $course1->id;
$this->assertEventLegacyData($expectedlegacyeventdata, $event);
}
}
+3
View File
@@ -69,6 +69,9 @@ $string['errorenrolcohort'] = 'Error creating cohort sync enrolment instance in
$string['errorenrolcohortusers'] = 'Error enrolling cohort members in this course.';
$string['errorthresholdlow'] = 'Notification threshold must be at least 1 day.';
$string['errorwithbulkoperation'] = 'There was an error while processing your bulk enrolment change.';
$string['eventuserenrolmentcreated'] = 'User enrolled in course';
$string['eventuserenrolmentdeleted'] = 'User unenrolled from course';
$string['eventuserenrolmentupdated'] = 'User unenrolment updated';
$string['expirynotify'] = 'Notify before enrolment expires';
$string['expirynotify_help'] = 'This setting determines whether enrolment expiry notification messages are sent.';
$string['expirynotifyall'] = 'Enroller and enrolled user';
+4
View File
@@ -667,6 +667,10 @@ $string['eventcoursedeleted'] = 'Course deleted';
$string['eventcourserestored'] = 'Course restored';
$string['eventcourseupdated'] = 'Course updated';
$string['eventcoursesectionupdated'] = ' Course section updated';
$string['eventusercreated'] = 'User created';
$string['eventuserdeleted'] = 'User deleted';
$string['eventuserloggedout'] = 'User logged out';
$string['eventuserupdated'] = 'User updated';
$string['everybody'] = 'Everybody';
$string['executeat'] = 'Execute at';
$string['existing'] = 'Existing';
-34
View File
@@ -931,40 +931,6 @@ function badges_add_course_navigation(navigation_node $coursenode, stdClass $cou
}
}
/**
* Triggered when 'user_updated' event happens.
*
* @param object $eventdata Holds all information about a user.
* @return boolean
*/
function badges_award_handle_profile_criteria_review(stdClass $eventdata) {
global $DB, $CFG;
if (!empty($CFG->enablebadges)) {
$userid = $eventdata->id;
if ($rs = $DB->get_records('badge_criteria', array('criteriatype' => BADGE_CRITERIA_TYPE_PROFILE))) {
foreach ($rs as $r) {
$badge = new badge($r->badgeid);
if (!$badge->is_active() || $badge->is_issued($userid)) {
continue;
}
if ($badge->criteria[BADGE_CRITERIA_TYPE_PROFILE]->review($userid)) {
$badge->criteria[BADGE_CRITERIA_TYPE_PROFILE]->mark_complete($userid);
if ($badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]->review($userid)) {
$badge->criteria[BADGE_CRITERIA_TYPE_OVERALL]->mark_complete($userid);
$badge->issue($userid);
}
}
}
}
}
return true;
}
/**
* Triggered when badge is manually awarded.
*
+3 -3
View File
@@ -58,8 +58,8 @@ class behat_util extends testing_util {
* @return void
*/
public static function install_site() {
global $DB;
global $DB, $CFG;
require_once($CFG->dirroot.'/user/lib.php');
if (!defined('BEHAT_UTIL')) {
throw new coding_exception('This method can be only used by Behat CLI tool');
}
@@ -82,7 +82,7 @@ class behat_util extends testing_util {
$user->lastname = 'User';
$user->city = 'Perth';
$user->country = 'AU';
$DB->update_record('user', $user);
user_update_user($user, false);
// Disable email message processor.
$DB->set_field('message_processors', 'enabled', '0', array('name' => 'email'));
+99
View File
@@ -0,0 +1,99 @@
<?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/>.
/**
* User created event.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\event;
defined('MOODLE_INTERNAL') || die();
/**
* Event when new user profile is created.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_created extends base {
/**
* Initialise required event data properties.
*/
protected function init() {
$this->data['objecttable'] = 'user';
$this->data['crud'] = 'c';
$this->data['level'] = self::LEVEL_OTHER;
}
/**
* Returns localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventusercreated');
}
/**
* Returns non-localised event description with id's for admin use only.
*
* @return string
*/
public function get_description() {
return 'Profile created for user '.$this->objectid;
}
/**
* Returns relevant URL.
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/user/view.php', array('id' => $this->objectid));
}
/**
* Return name of the legacy event, which is replaced by this event.
*
* @return string legacy event name
*/
public static function get_legacy_eventname() {
return 'user_created';
}
/**
* Return user_created legacy event data.
*
* @return \stdClass user data.
*/
protected function get_legacy_eventdata() {
return $this->get_record_snapshot('user', $this->objectid);
}
/**
* Returns array of parameters to be passed to legacy add_to_log() function.
*
* @return array
*/
protected function get_legacy_logdata() {
return array(SITEID, 'user', 'add', '/view.php?id='.$this->objectid, fullname($this->get_legacy_eventdata()));
}
}
+105
View File
@@ -0,0 +1,105 @@
<?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/>.
/**
* User deleted event.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\event;
defined('MOODLE_INTERNAL') || die();
/**
* Event when user profile is deleted.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_deleted extends base {
/**
* Initialise required event data properties.
*/
protected function init() {
$this->data['objecttable'] = 'user';
$this->data['crud'] = 'd';
$this->data['level'] = self::LEVEL_OTHER;
}
/**
* Returns localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventuserdeleted');
}
/**
* Returns non-localised event description with id's for admin use only.
*
* @return string
*/
public function get_description() {
$user = (object)$this->other['user'];
return 'User profile deleted for user '.$user->firstname.' '.$user->lastname.' id ('.$user->id.')';
}
/**
* Return name of the legacy event, which is replaced by this event.
*
* @return string legacy event name
*/
public static function get_legacy_eventname() {
return 'user_deleted';
}
/**
* Return user_deleted legacy event data.
*
* @return \stdClass user data.
*/
protected function get_legacy_eventdata() {
return (object)$this->other['user'];
}
/**
* Returns array of parameters to be passed to legacy add_to_log() function.
*
* @return array
*/
protected function get_legacy_logdata() {
$user = (object)$this->other['user'];
return array(SITEID, 'user', 'delete', "view.php?id=$user->id", $user->firstname.' '.$user->lastname);
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['user'])) {
throw new \coding_exception('user must be set in $other.');
}
}
}
@@ -0,0 +1,109 @@
<?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/>.
/**
* User enrolment created event.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\event;
defined('MOODLE_INTERNAL') || die();
/**
* Event when user is enrolled in a course.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_enrolment_created extends base {
/**
* Initialise required event data properties.
*/
protected function init() {
$this->data['objecttable'] = 'user_enrolments';
$this->data['crud'] = 'c';
$this->data['level'] = self::LEVEL_TEACHING;
}
/**
* Returns localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventuserenrolmentcreated', 'core_enrol');
}
/**
* Returns non-localised event description with id's for admin use only.
*
* @return string
*/
public function get_description() {
return 'User '.$this->relateduserid. ' is enrolled in course '.$this->courseid.' by user '.$this->userid;
}
/**
* Returns relevant URL.
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/enrol/users.php', array('id' => $this->courseid));
}
/**
* Return name of the legacy event, which is replaced by this event.
*
* @return string legacy event name
*/
public static function get_legacy_eventname() {
return 'user_enrolled';
}
/**
* Return user_enrolled legacy event data.
*
* @return \stdClass
*/
protected function get_legacy_eventdata() {
$legacyeventdata = $this->get_record_snapshot('user_enrolments', $this->objectid);
$legacyeventdata->enrol = $this->other['enrol'];
$legacyeventdata->courseid = $this->courseid;
return $legacyeventdata;
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['enrol'])) {
throw new \coding_exception('Enrolment plugin name must be set in $other.');
}
if (!isset($this->relateduserid)) {
throw new \coding_exception('Related user id must be set.');
}
}
}
@@ -0,0 +1,110 @@
<?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/>.
/**
* User enrolment deleted event.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\event;
defined('MOODLE_INTERNAL') || die();
/**
* Event when user is unenrolled from a course.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_enrolment_deleted extends base {
/**
* Initialise required event data properties.
*/
protected function init() {
$this->data['objecttable'] = 'user_enrolments';
$this->data['crud'] = 'd';
$this->data['level'] = self::LEVEL_TEACHING;
}
/**
* Returns localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventuserenrolmentdeleted', 'core_enrol');
}
/**
* Returns non-localised event description with id's for admin use only.
*
* @return string
*/
public function get_description() {
return 'User '.$this->relateduserid. ' is enrolled in course '.$this->courseid.' by user '.$this->userid;
}
/**
* Returns relevant URL.
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/enrol/users.php', array('id' => $this->courseid));
}
/**
* Return name of the legacy event, which is replaced by this event.
*
* @return string legacy event name
*/
public static function get_legacy_eventname() {
return 'user_unenrolled';
}
/**
* Return user_unenrolled legacy event data.
*
* @return \stdClass
*/
protected function get_legacy_eventdata() {
return (object)$this->other['userenrolment'];
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['userenrolment'])) {
throw new \coding_exception('User enrolment must be set in $other.');
}
if (!isset($this->other['enrol'])) {
throw new \coding_exception('Enrolment plugin name must be set in $other.');
}
if (!isset($this->relateduserid)) {
throw new \coding_exception('Related user id must be set.');
}
}
}
@@ -0,0 +1,109 @@
<?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/>.
/**
* User enrolment updated event.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\event;
defined('MOODLE_INTERNAL') || die();
/**
* Event when user enrolment is updated.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_enrolment_updated extends base {
/**
* Initialise required event data properties.
*/
protected function init() {
$this->data['objecttable'] = 'user_enrolments';
$this->data['crud'] = 'u';
$this->data['level'] = self::LEVEL_TEACHING;
}
/**
* Returns localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventuserenrolmentupdated', 'core_enrol');
}
/**
* Returns non-localised event description with id's for admin use only.
*
* @return string
*/
public function get_description() {
return 'User '.$this->relateduserid. ' has updated enrolment for user '.$this->userid.' in course '.$this->courseid;
}
/**
* Returns relevant URL.
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/enrol/users.php', array('id' => $this->courseid));
}
/**
* Return name of the legacy event, which is replaced by this event.
*
* @return string legacy event name
*/
public static function get_legacy_eventname() {
return 'user_enrol_modified';
}
/**
* Return user_enrol_modified legacy event data.
*
* @return \stdClass
*/
protected function get_legacy_eventdata() {
$legacyeventdata = $this->get_record_snapshot('user_enrolments', $this->objectid);
$legacyeventdata->enrol = $this->other['enrol'];
$legacyeventdata->courseid = $this->courseid;
return $legacyeventdata;
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['enrol'])) {
throw new \coding_exception('Enrolment plugin name must be set in $other.');
}
if (!isset($this->relateduserid)) {
throw new \coding_exception('Related user id must be set.');
}
}
}
+100
View File
@@ -0,0 +1,100 @@
<?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/>.
/**
* User logout event.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\event;
defined('MOODLE_INTERNAL') || die();
/**
* Event when user logout.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_loggedout extends base {
/**
* Initialise required event data properties.
*/
protected function init() {
$this->data['objecttable'] = 'user';
$this->data['crud'] = 'r';
$this->data['level'] = self::LEVEL_OTHER;
}
/**
* Returns localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventuserloggedout');
}
/**
* Returns non-localised event description with id's for admin use only.
*
* @return string
*/
public function get_description() {
return 'User '.$this->objectid.' logged out.';
}
/**
* Returns relevant URL.
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/user/view.php', array('id' => $this->objectid));
}
/**
* Return name of the legacy event, which is replaced by this event.
*
* @return string legacy event name
*/
public static function get_legacy_eventname() {
return 'user_logout';
}
/**
* Return user_logout legacy event data.
*
* @return \stdClass user data.
*/
protected function get_legacy_eventdata() {
return $this->get_record_snapshot('user', $this->objectid);
}
/**
* Returns array of parameters to be passed to legacy add_to_log() function.
*
* @return array
*/
protected function get_legacy_logdata() {
return array(SITEID, 'user', 'logout', 'view.php?id='.$this->objectid.'&course='.SITEID, $this->objectid, 0,
$this->objectid);
}
}
+99
View File
@@ -0,0 +1,99 @@
<?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/>.
/**
* User updated event.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\event;
defined('MOODLE_INTERNAL') || die();
/**
* Event when user profile is updated.
*
* @package core
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_updated extends base {
/**
* Initialise required event data properties.
*/
protected function init() {
$this->data['objecttable'] = 'user';
$this->data['crud'] = 'u';
$this->data['level'] = self::LEVEL_OTHER;
}
/**
* Returns localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventuserupdated');
}
/**
* Returns non-localised event description with id's for admin use only.
*
* @return string
*/
public function get_description() {
return 'User profile updated for userid '.$this->objectid;
}
/**
* Returns relevant URL.
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/user/view.php', array('id' => $this->objectid));
}
/**
* Return name of the legacy event, which is replaced by this event.
*
* @return string legacy event name
*/
public static function get_legacy_eventname() {
return 'user_updated';
}
/**
* Return user_updated legacy event data.
*
* @return \stdClass user data.
*/
protected function get_legacy_eventdata () {
return $this->get_record_snapshot('user', $this->objectid);
}
/**
* Returns array of parameters to be passed to legacy add_to_log() function.
*
* @return array
*/
protected function get_legacy_logdata() {
return array(SITEID, 'user', 'update', 'view.php?id='.$this->objectid, '');
}
}
+4 -8
View File
@@ -36,14 +36,6 @@ defined('MOODLE_INTERNAL') || die();
/* List of legacy event handlers */
$handlers = array(
'user_updated' => array (
'handlerfile' => '/lib/badgeslib.php',
'handlerfunction' => 'badges_award_handle_profile_criteria_review',
'schedule' => 'instant',
'internal' => 1,
),
/*
* portfolio queued event - for non interactive file transfers
* NOTE: this is a HACK, please do not add any more things like this here
@@ -70,6 +62,10 @@ $observers = array(
array(
'eventname' => '\core\event\course_completed',
'callback' => 'core_badges_observer::course_criteria_review',
),
array(
'eventname' => '\core\event\user_updated',
'callback' => 'core_badges_observer::profile_criteria_review',
)
);
+36 -28
View File
@@ -1276,16 +1276,7 @@ abstract class enrol_plugin {
if ($ue = $DB->get_record('user_enrolments', array('enrolid'=>$instance->id, 'userid'=>$userid))) {
//only update if timestart or timeend or status are different.
if ($ue->timestart != $timestart or $ue->timeend != $timeend or (!is_null($status) and $ue->status != $status)) {
$ue->timestart = $timestart;
$ue->timeend = $timeend;
if (!is_null($status)) {
$ue->status = $status;
}
$ue->modifierid = $USER->id;
$ue->timemodified = time();
$DB->update_record('user_enrolments', $ue);
$updated = true;
$this->update_user_enrol($instance, $userid, $status, $timestart, $timeend);
}
} else {
$ue = new stdClass();
@@ -1303,16 +1294,17 @@ abstract class enrol_plugin {
}
if ($inserted) {
// add extra info and trigger event
$ue->courseid = $courseid;
$ue->enrol = $name;
events_trigger('user_enrolled', $ue);
} else if ($updated) {
$ue->courseid = $courseid;
$ue->enrol = $name;
events_trigger('user_enrol_modified', $ue);
// resets current enrolment caches
$context->mark_dirty();
// Trigger event.
$event = \core\event\user_enrolment_created::create(
array(
'objectid' => $ue->id,
'courseid' => $courseid,
'context' => $context,
'relateduserid' => $ue->userid,
'other' => array('enrol' => $name)
)
);
$event->trigger();
}
if ($roleid) {
@@ -1389,10 +1381,17 @@ abstract class enrol_plugin {
$DB->update_record('user_enrolments', $ue);
context_course::instance($instance->courseid)->mark_dirty(); // reset enrol caches
// trigger event
$ue->courseid = $instance->courseid;
$ue->enrol = $instance->name;
events_trigger('user_enrol_modified', $ue);
// Trigger event.
$event = \core\event\user_enrolment_updated::create(
array(
'objectid' => $ue->id,
'courseid' => $instance->courseid,
'context' => context_course::instance($instance->courseid),
'relateduserid' => $ue->userid,
'other' => array('enrol' => $name)
)
);
$event->trigger();
}
/**
@@ -1440,8 +1439,6 @@ abstract class enrol_plugin {
WHERE ue.userid = :userid AND e.courseid = :courseid";
if ($DB->record_exists_sql($sql, array('userid'=>$userid, 'courseid'=>$courseid))) {
$ue->lastenrol = false;
events_trigger('user_unenrolled', $ue);
// user still has some enrolments, no big cleanup yet
} else {
// the big cleanup IS necessary!
@@ -1458,9 +1455,20 @@ abstract class enrol_plugin {
$DB->delete_records('user_lastaccess', array('userid'=>$userid, 'courseid'=>$courseid));
$ue->lastenrol = true; // means user not enrolled any more
events_trigger('user_unenrolled', $ue);
}
// Trigger event.
$event = \core\event\user_enrolment_deleted::create(
array(
'courseid' => $courseid,
'context' => $context,
'relateduserid' => $ue->userid,
'other' => array(
'userenrolment' => (array)$ue,
'enrol' => $name
)
)
);
$event->trigger();
// reset all enrol caches
$context->mark_dirty();
+39 -28
View File
@@ -3215,11 +3215,7 @@ function require_login($courseorid = null, $autologinguest = true, $cm = null, $
function require_logout() {
global $USER;
$params = $USER;
if (isloggedin()) {
add_to_log(SITEID, "user", "logout", "view.php?id=$USER->id&course=".SITEID, $USER->id, 0, $USER->id);
$authsequence = get_enabled_auth_plugins(); // Auths, in sequence.
foreach ($authsequence as $authname) {
$authplugin = get_auth_plugin($authname);
@@ -3227,9 +3223,16 @@ function require_logout() {
}
}
events_trigger('user_logout', $params);
$event = \core\event\user_loggedout::create(
array(
'objectid' => $USER->id,
'context' => context_user::instance($USER->id)
)
);
$event->trigger();
session_get_instance()->terminate_current();
unset($params);
unset($GLOBALS['USER']);
}
/**
@@ -3442,7 +3445,9 @@ function get_user_key($script, $userid, $instance=null, $iprestriction=null, $va
* @return bool Always returns true
*/
function update_user_login_times() {
global $USER, $DB;
global $USER, $DB, $CFG;
require_once($CFG->dirroot.'/user/lib.php');
if (isguestuser()) {
// Do not update guest access times/ips for performance.
@@ -3468,7 +3473,7 @@ function update_user_login_times() {
$USER->lastaccess = $user->lastaccess = $now;
$USER->lastip = $user->lastip = getremoteaddr();
$DB->update_record('user', $user);
user_update_user($user, false);
return true;
}
@@ -3967,7 +3972,9 @@ function get_user_fieldnames() {
*/
function create_user_record($username, $password, $auth = 'manual') {
global $CFG, $DB;
require_once($CFG->dirroot."/user/profile/lib.php");
require_once($CFG->dirroot.'/user/profile/lib.php');
require_once($CFG->dirroot.'/user/lib.php');
// Just in case check text case.
$username = trim(core_text::strtolower($username));
@@ -4008,7 +4015,7 @@ function create_user_record($username, $password, $auth = 'manual') {
$newuser->timemodified = $newuser->timecreated;
$newuser->mnethostid = $CFG->mnet_localhost_id;
$newuser->id = $DB->insert_record('user', $newuser);
$newuser->id = user_create_user($newuser, false);
// Save user profile data.
profile_save_data($newuser);
@@ -4020,10 +4027,6 @@ function create_user_record($username, $password, $auth = 'manual') {
// Set the password.
update_internal_user_password($user, $password);
// Fetch full user record for the event, the complete user data contains too much info
// and we want to be consistent with other places that trigger this event.
events_trigger('user_created', $DB->get_record('user', array('id' => $user->id)));
return $user;
}
@@ -4036,6 +4039,7 @@ function create_user_record($username, $password, $auth = 'manual') {
function update_user_record($username) {
global $DB, $CFG;
require_once($CFG->dirroot."/user/profile/lib.php");
require_once($CFG->dirroot.'/user/lib.php');
// Just in case check text case.
$username = trim(core_text::strtolower($username));
@@ -4078,14 +4082,10 @@ function update_user_record($username) {
if ($newuser) {
$newuser['id'] = $oldinfo->id;
$newuser['timemodified'] = time();
$DB->update_record('user', $newuser);
user_update_user((object) $newuser, false);
// Save user profile data.
profile_save_data((object) $newuser);
// Fetch full user record for the event, the complete user data contains too much info
// and we want to be consistent with other places that trigger this event.
events_trigger('user_updated', $DB->get_record('user', array('id' => $oldinfo->id)));
}
}
@@ -4143,6 +4143,7 @@ function delete_user(stdClass $user) {
require_once($CFG->libdir.'/gradelib.php');
require_once($CFG->dirroot.'/message/lib.php');
require_once($CFG->dirroot.'/tag/lib.php');
require_once($CFG->dirroot.'/user/lib.php');
// Make sure nobody sends bogus record type as parameter.
if (!property_exists($user, 'id') or !property_exists($user, 'username')) {
@@ -4169,6 +4170,9 @@ function delete_user(stdClass $user) {
return false;
}
// Keep a copy of user context, we need it for event.
$usercontext = context_user::instance($user->id);
// Delete all grades - backup is kept in grade_grades_history table.
grade_user_delete($user->id);
@@ -4218,9 +4222,6 @@ function delete_user(stdClass $user) {
// Force logout - may fail if file based sessions used, sorry.
session_kill_user($user->id);
// Now do a final accesslib cleanup - removes all role assignments in user context and context itself.
context_helper::delete_instance(CONTEXT_USER, $user->id);
// Workaround for bulk deletes of users with the same email address.
$delname = "$user->email.".time();
while ($DB->record_exists('user', array('username' => $delname))) { // No need to use mnethostid here.
@@ -4237,9 +4238,22 @@ function delete_user(stdClass $user) {
$updateuser->picture = 0;
$updateuser->timemodified = time();
$DB->update_record('user', $updateuser);
// Add this action to log.
add_to_log(SITEID, 'user', 'delete', "view.php?id=$user->id", $user->firstname.' '.$user->lastname);
user_update_user($updateuser, false);
// Now do a final accesslib cleanup - removes all role assignments in user context and context itself.
context_helper::delete_instance(CONTEXT_USER, $user->id);
// Any plugin that needs to cleanup should register this event.
// Trigger event.
$event = \core\event\user_deleted::create(
array(
'objectid' => $user->id,
'context' => $usercontext,
'other' => array('user' => (array)clone $user)
)
);
$event->add_record_snapshot('user', $updateuser);
$event->trigger();
// We will update the user's timemodified, as it will be passed to the user_deleted event, which
// should know about this updated property persisted to the user's table.
@@ -4249,9 +4263,6 @@ function delete_user(stdClass $user) {
$authplugin = get_auth_plugin($user->auth);
$authplugin->user_delete($user);
// Any plugin that needs to cleanup should register this event.
events_trigger('user_deleted', $user);
return true;
}
+46 -1
View File
@@ -1851,7 +1851,14 @@ class core_moodlelib_testcase extends advanced_testcase {
$user = $this->getDataGenerator()->create_user(array('idnumber'=>'abc'));
$user2 = $this->getDataGenerator()->create_user(array('idnumber'=>'xyz'));
// Delete user and capture event.
$sink = $this->redirectEvents();
$result = delete_user($user);
$events = $sink->get_events();
$sink->close();
$event = array_pop($events);
// Test user is deleted in DB.
$this->assertTrue($result);
$deluser = $DB->get_record('user', array('id'=>$user->id), '*', MUST_EXIST);
$this->assertEquals(1, $deluser->deleted);
@@ -1862,8 +1869,15 @@ class core_moodlelib_testcase extends advanced_testcase {
$this->assertEquals(1, $DB->count_records('user', array('deleted'=>1)));
// Try invalid params.
// Test Event.
$this->assertInstanceOf('\core\event\user_deleted', $event);
$this->assertSame($user->id, $event->objectid);
$this->assertSame('user_deleted', $event->get_legacy_eventname());
$this->assertEventLegacyData($user, $event);
$expectedlogdata = array(SITEID, 'user', 'delete', "view.php?id=$user->id", $user->firstname.' '.$user->lastname);
$this->assertEventLegacyLogData($expectedlogdata, $event);
// Try invalid params.
$record = new stdClass();
$record->grrr = 1;
try {
@@ -2407,4 +2421,35 @@ class core_moodlelib_testcase extends advanced_testcase {
$expectedarray = array('19' => 'second', '38' => 'first', '44' => 'firsthalf');
$this->assertEquals($expectedarray, order_in_string($valuearray, $formatstring));
}
/**
* Test require_logout.
*/
public function test_require_logout() {
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$course = $this->getDataGenerator()->create_course();
$this->assertTrue(isloggedin());
// Logout user and capture event.
$sink = $this->redirectEvents();
require_logout();
$events = $sink->get_events();
$sink->close();
$event = array_pop($events);
// Check if user is logged out.
$this->assertFalse(isloggedin());
// Test Event.
$this->assertInstanceOf('\core\event\user_loggedout', $event);
$this->assertSame($user->id, $event->objectid);
$this->assertSame('user_logout', $event->get_legacy_eventname());
$this->assertEventLegacyData($user, $event);
$expectedlogdata = array(SITEID, 'user', 'logout', 'view.php?id='.$event->objectid.'&course='.SITEID, $event->objectid, 0,
$event->objectid);
$this->assertEventLegacyLogData($expectedlogdata, $event);
}
}
+52
View File
@@ -0,0 +1,52 @@
<?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/>.
/**
* Event observers used in forum.
*
* @package mod_forum
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Event observer for mod_forum.
*/
class mod_forum_observer {
/**
* Triggered via user_enrolment_deleted event.
*
* @param \core\event\user_enrolment_deleted $event
*/
public static function user_enrolment_deleted(\core\event\user_enrolment_deleted $event) {
global $DB;
// NOTE: this has to be as fast as possible.
// Get user enrolment info from event.
$cp = (object)$event->other['userenrolment'];
if ($cp->lastenrol) {
$params = array('userid' => $cp->userid, 'courseid' => $cp->courseid);
$forumselect = "IN (SELECT f.id FROM {forum} f WHERE f.course = :courseid)";
$DB->delete_records_select('forum_digests', 'userid = :userid AND forum '.$forumselect, $params);
$DB->delete_records_select('forum_subscriptions', 'userid = :userid AND forum '.$forumselect, $params);
$DB->delete_records_select('forum_track_prefs', 'userid = :userid AND forumid '.$forumselect, $params);
$DB->delete_records_select('forum_read', 'userid = :userid AND forumid '.$forumselect, $params);
}
}
}
+7 -5
View File
@@ -31,11 +31,13 @@ $handlers = array (
'schedule' => 'instant',
'internal' => 1,
),
);
'user_unenrolled' => array (
'handlerfile' => '/mod/forum/lib.php',
'handlerfunction' => 'forum_user_unenrolled',
'schedule' => 'instant',
'internal' => 1,
// List of observers.
$observers = array(
array(
'eventname' => '\core\event\user_enrolment_deleted',
'callback' => 'mod_forum_observer::user_enrolment_deleted',
),
);
-22
View File
@@ -6289,28 +6289,6 @@ function forum_user_role_assigned($cp) {
}
}
/**
* This function gets run whenever user is unenrolled from course
*
* @param stdClass $cp
* @return void
*/
function forum_user_unenrolled($cp) {
global $DB;
// NOTE: this has to be as fast as possible!
if ($cp->lastenrol) {
$params = array('userid'=>$cp->userid, 'courseid'=>$cp->courseid);
$forumselect = "IN (SELECT f.id FROM {forum} f WHERE f.course = :courseid)";
$DB->delete_records_select('forum_digests', "userid = :userid AND forum $forumselect", $params);
$DB->delete_records_select('forum_subscriptions', "userid = :userid AND forum $forumselect", $params);
$DB->delete_records_select('forum_track_prefs', "userid = :userid AND forumid $forumselect", $params);
$DB->delete_records_select('forum_read', "userid = :userid AND forumid $forumselect", $params);
}
}
// Functions to do with read tracking.
/**
+33
View File
@@ -168,4 +168,37 @@ class mod_forum_lib_testcase extends advanced_testcase {
$this->assertContains($course->shortname, array($course1->shortname, $course2->shortname));
}
}
/**
* Test user_enrolment_deleted observer.
*/
public function test_user_enrolment_deleted_observer() {
global $DB;
$this->resetAfterTest();
$metaplugin = enrol_get_plugin('meta');
$user1 = $this->getDataGenerator()->create_user();
$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();
$student = $DB->get_record('role', array('shortname'=>'student'));
$e1 = $metaplugin->add_instance($course2, array('customint1' => $course1->id));
$enrol1 = $DB->get_record('enrol', array('id' => $e1));
// Enrol user.
$metaplugin->enrol_user($enrol1, $user1->id, $student->id);
$this->assertEquals(1, $DB->count_records('user_enrolments'));
// Unenrol user and capture event.
$sink = $this->redirectEvents();
$metaplugin->unenrol_user($enrol1, $user1->id);
$events = $sink->get_events();
$sink->close();
$event = array_pop($events);
$this->assertEquals(0, $DB->count_records('user_enrolments'));
$this->assertInstanceOf('\core\event\user_enrolment_deleted', $event);
$this->assertEquals('user_unenrolled', $event->get_legacy_eventname());
}
}
+7 -9
View File
@@ -28,6 +28,7 @@ require_once($CFG->libdir.'/gdlib.php');
require_once($CFG->dirroot.'/user/edit_form.php');
require_once($CFG->dirroot.'/user/editlib.php');
require_once($CFG->dirroot.'/user/profile/lib.php');
require_once($CFG->dirroot.'/user/lib.php');
//HTTPS is required in this page when $CFG->loginhttps enabled
$PAGE->https_required();
@@ -177,8 +178,6 @@ $email_changed = false;
if ($usernew = $userform->get_data()) {
add_to_log($course->id, 'user', 'update', "view.php?id=$user->id&course=$course->id", '');
$email_changed_html = '';
if ($CFG->emailchangeconfirmation) {
@@ -206,15 +205,15 @@ if ($usernew = $userform->get_data()) {
$usernew = file_postupdate_standard_editor($usernew, 'description', $editoroptions, $personalcontext, 'user', 'profile', 0);
}
$DB->update_record('user', $usernew);
// pass a true $userold here
if (! $authplugin->user_update($user, $usernew)) {
// auth update failed, rollback for moodle
$DB->update_record('user', $user);
// Pass a true old $user here.
if (!$authplugin->user_update($user, $usernew)) {
// Auth update failed.
print_error('cannotupdateprofile');
}
// Update user with new profile data.
user_update_user($usernew, false);
//update preferences
useredit_update_user_preference($usernew);
@@ -259,7 +258,6 @@ if ($usernew = $userform->get_data()) {
// reload from db
$usernew = $DB->get_record('user', array('id'=>$user->id));
events_trigger('user_updated', $usernew);
if ($USER->id == $user->id) {
// Override old $USER session variable if needed
+6 -19
View File
@@ -29,6 +29,7 @@ require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->dirroot.'/user/editadvanced_form.php');
require_once($CFG->dirroot.'/user/editlib.php');
require_once($CFG->dirroot.'/user/profile/lib.php');
require_once($CFG->dirroot.'/user/lib.php');
//HTTPS is required in this page when $CFG->loginhttps enabled
$PAGE->https_required();
@@ -177,20 +178,15 @@ if ($usernew = $userform->get_data()) {
} else {
$usernew->password = hash_internal_user_password($usernew->newpassword);
}
$usernew->id = $DB->insert_record('user', $usernew);
$usercreated = true;
add_to_log($course->id, 'user', 'add', "view.php?id=$usernew->id&course=$course->id", '');
$usernew->id = user_create_user($usernew, false);
} else {
$usernew = file_postupdate_standard_editor($usernew, 'description', $editoroptions, $usercontext, 'user', 'profile', 0);
$DB->update_record('user', $usernew);
// pass a true $userold here
if (! $authplugin->user_update($user, $userform->get_data())) {
// auth update failed, rollback for moodle
$DB->update_record('user', $user);
// Pass a true old $user here.
if (!$authplugin->user_update($user, $usernew)) {
// Auth update failed.
print_error('cannotupdateuseronexauth', '', '', $user->auth);
}
add_to_log($course->id, 'user', 'update', "view.php?id=$user->id&course=$course->id", '');
user_update_user($usernew, false);
//set new password if specified
if (!empty($usernew->newpassword)) {
@@ -206,8 +202,6 @@ if ($usernew = $userform->get_data()) {
if (isset($usernew->suspended) and $usernew->suspended and !$user->suspended) {
session_kill_user($user->id);
}
$usercreated = false;
}
$usercontext = context_user::instance($usernew->id);
@@ -237,13 +231,6 @@ if ($usernew = $userform->get_data()) {
// reload from db
$usernew = $DB->get_record('user', array('id'=>$usernew->id));
// trigger events
if ($usercreated) {
events_trigger('user_created', $usernew);
} else {
events_trigger('user_updated', $usernew);
}
if ($createpassword) {
setnew_password_and_mail($usernew);
unset_user_preference('create_password', $usernew);
+4 -4
View File
@@ -26,6 +26,7 @@
require_once('../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->dirroot.'/user/editlib.php');
require_once($CFG->dirroot.'/user/lib.php');
$key = required_param('key', PARAM_ALPHANUM);
$id = required_param('id', PARAM_INT);
@@ -60,17 +61,16 @@ if (empty($preferences['newemailattemptsleft'])) {
cancel_email_update($user->id);
$user->email = $preferences['newemail'];
// Detect duplicate before saving
// Detect duplicate before saving.
if ($DB->get_record('user', array('email' => $user->email))) {
$stremailnowexists = get_string('emailnowexists', 'auth');
echo $OUTPUT->box($stremailnowexists, 'center');
echo $OUTPUT->continue_button("$CFG->wwwroot/user/view.php?id=$user->id");
} else {
// update user email
$DB->set_field('user', 'email', $user->email, array('id' => $user->id));
// Update user email.
$authplugin = get_auth_plugin($user->auth);
$authplugin->user_update($olduser, $user);
events_trigger('user_updated', $user);
user_update_user($user, false);
$a->email = $user->email;
$stremailupdatesuccess = get_string('emailupdatesuccess', 'auth', $a);
echo $OUTPUT->box($stremailupdatesuccess, 'center');
+44 -35
View File
@@ -28,18 +28,19 @@
/**
* Creates a user
*
* @param object $user user to create
* @param stdClass $user user to create
* @param bool $updatepassword if true, authentication plugin will update password.
* @return int id of the newly created user
*/
function user_create_user($user) {
function user_create_user($user, $updatepassword = true) {
global $DB;
// set the timecreate field to the current time
// Set the timecreate field to the current time.
if (!is_object($user)) {
$user = (object)$user;
}
//check username
// Check username.
if ($user->username !== core_text::strtolower($user->username)) {
throw new moodle_exception('usernamelowercase');
} else {
@@ -48,10 +49,10 @@ function user_create_user($user) {
}
}
// save the password in a temp value for later
if (isset($user->password)) {
// Save the password in a temp value for later.
if ($updatepassword && isset($user->password)) {
//check password toward the password policy
// Check password toward the password policy.
if (!check_password_policy($user->password, $errmsg)) {
throw new moodle_exception($errmsg);
}
@@ -63,36 +64,39 @@ function user_create_user($user) {
$user->timecreated = time();
$user->timemodified = $user->timecreated;
// insert the user into the database
// Insert the user into the database.
$newuserid = $DB->insert_record('user', $user);
// trigger user_created event on the full database user row
$newuser = $DB->get_record('user', array('id' => $newuserid));
// Create USER context for this user.
$usercontext = context_user::instance($newuserid);
// create USER context for this user
context_user::instance($newuserid);
// update user password if necessary
// Update user password if necessary.
if (isset($userpassword)) {
// Get full database user row, in case auth is default.
$newuser = $DB->get_record('user', array('id' => $newuserid));
$authplugin = get_auth_plugin($newuser->auth);
$authplugin->user_update_password($newuser, $userpassword);
}
events_trigger('user_created', $newuser);
add_to_log(SITEID, 'user', get_string('create'), '/view.php?id='.$newuser->id,
fullname($newuser));
// Trigger event.
$event = \core\event\user_created::create(
array(
'objectid' => $newuserid,
'context' => $usercontext
)
);
$event->trigger();
return $newuserid;
}
/**
* Update a user with a user object (will compare against the ID)
*
* @param object $user the user to update
* @param stdClass $user the user to update
* @param bool $updatepassword if true, authentication plugin will update password.
*/
function user_update_user($user) {
function user_update_user($user, $updatepassword = true) {
global $DB;
// set the timecreate field to the current time
@@ -111,8 +115,8 @@ function user_update_user($user) {
}
}
// unset password here, for updating later
if (isset($user->password)) {
// Unset password here, for updating later, if password update is required.
if ($updatepassword && isset($user->password)) {
//check password toward the password policy
if (!check_password_policy($user->password, $errmsg)) {
@@ -126,22 +130,27 @@ function user_update_user($user) {
$user->timemodified = time();
$DB->update_record('user', $user);
// trigger user_updated event on the full database user row
$updateduser = $DB->get_record('user', array('id' => $user->id));
if ($updatepassword) {
// Get full user record.
$updateduser = $DB->get_record('user', array('id' => $user->id));
// if password was set, then update its hash
if (isset($passwd)) {
$authplugin = get_auth_plugin($updateduser->auth);
if ($authplugin->can_change_password()) {
$authplugin->user_update_password($updateduser, $passwd);
// if password was set, then update its hash
if (isset($passwd)) {
$authplugin = get_auth_plugin($updateduser->auth);
if ($authplugin->can_change_password()) {
$authplugin->user_update_password($updateduser, $passwd);
}
}
}
events_trigger('user_updated', $updateduser);
add_to_log(SITEID, 'user', get_string('update'), '/view.php?id='.$updateduser->id,
fullname($updateduser));
// Trigger event.
$event = \core\event\user_updated::create(
array(
'objectid' => $user->id,
'context' => context_user::instance($user->id)
)
);
$event->trigger();
}
/**
+132
View File
@@ -0,0 +1,132 @@
<?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/>.
/**
* Unit tests for user/lib.php.
*
* @package core_user
* @category phpunit
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot.'/user/lib.php');
/**
* Unit tests for user lib api.
*
* @package core_user
* @category phpunit
* @copyright 2013 Rajesh Taneja <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class core_userliblib_testcase extends advanced_testcase {
/**
* Test user_update_user.
*/
public function test_user_update_user() {
global $DB;
$this->resetAfterTest();
// Create user and modify user profile.
$user = $this->getDataGenerator()->create_user();
$user->firstname = 'Test';
$user->password = 'M00dLe@T';
// Update user and capture event.
$sink = $this->redirectEvents();
user_update_user($user);
$events = $sink->get_events();
$sink->close();
$event = array_pop($events);
// Test updated value.
$dbuser = $DB->get_record('user', array('id' => $user->id));
$this->assertSame($user->firstname, $dbuser->firstname);
$this->assertNotSame('M00dLe@T', $dbuser->password);
// Test event.
$this->assertInstanceOf('\core\event\user_updated', $event);
$this->assertSame($user->id, $event->objectid);
$this->assertSame('user_updated', $event->get_legacy_eventname());
$this->assertEventLegacyData($dbuser, $event);
$this->assertEquals(context_user::instance($user->id), $event->get_context());
$expectedlogdata = array(SITEID, 'user', 'update', 'view.php?id='.$user->id, '');
$this->assertEventLegacyLogData($expectedlogdata, $event);
// Update user with no password update.
$password = $user->password = hash_internal_user_password('M00dLe@T');
user_update_user($user, false);
$dbuser = $DB->get_record('user', array('id' => $user->id));
$this->assertSame($password, $dbuser->password);
}
/**
* Test create_users.
*/
public function test_create_users() {
global $DB;
$this->resetAfterTest();
$user = array(
'username' => 'usernametest1',
'password' => 'Moodle2012!',
'idnumber' => 'idnumbertest1',
'firstname' => 'First Name User Test 1',
'lastname' => 'Last Name User Test 1',
'middlename' => 'Middle Name User Test 1',
'lastnamephonetic' => '最後のお名前のテスト一号',
'firstnamephonetic' => 'お名前のテスト一号',
'alternatename' => 'Alternate Name User Test 1',
'email' => '[email protected]',
'description' => 'This is a description for user 1',
'city' => 'Perth',
'country' => 'au'
);
// Create user and capture event.
$sink = $this->redirectEvents();
$user['id'] = user_create_user($user);
$events = $sink->get_events();
$sink->close();
$event = array_pop($events);
// Test user info in DB.
$dbuser = $DB->get_record('user', array('id' => $user['id']));
$this->assertEquals($dbuser->username, $user['username']);
$this->assertEquals($dbuser->idnumber, $user['idnumber']);
$this->assertEquals($dbuser->firstname, $user['firstname']);
$this->assertEquals($dbuser->lastname, $user['lastname']);
$this->assertEquals($dbuser->email, $user['email']);
$this->assertEquals($dbuser->description, $user['description']);
$this->assertEquals($dbuser->city, $user['city']);
$this->assertEquals($dbuser->country, $user['country']);
// Test event.
$this->assertInstanceOf('\core\event\user_created', $event);
$this->assertEquals($user['id'], $event->objectid);
$this->assertEquals('user_created', $event->get_legacy_eventname());
$this->assertEquals(context_user::instance($user['id']), $event->get_context());
$this->assertEventLegacyData($dbuser, $event);
$expectedlogdata = array(SITEID, 'user', 'add', '/view.php?id='.$event->objectid, fullname($dbuser));
$this->assertEventLegacyLogData($expectedlogdata, $event);
}
}