diff --git a/admin/user.php b/admin/user.php
index 9ae92ee..dbceb02 100644
--- a/admin/user.php
+++ b/admin/user.php
@@ -27,7 +27,10 @@
$stredit = get_string('edit');
$strdelete = get_string('delete');
+ $strundelete = get_string('undelete');
+ $strdeleted = get_string('deleted');
$strdeletecheck = get_string('deletecheck');
+ $strsearch = get_string('search');
$strshowallusers = get_string('showallusers');
if (empty($CFG->loginhttps)) {
@@ -67,18 +70,23 @@
error("You are not allowed to delete the primary admin user!", '', true);
}
- if ($confirm != md5($delete)) {
- $fullname = fullname($user, true);
- print_heading(get_string('deleteuser', 'admin'));
- $optionsyes = array('delete'=>$delete, 'confirm'=>md5($delete), 'sesskey'=>sesskey());
- notice_yesno(get_string('deletecheckfull', '', "'$fullname'"), 'user.php', 'user.php', $optionsyes, NULL, 'post', 'get');
- admin_externalpage_print_footer();
- die;
- } else if (data_submitted() and !$user->deleted) {
- if (delete_user($user)) {
- notify(get_string('deletedactivity', '', fullname($user, true)) );
- } else {
- notify(get_string('deletednot', '', fullname($user, true)));
+ if ($user->deleted) {
+ undelete_user($user);
+ notify(get_string('undeleteduser', 'admin', $user));
+ } else {
+ if ($confirm != md5($delete)) {
+ $fullname = fullname($user, true);
+ print_heading(get_string('deleteuser', 'admin'));
+ $optionsyes = array('delete'=>$delete, 'confirm'=>md5($delete), 'sesskey'=>sesskey());
+ notice_yesno(get_string('deletecheckfull', '', "'$fullname'"), 'user.php', 'user.php', $optionsyes, NULL, 'post', 'get');
+ admin_externalpage_print_footer();
+ die;
+ } else if (data_submitted() and !$user->deleted) {
+ if (delete_user($user)) {
+ notify(get_string('deletedactivity', '', fullname($user, true)) );
+ } else {
+ notify(get_string('deletednot', '', fullname($user, true)));
+ }
}
}
} else if ($acl and confirm_sesskey()) {
@@ -213,10 +221,13 @@
if ($user->id == $USER->id) {
$deletebutton = "";
} else {
+ $deletebutton = "";
if (has_capability('moodle/user:delete', $sitecontext)) {
- $deletebutton = "id&sesskey=$USER->sesskey\">$strdelete";
- } else {
- $deletebutton ="";
+ if ($user->deleted) {
+ $deletebutton = "id&sesskey=$USER->sesskey\">$strundelete";
+ } else {
+ $deletebutton = "id&sesskey=$USER->sesskey\">$strdelete";
+ }
}
}
@@ -266,7 +277,13 @@
}
$fullname = fullname($user, true);
- $table->data[] = array ("id&course=$site->id\">$fullname",
+ $deletedmark = '';
+ if ($user->deleted) {
+ $deletedmark = '' . get_string('deletedmark', 'admin') . '';
+ $editbutton = '';
+ }
+
+ $table->data[] = array ("$deletedmarkid&course=$site->id\">$fullname",
"$user->email",
"$user->city",
"$user->country",
diff --git a/lang/en_utf8/admin.php b/lang/en_utf8/admin.php
index 28450b7..7b13b54 100644
--- a/lang/en_utf8/admin.php
+++ b/lang/en_utf8/admin.php
@@ -276,6 +276,7 @@ $string['defaultrequestcategory'] = 'Default category for course requests';
$string['defaultsettinginfo'] = 'Default: $a';
$string['defaultuserroleid'] = 'Default role for all users';
$string['defaultvalues'] = 'Default values';
+$string['deletedmark'] = '[x]';
$string['deleteerrors'] = 'Delete errors';
$string['deleteunconfirmed'] = 'Delete unconfirmed users after';
$string['deleteuser'] = 'Delete user';
@@ -656,6 +657,7 @@ $string['timezonenotforced'] = 'Users can choose their own timezone';
$string['tokenizerrecommended'] = 'Installing the optional PHP Tokenizer extension is recommended -- it improves Moodle Networking functionality.';
$string['unattendedoperation'] = 'Unattended operation';
$string['unbookmarkthispage'] = 'unbookmark this page';
+$string['undeleteduser'] = 'The user has been undeleted. However, please note that course enrolments and group membership cannot be restored automatically.';
$string['unicodeupgradenotice'] = 'In Moodle 1.6 we have migrated all languages to Unicode. To complete the upgrade for this site, you need to convert all the data in your database to Unicode (UTF-8) using our migration script. Click here to run the migration script now!';
$string['unicoderecommended'] = 'Storing all your data in Unicode (UTF-8) is recommended. New installations should be performed into databases that have their default character set as Unicode. If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).';
$string['unicoderequired'] = 'It is required that you store all your data in Unicode format (UTF-8). New installations must be performed into databases that have their default character set as Unicode. If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).';
diff --git a/lang/en_utf8/moodle.php b/lang/en_utf8/moodle.php
index df3373e..223e367 100644
--- a/lang/en_utf8/moodle.php
+++ b/lang/en_utf8/moodle.php
@@ -1486,6 +1486,7 @@ $string['trysearching'] = 'Try searching instead.';
$string['turneditingoff'] = 'Turn editing off';
$string['turneditingon'] = 'Turn editing on';
$string['undecided'] = 'Undecided';
+$string['undelete'] = 'Undelete';
$string['unenrol'] = 'Unenrol';
$string['unenrolroleusers'] = 'Unenrol users';
$string['unenrolallstudents'] = 'Unenrol all students';
diff --git a/lib/datalib.php b/lib/datalib.php
index db589a4..0559421 100644
--- a/lib/datalib.php
+++ b/lib/datalib.php
@@ -305,7 +305,7 @@ function get_users_listing($sort='lastaccess', $dir='ASC', $page=0, $recordsperp
$LIKE = sql_ilike();
$fullname = sql_fullname();
- $select = "deleted <> '1'";
+ $select = "id > 0";
if (!empty($search)) {
$search = trim($search);
@@ -329,7 +329,7 @@ function get_users_listing($sort='lastaccess', $dir='ASC', $page=0, $recordsperp
}
/// warning: will return UNCONFIRMED USERS
- return get_records_sql("SELECT id, username, email, firstname, lastname, city, country, lastaccess, confirmed, mnethostid
+ return get_records_sql("SELECT id, username, email, firstname, lastname, city, country, lastaccess, confirmed, mnethostid, deleted
FROM {$CFG->prefix}user
WHERE $select $sort", $page, $recordsperpage);
diff --git a/lib/moodlelib.php b/lib/moodlelib.php
index 6415a36..0384d73 100644
--- a/lib/moodlelib.php
+++ b/lib/moodlelib.php
@@ -2860,6 +2860,25 @@ function truncate_userinfo($info) {
}
/**
+ * Unmarks user as deleted, and tries to restore the username, idnumber and email address
+ */
+function undelete_user($user) {
+ global $CFG;
+
+ $updateuser = new stdclass;
+ $updateuser->id = $user->id;
+ $updateuser->deleted = 0;
+ $updateuser->username = get_user_preferences('old_username');
+ $updateuser->idnumber = get_user_preferences('old_idnumber');
+ $updateuser->email = get_user_preferences('old_email');
+ $updateuser->timemodified = time();
+ // Don't undelete them if we coudln't find a username and email, at least.
+ if (!empty($updateuser->username) && !empty($updateuser->email)) {
+ update_record('user', $updateuser);
+ }
+}
+
+/**
* Marks user deleted in internal user database and notifies the auth plugin.
* Also unenrols user from all roles and does other cleanup.
* @param object $user Userobject before delete (without system magic quotes)
@@ -2894,6 +2913,10 @@ function delete_user($user) {
$delname++;
}
+ set_user_preference('old_username', $user->username);
+ set_user_preference('old_idnumber', $user->idnumber);
+ set_user_preference('old_email', $user->email);
+
// mark internal user record as "deleted"
$updateuser = new object();
$updateuser->id = $user->id;