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;