diff --git a/main/admin/download_import_users.php b/main/admin/download_import_users.php new file mode 100644 index 0000000000..dea038934d --- /dev/null +++ b/main/admin/download_import_users.php @@ -0,0 +1,126 @@ + 'table table-responsive']); + $headers = [ + get_lang('SelectUser'), + get_lang('FieldTypeDatetime'), + get_lang('Files'), + ]; + $row = 0; + $column = 0; + foreach ($headers as $header) { + $table->setHeaderContents($row, $column, $header); + $column++; + } + + $row++; + $userId = api_get_user_id(); + + $userInfo = api_get_user_info($userId); + foreach ($data as $date => $elements) { + $dateTime = DateTime::createFromFormat('YmdHis', $date)->format('Y-m-d H:i:s'); + $files = ''; + foreach ($elements as $fileName => $file) { + $files .= "". + Display::return_icon('down.png', get_lang('Down'), '', ICON_SIZE_SMALL). + " $fileName
"; + } + if (!empty($files)) { + $table->setCellContents($row, 0, $userInfo['complete_name']); + $table->setCellContents($row, 1, $dateTime); + $table->setCellContents($row, 2, $files); + $row++; + } + } + + return $table->toHtml(); +} + +$this_section = SECTION_PLATFORM_ADMIN; +$defined_auth_sources[] = PLATFORM_AUTH_SOURCE; +if (isset($extAuthSource) && is_array($extAuthSource)) { + $defined_auth_sources = array_merge($defined_auth_sources, array_keys($extAuthSource)); +} + +$tool_name = get_lang('History'); +$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')]; +$interbreadcrumb[] = ['url' => 'user_import.php', 'name' => get_lang('ImportUserListXMLCSV')]; +$reloadImport = (isset($_REQUEST['reload_import']) && (int) $_REQUEST['reload_import'] === 1); + +$extra_fields = UserManager::get_extra_fields(0, 0, 5, 'ASC', true); +$printTable = getImportedUsersArchivesTable(); +Display::display_header($tool_name); + +$form = new FormValidator('user_import', 'post', api_get_self()); +$form->addHeader($tool_name); +$defaults['formSent'] = 1; +$form->addHtml($printTable); +$form->display(); +Display::display_footer(); diff --git a/main/admin/user_import.php b/main/admin/user_import.php index 69ed2baab1..9f02881483 100644 --- a/main/admin/user_import.php +++ b/main/admin/user_import.php @@ -4,6 +4,7 @@ use Chamilo\CoreBundle\Entity\ExtraFieldOptions; use ChamiloSession as Session; +use Ddeboer\DataImport\Writer\CsvWriter; /** * This tool allows platform admins to add users by uploading a CSV or XML file. @@ -18,6 +19,45 @@ api_protect_admin_script(true, null); api_protect_limit_for_session_admin(); set_time_limit(0); +/** + * Create directories and subdirectories for backup import csv data. + * + * @param null $path + * + * @return string|null + */ +function createDirectory($path = null) +{ + if ($path == null) { + return $path; + } + $path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path); + $realPath = explode(DIRECTORY_SEPARATOR, $path); + $data = ''; + foreach ($realPath as $pth) { + if (strlen($pth) > 0) { + $data .= DIRECTORY_SEPARATOR.$pth; + if (!is_dir($data)) { + mkdir($data, api_get_permissions_for_new_directories()); + $block = + ' +Order allow,deny +Deny from all + +Options -Indexes'; + + $fp = fopen($data.'/.htaccess', 'w'); + if ($fp) { + fwrite($fp, $block); + } + fclose($fp); + } + } + } + + return $data; +} + /** * @param array $users * @param bool $checkUniqueEmail @@ -212,14 +252,24 @@ function complete_missing_data($user) * @uses \global variable $inserted_in_course, which returns the list of * courses the user was inserted in */ -function save_data($users, $sendMail = false) -{ +function save_data( + $users, + $sendMail = false, + $targetFolder = null +) { global $inserted_in_course, $extra_fields; // Not all scripts declare the $inserted_in_course array (although they should). if (!isset($inserted_in_course)) { $inserted_in_course = []; } + + if (!empty($targetFolder)) { + $userSaved = []; + $userError = []; + $userWarning = []; + } + $usergroup = new UserGroup(); if (is_array($users)) { $efo = new ExtraFieldOption('user'); @@ -228,6 +278,7 @@ function save_data($users, $sendMail = false) foreach ($users as &$user) { if ($user['has_error']) { + $userError[] = $user; continue; } @@ -320,16 +371,113 @@ function save_data($users, $sendMail = false) UserManager::update_extra_field_value($user_id, $key, $value); } + $userSaved[] = $user; } else { $returnMessage = Display::return_message(get_lang('Error'), 'warning'); + $userWarning[] = $user; } $user['message'] = $returnMessage; } } + // Save with success, error and warning users + if (!empty($targetFolder)) { + $header = [ + 'id', + 'FirstName', + 'LastName', + 'Status', + 'Email', + 'UserName', + 'message', + ]; + // Save user with success + if (count($userSaved) != 0) { + $csv_content = []; + $csv_row = $header; + $csv_content[] = $csv_row; + foreach ($userSaved as $user) { + $csv_row = []; + $csv_row[] = isset($user['id']) ? $user['id'] : ''; + $csv_row[] = isset($user['FirstName']) ? $user['FirstName'] : ''; + $csv_row[] = isset($user['LastName']) ? $user['LastName'] : ''; + $csv_row[] = isset($user['Status']) ? $user['Status'] : ''; + $csv_row[] = isset($user['Email']) ? $user['Email'] : ''; + $csv_row[] = isset($user['UserName']) ? $user['UserName'] : ''; + $csv_row[] = isset($user['message']) ? strip_tags($user['message']) : ''; + $csv_content[] = $csv_row; + } + saveCsvFile($csv_content, $targetFolder.'user_success_'.count($userSaved)); + } + if (count($userError) != 0) { + // Save user with error + $csv_content = []; + $csv_row = $header; + $csv_content[] = $csv_row; + foreach ($userError as $user) { + $csv_row = []; + $csv_row[] = isset($user['id']) ? $user['id'] : ''; + $csv_row[] = isset($user['FirstName']) ? $user['FirstName'] : ''; + $csv_row[] = isset($user['LastName']) ? $user['LastName'] : ''; + $csv_row[] = isset($user['Status']) ? $user['Status'] : '-'; + $csv_row[] = isset($user['Email']) ? $user['Email'] : ''; + $csv_row[] = isset($user['UserName']) ? $user['UserName'] : ''; + $csv_row[] = isset($user['message']) ? strip_tags($user['message']) : ''; + $csv_content[] = $csv_row; + error_log(print_r($csv_row, 1)); + } + saveCsvFile($csv_content, $targetFolder.'user_error_'.count($userError)); + } + if (count($userWarning) != 0) { + // Save user with warning + $csv_content = []; + $csv_row = $header; + $csv_content[] = $csv_row; + foreach ($userWarning as $user) { + $csv_row = []; + $csv_row[] = isset($user['id']) ? $user['id'] : ''; + $csv_row[] = isset($user['FirstName']) ? $user['FirstName'] : ''; + $csv_row[] = isset($user['LastName']) ? $user['LastName'] : ''; + $csv_row[] = isset($user['Status']) ? $user['Status'] : ''; + $csv_row[] = isset($user['Email']) ? $user['Email'] : ''; + $csv_row[] = isset($user['UserName']) ? $user['UserName'] : ''; + $csv_row[] = isset($user['message']) ? strip_tags($user['message']) : ''; + $csv_content[] = $csv_row; + } + saveCsvFile($csv_content, $targetFolder.'user_warning_'.count($userWarning)); + } + } + return $users; } +/** + * Save array to a specific file. + * + * @param array $data + * @param $file + * @param string $enclosure + */ +function saveCsvFile($data = [], $file = 'example', $enclosure = '"') +{ + $filePath = $file.'.csv'; + $stream = fopen($filePath, 'w'); + $writer = new CsvWriter(';', $enclosure, $stream, true); + $writer->prepare(); + + foreach ($data as $item) { + if (empty($item)) { + $writer->writeItem([]); + continue; + } + $item = array_map('trim', $item); + $writer->writeItem($item); + } + $writer->finish(); + + return null; +} + /** * @param array $users * @param string $fileName @@ -463,12 +611,13 @@ function parse_xml_data($file, $sendEmail = 0, $checkUniqueEmail = true) } /** - * @param array $users - * @param bool $sendMail + * @param array $users + * @param bool $sendMail + * @param string $targetFolder */ -function processUsers(&$users, $sendMail) +function processUsers(&$users, $sendMail, $targetFolder = null) { - $users = save_data($users, $sendMail); + $users = save_data($users, $sendMail, $targetFolder); $warningMessage = ''; if (!empty($users)) { @@ -538,12 +687,26 @@ if (isset($_POST['formSent']) && $_POST['formSent'] && $_FILES['import_file']['s $resume = isset($_POST['resume_import']) ? true : false; $uploadInfo = pathinfo($_FILES['import_file']['name']); $ext_import_file = $uploadInfo['extension']; - + $targetFolder = null; $users = []; if (in_array($ext_import_file, $allowed_file_mimetype)) { if (strcmp($file_type, 'csv') === 0 && $ext_import_file == $allowed_file_mimetype[0] ) { + $user = api_get_user_info(); + $userId = (int) $user['id']; + $today = new DateTime(); + $today = $today->format('YmdHis'); + $targetFolder = api_get_configuration_value('root_sys').'app/cache/backup/import_users'; + $targetFolder .= DIRECTORY_SEPARATOR.$userId.DIRECTORY_SEPARATOR.$today; + $targetFolder = createDirectory($targetFolder).DIRECTORY_SEPARATOR; + $originalFile = $targetFolder.$_FILES['import_file']['name']; + // save original file + if (!file_exists($originalFile)) { + touch($originalFile); + file_put_contents($originalFile, file_get_contents($_FILES['import_file']['tmp_name'])); + } + Session::erase('user_import_data_'.$userId); $users = Import::csvToArray($_FILES['import_file']['tmp_name']); $users = parse_csv_data( @@ -565,7 +728,7 @@ if (isset($_POST['formSent']) && $_POST['formSent'] && $_FILES['import_file']['s $error_kind_file = false; } - processUsers($users, $sendMail); + processUsers($users, $sendMail, $targetFolder); if ($error_kind_file) { Display::addFlash( @@ -733,6 +896,10 @@ if (!empty($extraSettings) && isset($extraSettings['options']) && } $form->setDefaults($defaults); +if (is_dir(api_get_path(SYS_ARCHIVE_PATH).'backup/import_users')) { + // only show if backup exist + $form->addHtml("".get_lang('ViewHistoryChange').""); +} $form->display(); if ($formContinue) { @@ -741,7 +908,6 @@ if ($formContinue) { if ($reloadImport) { echo '