Browse Source

Updating entities now depends in the external ids see BT#6369

Julio Montoya 11 years ago
parent
commit
0c88a3ceec
3 changed files with 172 additions and 85 deletions
  1. 110 62
      main/cron/import_csv.php
  2. 6 5
      main/inc/lib/course.lib.php
  3. 56 18
      main/inc/lib/sessionmanager.lib.php

+ 110 - 62
main/cron/import_csv.php

@@ -1,6 +1,6 @@
 <?php
 
-if (PHP_SAPI!='cli') {
+if (PHP_SAPI !='cli') {
     die('Run this script through the command line or comment this line in the code');
 }
 
@@ -16,6 +16,11 @@ class ImportCsv
     private $dumpValues;
     public $test;
     public $defaultLanguage = 'dutch';
+    public $extraFieldIdNameList = array(
+        'session' => '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;

+ 6 - 5
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;
         }

+ 56 - 18
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 = '<br />';
+        }
+
         $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.'<br />';
+                                    $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.'<br />';
+                                $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.'<br />';
+                                        $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.'<br />';
+                                        $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']."'");