From 0c88a3ceec905a763dc03e08f3529b51b80a1c12 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 9 Aug 2013 19:28:39 +0200 Subject: [PATCH] Updating entities now depends in the external ids see BT#6369 --- main/cron/import_csv.php | 172 ++++++++++++++++++---------- main/inc/lib/course.lib.php | 11 +- main/inc/lib/sessionmanager.lib.php | 74 +++++++++--- 3 files changed, 172 insertions(+), 85 deletions(-) diff --git a/main/cron/import_csv.php b/main/cron/import_csv.php index 1626b555be..63c6d6e77a 100644 --- a/main/cron/import_csv.php +++ b/main/cron/import_csv.php @@ -1,6 +1,6 @@ 'external_session_id', + 'course' => 'external_course_id', + 'user' => 'external_user_id', + ); /** * @param Logger $logger @@ -50,49 +55,7 @@ class ImportCsv } if ($this->getDumpValues()) { - - $table = Database::get_main_table(TABLE_MAIN_USER); - $sql = "DELETE FROM $table WHERE username NOT IN ('admin') AND lastname <> 'Anonymous' "; - Database::query($sql); - - echo 'Dumping tables'.PHP_EOL; - echo $sql.PHP_EOL; - - $table = Database::get_main_table(TABLE_MAIN_COURSE); - $sql = "DELETE FROM $table"; - Database::query($sql); - echo $sql.PHP_EOL; - - $table = Database::get_main_table(TABLE_MAIN_COURSE_USER); - $sql = "DELETE FROM $table"; - Database::query($sql); - echo $sql.PHP_EOL; - - $table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER); - $sql = "DELETE FROM $table"; - Database::query($sql); - echo $sql.PHP_EOL; - - $table = Database::get_main_table(TABLE_MAIN_SESSION); - $sql = "DELETE FROM $table"; - Database::query($sql); - echo $sql.PHP_EOL; - - $table = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY); - $sql = "DELETE FROM $table"; - Database::query($sql); - echo $sql.PHP_EOL; - - $table = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); - $sql = "DELETE FROM $table"; - Database::query($sql); - echo $sql.PHP_EOL; - - $table = Database::get_main_table(TABLE_MAIN_SESSION_USER); - $sql = "DELETE FROM $table"; - Database::query($sql); - echo $sql.PHP_EOL; - + $this->dumpDatabaseTables(); } echo "Starting with reading the files: ".PHP_EOL.PHP_EOL; @@ -129,6 +92,7 @@ class ImportCsv } $sections = array('students', 'teachers', 'courses', 'sessions'); + $sections = array('sessions'); $this->prepareImport(); @@ -155,12 +119,12 @@ class ImportCsv private function prepareImport() { // Create user extra field: extra_external_user_id - UserManager::create_extra_field('external_user_id', 1, 'External user id', null); + UserManager::create_extra_field($this->extraFieldIdNameList['user'], 1, 'External user id', null); // Create course extra field: extra_external_course_id - CourseManager::create_course_extra_field('external_course_id', 1, 'External course id'); + CourseManager::create_course_extra_field($this->extraFieldIdNameList['course'], 1, 'External course id'); // Create session extra field extra_external_session_id - SessionManager::create_session_extra_field('external_session_id', 1, 'External session id'); + SessionManager::create_session_extra_field($this->extraFieldIdNameList['session'], 1, 'External session id'); } /** @@ -200,11 +164,11 @@ class ImportCsv $row['phone'] = $row['PhoneNumber']; if (isset($row['StudentID'])) { - $row['extra_external_user_id'] = $row['StudentID']; + $row['extra_'.$this->extraFieldIdNameList['user']] = $row['StudentID']; } if (isset($row['TeacherID'])) { - $row['extra_external_user_id'] = $row['TeacherID']; + $row['extra_'.$this->extraFieldIdNameList['user']] = $row['TeacherID']; } //$row['lastname'] = Status @@ -222,16 +186,13 @@ class ImportCsv $row['course_category'] = $row['CourseCategory']; $row['email'] = $row['Teacher']; $row['language'] = $row['Language']; - $row['external_id'] = $row['CourseID']; if (isset($row['CourseID'])) { - $row['extra_external_course_id'] = $row['CourseID']; + $row['extra_'.$this->extraFieldIdNameList['course']] = $row['CourseID']; } - return $row; } - /** * File to import * @param string $file @@ -254,7 +215,10 @@ class ImportCsv $this->logger->addInfo(count($data)." records found."); foreach ($data as $row) { $row = $this->cleanUserRow($row); - $userInfo = api_get_user_info_from_username($row['username']); + + $user_id = UserManager::get_user_id_from_original_id($row['extra_'.$this->extraFieldIdNameList['user']], $this->extraFieldIdNameList['user']); + $userInfo = api_get_user_info($user_id); + //$userInfo = api_get_user_info_from_username($row['username']); $userInfoByOfficialCode = api_get_user_info_from_official_code($row['official_code']); if (empty($userInfo) && empty($userInfoByOfficialCode)) { @@ -356,7 +320,14 @@ class ImportCsv $this->logger->addInfo(count($data)." records found."); foreach ($data as $row) { $row = $this->cleanUserRow($row); - $userInfo = api_get_user_info_from_username($row['username']); + //$userInfo = api_get_user_info_from_username($row['username']); + $user_id = UserManager::get_user_id_from_original_id($row['extra_'.$this->extraFieldIdNameList['user']], $this->extraFieldIdNameList['user']); + + $userInfo = array(); + if (!empty($user_id)) { + $userInfo = api_get_user_info($user_id); + } + $userInfoByOfficialCode = api_get_user_info_from_official_code($row['official_code']); if (empty($userInfo) && empty($userInfoByOfficialCode)) { @@ -451,13 +422,17 @@ class ImportCsv { $data = Import::csv_to_array($file); - $language = $this->defaultLanguage; + //$language = $this->defaultLanguage; if (!empty($data)) { $this->logger->addInfo(count($data)." records found."); + foreach ($data as $row) { $row = $this->cleanCourseRow($row); - $courseInfo = api_get_course_info($row['course_code']); + $courseCode = CourseManager::get_course_id_from_original_id($row['extra_'.$this->extraFieldIdNameList['course']], $this->extraFieldIdNameList['course']); + + //$courseInfo = api_get_course_info($row['course_code']); + $courseInfo = api_get_course_info($courseCode); if (empty($courseInfo)) { // Create $params = array(); @@ -466,12 +441,11 @@ class ImportCsv $params['wanted_code'] = $row['course_code']; $params['course_category'] = $row['course_category']; $params['course_language'] = $row['language']; - //$params['gradebook_model_id'] = isset($course_values['gradebook_model_id']) ? $course_values['gradebook_model_id'] : null; $courseInfo = CourseManager::create_course($params); if (!empty($courseInfo)) { - CourseManager::update_course_extra_field_value($courseInfo['code'], 'external_course_id', $row['extra_external_course_id']); + CourseManager::update_course_extra_field_value($courseInfo['code'], 'external_course_id', $row['extra_'.$this->extraFieldIdNameList['course']]); $this->logger->addInfo("Courses - Course created ".$courseInfo['code']); } else { $this->logger->addError("Courses - Can't create course:".$row['title']); @@ -482,8 +456,7 @@ class ImportCsv $params = array( 'title' => $row['title'], ); - - $result = CourseManager::update_attributes($courseInfo['id'], $params); + $result = CourseManager::update_attributes($courseInfo['real_id'], $params); if ($result) { $this->logger->addInfo("Courses - Course updated ".$courseInfo['code']); @@ -501,7 +474,14 @@ class ImportCsv */ private function importSessions($file) { - $result = SessionManager::importCSV($file, true, 1, $this->logger, array('SessionId' => 'extra_external_session_id')); + $result = SessionManager::importCSV( + $file, + true, + 1, + $this->logger, + array('SessionID' => 'extra_'.$this->extraFieldIdNameList['session']), + $this->extraFieldIdNameList['session'] + ); if (!empty($result['error_message'])) { $this->logger->addError($result['error_message']); @@ -509,6 +489,74 @@ class ImportCsv $this->logger->addInfo("Sessions - Sessions parsed: ".$result['session_counter']); $this->moveFile($file); } + + private function dumpDatabaseTables() + { + echo 'Dumping tables'.PHP_EOL; + + // User + + $table = Database::get_main_table(TABLE_MAIN_USER); + $sql = "DELETE FROM $table WHERE username NOT IN ('admin') AND lastname <> 'Anonymous' "; + Database::query($sql); + echo $sql.PHP_EOL; + + // Course + + $table = Database::get_main_table(TABLE_MAIN_COURSE); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + $table = Database::get_main_table(TABLE_MAIN_COURSE_USER); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + $table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + // Sessions + + $table = Database::get_main_table(TABLE_MAIN_SESSION); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + $table = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + $table = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + $table = Database::get_main_table(TABLE_MAIN_SESSION_USER); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + // Extra fields + + $table = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + $table = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + + $table = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES); + $sql = "DELETE FROM $table"; + Database::query($sql); + echo $sql.PHP_EOL; + } } use Monolog\Logger; diff --git a/main/inc/lib/course.lib.php b/main/inc/lib/course.lib.php index 1ced21b2bf..f5107829f9 100644 --- a/main/inc/lib/course.lib.php +++ b/main/inc/lib/course.lib.php @@ -86,7 +86,8 @@ class CourseManager { * @param array with the columns in the main.course table * @param mixed false if the course was not created, array with the course info */ - static function create_course($params) { + static function create_course($params) + { global $_configuration; // Check portal limits $access_url_id = 1; @@ -3244,18 +3245,18 @@ class CourseManager { /** * Get the course id based on the original id and field name in the extra fields. Returns 0 if course was not found * - * @param string Original course id + * @param string Original course code * @param string Original field name * @return int Course id */ public static function get_course_id_from_original_id($original_course_id_value, $original_course_id_name) { $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); - $sql_course = "SELECT id FROM $table_field cf INNER JOIN $t_cfv cfv ON cfv.field_id=cf.id WHERE field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; + $sql_course = "SELECT course_code FROM $table_field cf INNER JOIN $t_cfv cfv ON cfv.field_id=cf.id WHERE field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; $res = Database::query($sql_course); $row = Database::fetch_object($res); - if($row != false) { - return $row->id; + if ($row != false) { + return $row->course_code; } else { return 0; } diff --git a/main/inc/lib/sessionmanager.lib.php b/main/inc/lib/sessionmanager.lib.php index 8f476a6c95..4be80b5ff2 100644 --- a/main/inc/lib/sessionmanager.lib.php +++ b/main/inc/lib/sessionmanager.lib.php @@ -302,7 +302,6 @@ class SessionManager if (!empty($options['order'])) { $query .= " ORDER BY ".$options['order']; } - //var_dump($query); $result = Database::query($query); $formatted_sessions = array(); @@ -1873,7 +1872,7 @@ class SessionManager * converted to extra_external_session_id if you set this: array('SessionId' => 'extra_external_session_id') * @return array */ - static function importCSV($file, $updatesession, $user_id = null, $logger = null, $extraFields = array()) + static function importCSV($file, $updatesession, $user_id = null, $logger = null, $extraFields = array(), $extraFieldId = null) { $content = file($file); @@ -1884,6 +1883,11 @@ class SessionManager $user_id = api_get_user_id(); } + $eol = PHP_EOL; + if (PHP_SAPI !='cli') { + $eol = '
'; + } + $debug = false; if (isset($logger)) { $debug = true; @@ -1995,7 +1999,19 @@ class SessionManager } $session_counter++; } else { - $my_session_result = SessionManager::get_session_by_name($session_name); + $sessionId = null; + + if (isset($extraFields) && !empty($extraFields)) { + $sessionId = self::get_session_id_from_original_id($enreg['extra_'.$extraFieldId], 'extra_'.$extraFieldId); + if (empty($sessionId)) { + $my_session_result = false; + } else { + $my_session_result = true; + } + } else { + $my_session_result = self::get_session_by_name($session_name); + } + if ($my_session_result === false) { // Creating a session. @@ -2025,24 +2041,40 @@ class SessionManager } } } else { - // The session already exists, update it then. - $sql_session = "UPDATE $tbl_session SET - id_coach = '$coach_id', - date_start = '$date_start', - date_end = '$date_end', - visibility = '$visibility', - session_category_id = '$session_category_id' - WHERE name = '$session_name'"; - Database::query($sql_session); - $session_id = Database::query("SELECT id FROM $tbl_session WHERE name='$session_name'"); + if (isset($sessionId) && !empty($sessionId)) { + // The session already exists, update it then. + $sql_session = "UPDATE $tbl_session SET + id_coach = '$coach_id', + date_start = '$date_start', + date_end = '$date_end', + visibility = '$visibility', + session_category_id = '$session_category_id' + WHERE id = '$sessionId'"; + //name = '$session_name' + Database::query($sql_session); + $session_id = $sessionId; + } else { + + // The session already exists, update it then. + $sql_session = "UPDATE $tbl_session SET + id_coach = '$coach_id', + date_start = '$date_start', + date_end = '$date_end', + visibility = '$visibility', + session_category_id = '$session_category_id' + WHERE name = '$session_name'"; + Database::query($sql_session); + $row = Database::query("SELECT id FROM $tbl_session WHERE name='$session_name'"); + list($session_id) = Database::fetch_array($row); + } foreach ($enreg as $key => $value) { if (substr($key, 0, 6) == 'extra_') { //an extra field self::update_session_extra_field_value($session_id, substr($key, 6), $value); } } - list($session_id) = Database::fetch_array($session_id); + Database::query("DELETE FROM $tbl_session_user WHERE id_session='$session_id'"); Database::query("DELETE FROM $tbl_session_course WHERE id_session='$session_id'"); Database::query("DELETE FROM $tbl_session_course_user WHERE id_session='$session_id'"); @@ -2129,7 +2161,7 @@ class SessionManager $logger->addInfo("Sessions - Adding course coach: user #$coach_id ($course_coach) to course: '$course_code' and session #$session_id"); } } else { - $error_message .= get_lang('UserDoesNotExist').' : '.$user.'
'; + $error_message .= get_lang('UserDoesNotExist').' : '.$course_coach.$eol; } } } @@ -2137,8 +2169,10 @@ class SessionManager $users_in_course_counter = 0; // Adding the relationship "Session - Course - User". + foreach ($course_users as $user) { $user_id = UserManager::get_user_id_from_username($user); + if ($user_id !== false) { $sql = "INSERT IGNORE INTO $tbl_session_course_user SET id_user='$user_id', @@ -2150,9 +2184,10 @@ class SessionManager } $users_in_course_counter++; } else { - $error_message .= get_lang('UserDoesNotExist').': '.$user.'
'; + $error_message .= get_lang('UserDoesNotExist').': '.$user.$eol; } } + $sql = "UPDATE $tbl_session_course SET nbr_users='$users_in_course_counter' WHERE course_code='$course_code'"; Database::query($sql); @@ -2162,11 +2197,13 @@ class SessionManager // TODO: We should create the course as in the XML import. } + if (CourseManager::course_exists($course_code, true)) { $list = CourseManager :: get_courses_info_from_visual_code($course_code); foreach ($list as $vcourse) { + if ($vcourse['code'] == $course_code) { // Ignore, this has already been inserted. } else { @@ -2201,10 +2238,11 @@ class SessionManager } } else { - $error_message .= get_lang('UserDoesNotExist').' : '.$user.'
'; + $error_message .= get_lang('UserDoesNotExist').' : '.$course_coach.$eol; } } + $users_in_course_counter = 0; // Adding the relationship "Session - Course - User". foreach ($course_users as $user) { @@ -2222,7 +2260,7 @@ class SessionManager $users_in_course_counter++; } else { - $error_message .= get_lang('UserDoesNotExist').' : '.$user.'
'; + $error_message .= get_lang('UserDoesNotExist').' : '.$user.$eol; } } Database::query("UPDATE $tbl_session_course SET nbr_users='$users_in_course_counter' WHERE course_code='".$vcourse['code']."'");