From b180dd8950c8bf149cbdbd37669f779c0ed17cb9 Mon Sep 17 00:00:00 2001 From: Imanol Losada Date: Tue, 3 Mar 2015 15:07:08 -0500 Subject: [PATCH 01/25] Add remind_course_expiration cron script - refs BT#9444 --- main/cron/remind_course_expiration.php | 120 +++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 main/cron/remind_course_expiration.php diff --git a/main/cron/remind_course_expiration.php b/main/cron/remind_course_expiration.php new file mode 100644 index 0000000000..d78a20c2f8 --- /dev/null +++ b/main/cron/remind_course_expiration.php @@ -0,0 +1,120 @@ + + */ +require_once __DIR__ . '/../inc/global.inc.php'; + +/** + * Initialization + */ +if (php_sapi_name() != 'cli') { + exit; //do not run from browser +} + +// Days before expiration date to send reminders +define("OFFSET", 2); +$today = date("Y-m-d"); +$expirationDate = date("Y-m-d", strtotime($today." + ".OFFSET." day")); + +$query = "SELECT DISTINCT category.session_id, certificate.user_id FROM ". + Database::get_main_table(TABLE_MAIN_GRADEBOOK_CATEGORY)." AS category + LEFT JOIN ".Database::get_main_table(TABLE_MAIN_GRADEBOOK_CERTIFICATE). + " AS certificate ON category.id = certificate.cat_id + INNER JOIN ".Database::get_main_table(TABLE_MAIN_SESSION). + " AS session ON category.session_id = session.id + WHERE session.date_end BETWEEN '$today' AND '$expirationDate' AND category.session_id IS NOT NULL"; + +$sessionId = 0; +$userIds = array(); +$sessions = array(); +$result = Database::query($query); + +while ($row = Database::fetch_array($result)) { + if ($sessionId != $row['session_id']) { + $sessionId = $row['session_id']; + $userIds = array(); + } + if (!is_null($row['user_id'])) { + array_push($userIds, $row['user_id']); + } + $sessions[$sessionId] = $userIds; +} + +$usersToBeReminded = array(); + +foreach ($sessions as $sessionId => $userIds) { + $userId = 0; + $userIds = $userIds ? " AND id_user NOT IN (".implode(",", $userIds).")" : null; + $query = "SELECT sessionUser.id_session, sessionUser.id_user, session.name, session.date_end FROM ". + Database::get_main_table(TABLE_MAIN_SESSION_USER)." AS sessionUser + INNER JOIN ".Database::get_main_table(TABLE_MAIN_SESSION). + " AS session ON sessionUser.id_session = session.id + WHERE id_session = $sessionId$userIds"; + $result = Database::query($query); + while ($row = Database::fetch_array($result)) { + $usersToBeReminded[$row['id_user']][$row['id_session']] = + array( + 'name' => $row['name'], + 'date_end' => $row['date_end'] + ); + } +} + +if ($usersToBeReminded) { + global $_configuration; + $today = date_create($today); + $platformLanguage = api_get_setting("platformLanguage"); + $subject = sprintf( + get_lang("MailCronCourseExpirationReminderSubject", null, $platformLanguage), + api_get_setting("Institution") + ); + $administrator = array( + 'completeName' => api_get_person_name( + api_get_setting("administratorName"), + api_get_setting("administratorSurname"), + null, + PERSON_NAME_EMAIL_ADDRESS + ), + 'email' => api_get_setting("emailAdministrator") + ); + echo "\n======================================================================\n\n"; + foreach ($usersToBeReminded as $userId => $sessions) { + $user = api_get_user_info($userId); + $userCompleteName = api_get_person_name( + $user['firstname'], + $user['lastname'], + null, + PERSON_NAME_EMAIL_ADDRESS + ); + foreach ($sessions as $session) { + $daysRemaining = date_diff($today, date_create($session['date_end'])); + $body = sprintf( + get_lang('MailCronCourseExpirationReminderBody', null, $platformLanguage), + $userCompleteName, + $session['name'], + $session['date_end'], + $daysRemaining->format("%d"), + $_configuration['root_web'], + api_get_setting("siteName") + ); + api_mail_html( + $userCompleteName, + $user['email'], + $subject, + $body, + $administrator['completeName'], + $administrator['email'] + ); + echo "Email sent to $userCompleteName (".$user['email'].")\n"; + echo "Session: ".$session['name']."\n"; + echo "Date end: ".$session['date_end']."\n"; + echo "Days remaining: ".$daysRemaining->format("%d")."\n\n"; + } + echo "======================================================================\n\n"; + } +} else { + echo "No users to be reminded\n"; +} \ No newline at end of file From e75de5ee93b19752de2a897154c3434e5c9d6456 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Thu, 5 Mar 2015 00:13:13 -0500 Subject: [PATCH 02/25] Script to move users from course to session with all resources - refs BT#9436 --- tests/scripts/course2session.php | 102 +++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tests/scripts/course2session.php diff --git a/tests/scripts/course2session.php b/tests/scripts/course2session.php new file mode 100644 index 0000000000..2936ddc304 --- /dev/null +++ b/tests/scripts/course2session.php @@ -0,0 +1,102 @@ + array('c' => 'c_id', 's' => 'session_id'), + 'c_attendance' => array('c' => 'c_id', 's' => 'session_id'), + 'c_blog' => array('c' => 'c_id', 's' => 'session_id'), + 'c_calendar_event' => array('c' => 'c_id', 's' => 'session_id'), + 'c_chat_connected' => array('c' => 'c_id', 's' => 'session_id'), + 'c_course_description' => array('c' => 'c_id', 's' => 'session_id'), + 'c_document' => array('c' => 'c_id', 's' => 'session_id'), + 'c_dropbox_category' => array('c' => 'c_id', 's' => 'session_id'), + 'c_dropbox_file' => array('c' => 'c_id', 's' => 'session_id'), + 'c_dropbox_post' => array('c' => 'c_id', 's' => 'session_id'), + 'c_forum_category' => array('c' => 'c_id', 's' => 'session_id'), + 'c_forum_forum' => array('c' => 'c_id', 's' => 'session_id'), + 'c_forum_thread' => array('c' => 'c_id', 's' => 'session_id'), + 'c_forum_thread_qualify' => array('c' => 'c_id', 's' => 'session_id'), + 'c_forum_thread_qualify_log' => array('c' => 'c_id', 's' => 'session_id'), + 'c_glossary' => array('c' => 'c_id', 's' => 'session_id'), + 'c_group_info' => array('c' => 'c_id', 's' => 'session_id'), + 'c_item_property' => array('c' => 'c_id', 's' => 'id_session'), + 'c_link' => array('c' => 'c_id', 's' => 'session_id'), + 'c_link_category' => array('c' => 'c_id', 's' => 'session_id'), + 'c_lp' => array('c' => 'c_id', 's' => 'session_id'), + 'c_lp_view' => array('c' => 'c_id', 's' => 'session_id'), + 'c_notebook' => array('c' => 'c_id', 's' => 'session_id'), + 'c_quiz' => array('c' => 'c_id', 's' => 'session_id'), + 'c_student_publication' => array('c' => 'c_id', 's' => 'session_id'), + 'c_survey' => array('c' => 'c_id', 's' => 'session_id'), + 'c_survey_invitation' => array('c' => 'c_id', 's' => 'session_id'), + 'c_thematic' => array('c' => 'c_id', 's' => 'session_id'), + 'c_tool' => array('c' => 'c_id', 's' => 'session_id'), + 'c_tool_intro' => array('c' => 'c_id', 's' => 'session_id'), + 'c_wiki' => array('c' => 'c_id', 's' => 'session_id'), + 'c_wiki_mailcue' => array('c' => 'c_id', 's' => 'session_id'), + 'gradebook_category' => array('c' => 'course_code', 's' => 'session_id'), + //'session_rel_course', + //'session_rel_course_rel_user', + //'session_rel_user', + 'track_course_ranking' => array('c' => 'c_id', 's' => 'session_id'), + 'track_e_access' => array('access_cours_code' => 'c_id', 's' => 'access_session_id'), + 'track_e_attempt' => array('c' => 'course_code', 's' => 'session_id'), + 'track_e_course_access' => array('c' => 'course_code', 's' => 'session_id'), + 'track_e_downloads' => array('c' => 'down_cours_id', 's' => 'down_session_id'), + 'track_e_exercices' => array('c' => 'exe_cours_id', 's' => 'session_id'), + 'track_e_item_property' => array('c' => 'course_id', 's' => 'session_id'), + 'track_e_lastaccess' => array('c' => 'access_cours_code', 's' => 'access_session_id'), + 'track_e_links' => array('c' => 'links_cours_id', 's' => 'links_session_id'), + 'track_e_online' => array('c' => 'course', 's' => 'session_id'), + 'track_e_uploads' => array('c' => 'upload_cours_id', 's' => 'upload_session_id'), + 'user_rel_course_vote' => array('c' => 'c_id', 's' => 'session_id'), +); + +/** + * Create the sessions + * For each existing course, create a session that ends on the last day of the + * past month and starts 2 years before that. + */ +$year = date('Y'); +$month = date('m'); +$end = api_strtotime($year.'-'.$month.'-01 00:00:00') - 1; +$start = $end - (2*365*86400); + +$res = Database::select('id, title, code', TABLE_MAIN_COURSE); +foreach ($res as $course) { + echo $course['title'] . PHP_EOL; + $sessionTitle = $course['title'] . $month . '-' . $year; + $id = SessionManager::create_session($sessionTitle, $year, $month, 0, $year, $month, 28, 0, 0, 0, 'info@contidosdixitais.com', 0, SESSION_VISIBLE_READ_ONLY); + if ($id === false) { + echo "Could not create session $sessionTitle" . PHP_EOL; + } + SessionManager::add_courses_to_session($id, array($course['code'])); + $resultUsers = Database::select('user_id', TABLE_MAIN_COURSE_USER, array('where course_code = ?' => array($course['code']))); + $users = array(); + foreach ($resultUsers as $user_id) { + $users[] = $user_id; + } + SessionManager::subscribe_users_to_session_course($users, $id, $course['code']); + foreach ($tables as $table => $fields) { + //c_id + course_id = int, others = char + if ($fields['c'] == 'c_id' or $fields['c'] == 'course_id') { + $sql = "UPDATE $table SET " . $fields['s'] . " = $id WHERE " . $fields['c'] . " = " . $course['id']; + } else { + $sql = "UPDATE $table SET " . $fields['s'] . " = $id WHERE " . $fields['c'] . " = " . $course['code']; + } + $resultChange = Database::query($sql); + } + // Now clean up by unsubscribing the user from the course itself manually + // to avoid deleting other stuff + foreach ($users as $user) { + $sql = "DELETE FROM course_rel_user WHERE user_id = $user AND course_code = " . $course['code']; + $resultRemove = Database::query($sql); + } +} \ No newline at end of file From 1f3bdb4b430599f68d93e21a210ccd63981e9dae Mon Sep 17 00:00:00 2001 From: Imanol Losada Date: Thu, 5 Mar 2015 14:57:23 -0500 Subject: [PATCH 03/25] Add multiurl support - refs BT#9444 --- main/cron/remind_course_expiration.php | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/main/cron/remind_course_expiration.php b/main/cron/remind_course_expiration.php index d78a20c2f8..5903b40770 100644 --- a/main/cron/remind_course_expiration.php +++ b/main/cron/remind_course_expiration.php @@ -15,9 +15,9 @@ if (php_sapi_name() != 'cli') { } // Days before expiration date to send reminders -define("OFFSET", 2); -$today = date("Y-m-d"); -$expirationDate = date("Y-m-d", strtotime($today." + ".OFFSET." day")); +define("OFFSET", 30); +$today = gmdate("Y-m-d"); +$expirationDate = gmdate("Y-m-d", strtotime($today." + ".OFFSET." day")); $query = "SELECT DISTINCT category.session_id, certificate.user_id FROM ". Database::get_main_table(TABLE_MAIN_GRADEBOOK_CATEGORY)." AS category @@ -64,7 +64,6 @@ foreach ($sessions as $sessionId => $userIds) { } if ($usersToBeReminded) { - global $_configuration; $today = date_create($today); $platformLanguage = api_get_setting("platformLanguage"); $subject = sprintf( @@ -89,15 +88,28 @@ if ($usersToBeReminded) { null, PERSON_NAME_EMAIL_ADDRESS ); - foreach ($sessions as $session) { + foreach ($sessions as $sessionId => $session) { $daysRemaining = date_diff($today, date_create($session['date_end'])); + $join = " INNER JOIN ".Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION)."ON id = access_url_id"; + $result = Database::select( + 'url', + Database::get_main_table(TABLE_MAIN_ACCESS_URL).$join, + array( + 'where' => array( + 'session_id = ?' => array( + $sessionId + ) + ), + 'limit' => '1' + ) + ); $body = sprintf( get_lang('MailCronCourseExpirationReminderBody', null, $platformLanguage), $userCompleteName, $session['name'], $session['date_end'], $daysRemaining->format("%d"), - $_configuration['root_web'], + $result[0]['url'], api_get_setting("siteName") ); api_mail_html( @@ -117,4 +129,4 @@ if ($usersToBeReminded) { } } else { echo "No users to be reminded\n"; -} \ No newline at end of file +} From c9e5aeeb6be9b7290da4c5341a43f6db87e39bb4 Mon Sep 17 00:00:00 2001 From: Imanol Losada Date: Thu, 5 Mar 2015 15:03:09 -0500 Subject: [PATCH 04/25] Modify OFFSET to 2 - refs BT#9444 --- main/cron/remind_course_expiration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/cron/remind_course_expiration.php b/main/cron/remind_course_expiration.php index 5903b40770..ad7851de46 100644 --- a/main/cron/remind_course_expiration.php +++ b/main/cron/remind_course_expiration.php @@ -15,7 +15,7 @@ if (php_sapi_name() != 'cli') { } // Days before expiration date to send reminders -define("OFFSET", 30); +define("OFFSET", 2); $today = gmdate("Y-m-d"); $expirationDate = gmdate("Y-m-d", strtotime($today." + ".OFFSET." day")); From b2953724a42239a9494d4c0ee27888b72175a2c3 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 6 Mar 2015 08:44:54 +0100 Subject: [PATCH 05/25] Blocking glossary in LP if not allowed see BT#9420 --- main/newscorm/lp_controller.php | 26 ++++++++++++++++---------- main/newscorm/scorm_api.php | 20 +++++++++++++------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/main/newscorm/lp_controller.php b/main/newscorm/lp_controller.php index 3c7f836610..e4fe357000 100755 --- a/main/newscorm/lp_controller.php +++ b/main/newscorm/lp_controller.php @@ -34,16 +34,22 @@ $language_file[] = 'exercice'; // Including the global initialization file. require_once '../inc/global.inc.php'; $current_course_tool = TOOL_LEARNPATH; -if (api_get_setting('show_glossary_in_documents') == 'ismanual' || - api_get_setting('show_glossary_in_documents') == 'isautomatic' -) { - $htmlHeadXtra[] = ''; - $htmlHeadXtra[] = ''; - $htmlHeadXtra[] = ''; + +$glossaryExtraTools = api_get_setting('show_glossary_in_extra_tools'); +$showGlossary = in_array($glossaryExtraTools, array('true', 'lp', 'exercise_and_lp')); + +if ($showGlossary) { + if (api_get_setting('show_glossary_in_documents') == 'ismanual' || + api_get_setting('show_glossary_in_documents') == 'isautomatic' + ) { + $htmlHeadXtra[] = ''; + $htmlHeadXtra[] = ''; + $htmlHeadXtra[] = ''; + } } $htmlHeadXtra[] = '