Fix update user by CSV #3211

pull/3223/head
Angel Fernando Quiroz Campos 5 years ago
parent f6db95932f
commit b24f2dab8c
  1. 279
      main/admin/user_update_import.php

@ -7,6 +7,8 @@
* @package chamilo.admin * @package chamilo.admin
*/ */
use Ddeboer\DataImport\Reader\CsvReader;
/** /**
* Validate the imported data. * Validate the imported data.
*/ */
@ -22,52 +24,35 @@ function validate_data($users)
$errors = []; $errors = [];
$usernames = []; $usernames = [];
// 1. Check if mandatory fields are set.
$mandatory_fields = ['LastName', 'FirstName'];
if (api_get_setting('registration', 'email') == 'true') {
$mandatory_fields[] = 'Email';
}
$classExistList = []; $classExistList = [];
$usergroup = new UserGroup(); $usergroup = new UserGroup();
foreach ($users as $user) { foreach ($users as $user) {
foreach ($mandatory_fields as $field) {
if (isset($user[$field])) {
if (empty($user[$field])) {
$user['error'] = get_lang($field.'Mandatory');
$errors[] = $user;
}
}
}
// 2. Check username, first, check whether it is empty. // 2. Check username, first, check whether it is empty.
if (isset($user['NewUserName'])) { if (isset($user['NewUserName'])) {
if (!UserManager::is_username_empty($user['NewUserName'])) { if (!UserManager::is_username_empty($user['NewUserName'])) {
// 2.1. Check whether username is too long. // 2.1. Check whether username is too long.
if (UserManager::is_username_too_long($user['NewUserName'])) { if (UserManager::is_username_too_long($user['NewUserName'])) {
$user['error'] = get_lang('UserNameTooLong'); $errors[$user['UserName']][] = get_lang('UserNameTooLong');
$errors[] = $user;
} }
// 2.2. Check whether the username was used twice in import file. // 2.2. Check whether the username was used twice in import file.
if (isset($usernames[$user['NewUserName']])) { if (isset($usernames[$user['NewUserName']])) {
$user['error'] = get_lang('UserNameUsedTwice'); $errors[$user['UserName']][] = get_lang('UserNameUsedTwice');
$errors[] = $user;
} }
$usernames[$user['UserName']] = 1; $usernames[$user['UserName']] = 1;
// 2.3. Check whether username is allready occupied. // 2.3. Check whether username is allready occupied.
if (!UserManager::is_username_available($user['NewUserName']) && $user['NewUserName'] != $user['UserName']) { if (!UserManager::is_username_available($user['NewUserName']) &&
$user['error'] = get_lang('UserNameNotAvailable'); $user['NewUserName'] != $user['UserName']
$errors[] = $user; ) {
$errors[$user['UserName']][] = get_lang('UserNameNotAvailable');
} }
} }
} }
// 3. Check status. // 3. Check status.
if (isset($user['Status']) && !api_status_exists($user['Status'])) { if (isset($user['Status']) && !api_status_exists($user['Status'])) {
$user['error'] = get_lang('WrongStatus'); $errors[$user['UserName']][] = get_lang('WrongStatus');
$errors[] = $user;
} }
// 4. Check ClassId // 4. Check ClassId
@ -79,8 +64,7 @@ function validate_data($users)
} }
$info = $usergroup->get($id); $info = $usergroup->get($id);
if (empty($info)) { if (empty($info)) {
$user['error'] = sprintf(get_lang('ClassIdDoesntExists'), $id); $errors[$user['UserName']][] = sprintf(get_lang('ClassIdDoesntExists'), $id);
$errors[] = $user;
} else { } else {
$classExistList[] = $info['id']; $classExistList[] = $info['id'];
} }
@ -90,8 +74,7 @@ function validate_data($users)
// 5. Check authentication source // 5. Check authentication source
if (!empty($user['AuthSource'])) { if (!empty($user['AuthSource'])) {
if (!in_array($user['AuthSource'], $defined_auth_sources)) { if (!in_array($user['AuthSource'], $defined_auth_sources)) {
$user['error'] = get_lang('AuthSourceNotAvailable'); $errors[$user['UserName']][] = get_lang('AuthSourceNotAvailable');
$errors[] = $user;
} }
} }
} }
@ -99,74 +82,53 @@ function validate_data($users)
return $errors; return $errors;
} }
/**
* Add missing user-information (which isn't required, like password, username etc).
*/
function complete_missing_data($user)
{
global $purification_option_for_usernames;
// 1. Create a username if necessary.
if (UserManager::is_username_empty($user['UserName'])) {
$user['UserName'] = UserManager::create_unique_username($user['FirstName'], $user['LastName']);
} else {
$user['UserName'] = UserManager::purify_username($user['UserName'], $purification_option_for_usernames);
}
// 2. Generate a password if necessary.
if (empty($user['Password'])) {
$user['Password'] = api_generate_password();
}
// 3. Set status if not allready set.
if (empty($user['Status'])) {
$user['Status'] = 'user';
}
// 4. Set authsource if not allready set.
if (empty($user['AuthSource'])) {
$user['AuthSource'] = PLATFORM_AUTH_SOURCE;
}
return $user;
}
/** /**
* Update users from the imported data. * Update users from the imported data.
* *
* @param array $users List of users * @param array $users List of users.
* @param bool $resetPassword Optional.
* *
* @return false|null * @return false|null
*
* @uses \global variable $inserted_in_course, which returns the list of courses the user was inserted in
*/ */
function updateUsers($users) function updateUsers($users, $resetPassword = false)
{ {
global $insertedIn_course;
// Not all scripts declare the $inserted_in_course array (although they should).
if (!isset($inserted_in_course)) {
$inserted_in_course = [];
}
$usergroup = new UserGroup(); $usergroup = new UserGroup();
$send_mail = !empty($_POST['sendMail']) ? true : false;
if (is_array($users)) { if (is_array($users)) {
foreach ($users as $user) { foreach ($users as $user) {
$user = complete_missing_data($user); if (isset($user['Status'])) {
$user['Status'] = api_status_key($user['Status']); $user['Status'] = api_status_key($user['Status']);
$userName = $user['UserName'];
$userInfo = api_get_user_info_from_username($userName);
$user_id = $userInfo['user_id'];
if ($user_id == 0) {
return false;
} }
$userInfo = api_get_user_info_from_username($user['UserName']);
if (empty($userInfo)) {
continue;
}
$user_id = $userInfo['user_id'];
$firstName = isset($user['FirstName']) ? $user['FirstName'] : $userInfo['firstname']; $firstName = isset($user['FirstName']) ? $user['FirstName'] : $userInfo['firstname'];
$lastName = isset($user['LastName']) ? $user['LastName'] : $userInfo['lastname']; $lastName = isset($user['LastName']) ? $user['LastName'] : $userInfo['lastname'];
$userName = isset($user['NewUserName']) ? $user['NewUserName'] : $userInfo['username']; $userName = isset($user['NewUserName']) ? $user['NewUserName'] : $userInfo['username'];
$changePassMethod = 0; $changePassMethod = 0;
$password = isset($user['Password']) ? $user['Password'] : ''; $password = null;
if (!empty($password)) { $authSource = $userInfo['auth_source'];
$changePassMethod = 2;
} if ($resetPassword) {
$authSource = isset($user['AuthSource']) ? $user['AuthSource'] : ''; $changePassMethod = 1;
if ($changePassMethod === 2 && !empty($authSource) && $authSource != $userInfo['auth_source']) { } else {
$changePassMethod = 3; if (isset($user['Password'])) {
$changePassMethod = 2;
$password = $user['Password'];
}
if (isset($user['AuthSource']) && $user['AuthSource'] != $authSource) {
$authSource = $user['AuthSource'];
$changePassMethod = 3;
}
} }
$email = isset($user['Email']) ? $user['Email'] : $userInfo['email']; $email = isset($user['Email']) ? $user['Email'] : $userInfo['email'];
$status = isset($user['Status']) ? $user['Status'] : $userInfo['status']; $status = isset($user['Status']) ? $user['Status'] : $userInfo['status'];
$officialCode = isset($user['OfficialCode']) ? $user['OfficialCode'] : $userInfo['official_code']; $officialCode = isset($user['OfficialCode']) ? $user['OfficialCode'] : $userInfo['official_code'];
@ -197,7 +159,7 @@ function updateUsers($users)
null, null,
$language, $language,
'', '',
'', false,
$changePassMethod $changePassMethod
); );
if (!empty($user['Courses']) && !is_array($user['Courses'])) { if (!empty($user['Courses']) && !is_array($user['Courses'])) {
@ -208,7 +170,6 @@ function updateUsers($users)
if (CourseManager::course_exists($course)) { if (CourseManager::course_exists($course)) {
CourseManager::subscribeUser($user_id, $course, $user['Status']); CourseManager::subscribeUser($user_id, $course, $user['Status']);
$course_info = CourseManager::get_course_information($course); $course_info = CourseManager::get_course_information($course);
$inserted_in_course[$course] = $course_info['title'];
} }
} }
} }
@ -247,16 +208,28 @@ function updateUsers($users)
* *
* @param string $file Path to the CSV-file * @param string $file Path to the CSV-file
* *
* @throws Exception
*
* @return array All userinformation read from the file * @return array All userinformation read from the file
*/ */
function parse_csv_data($file) function parse_csv_data($file)
{ {
$users = Import :: csvToArray($file); $file = new SplFileObject($file);
foreach ($users as $index => $user) { $csv = new CsvReader($file, ';');
if (isset($user['Courses'])) { $csv->setHeaderRowNumber(0);
$user['Courses'] = explode('|', trim($user['Courses']));
if (!in_array('UserName', $csv->getColumnHeaders())) {
throw new Exception(get_lang("UserNameMandatory"));
}
$users = [];
foreach ($csv as $row) {
if (isset($row['Courses'])) {
$row['Courses'] = explode('|', trim($row['Courses']));
} }
$users[$index] = $user;
$users[] = $row;
} }
return $users; return $users;
@ -297,106 +270,86 @@ $interbreadcrumb[] = ["url" => 'index.php', "name" => get_lang('PlatformAdmin')]
set_time_limit(0); set_time_limit(0);
$extra_fields = UserManager::get_extra_fields(0, 0, 5, 'ASC', true); $extra_fields = UserManager::get_extra_fields(0, 0, 5, 'ASC', true);
$user_id_error = [];
$error_message = '';
if (isset($_POST['formSent']) && $_POST['formSent'] && $_FILES['import_file']['size'] !== 0) { $form = new FormValidator('user_update_import', 'post', api_get_self());
$file_type = 'csv'; $form->addElement('header', $tool_name);
$form->addFile('import_file', get_lang('ImportFileLocation'), ['accept' => 'text/csv', 'id' => 'import_file']);
$form->addCheckBox('reset_password', '', get_lang('AutoGeneratePassword'));
if ($form->validate() && Security::check_token('post')) {
Security::clear_token(); Security::clear_token();
$tok = Security::get_token();
$allowed_file_mimetype = ['csv', 'xml'];
$error_kind_file = false;
$uploadInfo = pathinfo($_FILES['import_file']['name']); $formValues = $form->exportValues();
$ext_import_file = $uploadInfo['extension'];
if (empty($_FILES['import_file']) || empty($_FILES['import_file']['size'])) {
if (in_array($ext_import_file, $allowed_file_mimetype)) { header('Location: '.api_get_self());
if (strcmp($file_type, 'csv') === 0 && $ext_import_file == $allowed_file_mimetype[0]) { exit;
$users = parse_csv_data($_FILES['import_file']['tmp_name']);
$errors = validate_data($users);
$error_kind_file = false;
} elseif (strcmp($file_type, 'xml') === 0 && $ext_import_file == $allowed_file_mimetype[1]) {
$users = parse_xml_data($_FILES['import_file']['tmp_name']);
$errors = validate_data($users);
$error_kind_file = false;
} else {
$error_kind_file = true;
}
} else {
$error_kind_file = true;
} }
// List user id with error. $uploadInfo = pathinfo($_FILES['import_file']['name']);
$users_to_insert = $user_id_error = [];
if (is_array($errors)) { if ($uploadInfo['extension'] !== 'csv') {
foreach ($errors as $my_errors) { Display::addFlash(
$user_id_error[] = $my_errors['UserName']; Display::return_message(get_lang('YouMustImportAFileAccordingToSelectedOption'), 'error')
} );
}
if (is_array($users)) { header('Location: '.api_get_self());
foreach ($users as $my_user) { exit;
if (!in_array($my_user['UserName'], $user_id_error)) {
$users_to_insert[] = $my_user;
}
}
} }
$inserted_in_course = []; try {
if (strcmp($file_type, 'csv') === 0) { $users = parse_csv_data($_FILES['import_file']['tmp_name']);
updateUsers($users_to_insert); } catch (Exception $exception) {
} Display::addFlash(
Display::return_message($exception->getMessage(), 'error')
);
if (count($errors) > 0) { header('Location: '.api_get_self());
$see_message_import = get_lang('FileImportedJustUsersThatAreNotRegistered'); exit;
} else {
$see_message_import = get_lang('FileImported');
} }
$warning_message = ''; $errors = validate_data($users);
if (count($errors) != 0) { $errorUsers = array_keys($errors);
$warning_message = '<ul>'; $usersToUpdate = [];
foreach ($errors as $index => $error_user) {
$warning_message .= '<li><b>'.$error_user['error'].'</b>: '; foreach ($users as $user) {
$warning_message .= if (!in_array($user['UserName'], $errorUsers)) {
'<strong>'.$error_user['UserName'].'</strong>&nbsp;('. $usersToUpdate[] = $user;
api_get_person_name($error_user['FirstName'], $error_user['LastName']).')';
$warning_message .= '</li>';
} }
$warning_message .= '</ul>';
} }
// if the warning message is too long then we display the warning message trough a session updateUsers($usersToUpdate, isset($formValues['reset_password']));
if (!empty($warning_message)) {
Display::addFlash(Display::return_message($warning_message, 'warning', false));
}
if ($error_kind_file) { if (empty($errors)) {
Display::addFlash(Display::return_message(get_lang('YouMustImportAFileAccordingToSelectedOption'), 'error', false)); Display::addFlash(
Display::return_message(get_lang('FileImported'), 'success')
);
} else { } else {
header('Location: '.api_get_path(WEB_CODE_PATH).'admin/user_list.php?sec_token='.$tok); $warningMessage = '';
exit;
foreach ($errors as $errorUsername => $errorUserMessages) {
$warningMessage .= "<strong>$errorUsername</strong>";
$warningMessage .= '<ul><li>'.implode('</li><li>', $errorUserMessages).'</li></ul>';
}
Display::addFlash(
Display::return_message(get_lang('FileImportedJustUsersThatAreNotRegistered'), 'warning')
);
Display::addFlash(
Display::return_message($warningMessage, 'warning', false)
);
} }
}
Display::display_header($tool_name);
if (!empty($error_message)) { header('Location: '.api_get_self());
echo Display::return_message($error_message, 'error'); exit;
} }
$form = new FormValidator('user_update_import', 'post', api_get_self()); Display::display_header($tool_name);
$form->addElement('header', $tool_name);
$form->addElement('hidden', 'formSent');
$form->addElement('file', 'import_file', get_lang('ImportFileLocation'));
$group = []; $token = Security::get_token();
$form->addHidden('sec_token', $token);
$form->addButtonImport(get_lang('Import')); $form->addButtonImport(get_lang('Import'));
$defaults['formSent'] = 1;
$defaults['sendMail'] = 0;
$defaults['file_type'] = 'csv';
$form->setDefaults($defaults);
$form->display(); $form->display();
$list = []; $list = [];

Loading…
Cancel
Save