From 8561a8acb3fb2d88ea003c0385a27f7f0dfc33bd Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 18:01:19 -0500 Subject: [PATCH 01/10] Minor - add documentation and error condition to session duration-related functions - refs #8317 --- main/inc/lib/course.lib.php | 3 ++- main/inc/lib/sessionmanager.lib.php | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/main/inc/lib/course.lib.php b/main/inc/lib/course.lib.php index c344ae536d..a90cb1183e 100755 --- a/main/inc/lib/course.lib.php +++ b/main/inc/lib/course.lib.php @@ -4695,7 +4695,8 @@ class CourseManager } /** - * Get information from the track_e_course_access table + * Get login information from the track_e_course_access table, for any + * course in the given session * @param int $sessionId * @param int $userId * @return array diff --git a/main/inc/lib/sessionmanager.lib.php b/main/inc/lib/sessionmanager.lib.php index 3d75d9dfee..9e7e077324 100755 --- a/main/inc/lib/sessionmanager.lib.php +++ b/main/inc/lib/sessionmanager.lib.php @@ -4684,6 +4684,8 @@ class SessionManager } /** + * Returns the number of days the student has left in a session when using + * sessions durations * @param int $userId * @param int $sessionId * @param int $duration in days @@ -4691,6 +4693,8 @@ class SessionManager */ public static function getDayLeftInSession($sessionId, $userId, $duration) { + // Get an array with the details of the first access of the student to + // this session $courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser( $sessionId, $userId @@ -4698,6 +4702,11 @@ class SessionManager $currentTime = time(); + // If no previous access, return false + if (count($courseAccess) == 0) { + return false; + } + $firstAccess = api_strtotime($courseAccess['login_course_date'], 'UTC'); $endDateInSeconds = $firstAccess + $duration*24*60*60; @@ -4728,10 +4737,10 @@ class SessionManager } /** - * @param int $userId - * @param int $sessionId - * - * @param return array + * Gets one row from the session_rel_user table + * @param int The user ID + * @param int The session ID + * @return array */ public static function getUserSession($userId, $sessionId) { From 53159dafc48278c9ca22602044357b1aa2a4935a Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 18:01:58 -0500 Subject: [PATCH 02/10] Add better messaging and a few error cases to sessions duration by user edition screen - refs #8317 --- main/admin/session_user_edit.php | 36 ++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/main/admin/session_user_edit.php b/main/admin/session_user_edit.php index 598ae822d3..d9a97696a1 100644 --- a/main/admin/session_user_edit.php +++ b/main/admin/session_user_edit.php @@ -37,16 +37,48 @@ $interbreadcrumb[] = array('url' => "resume_session.php?id_session=".$sessionId, $form = new FormValidator('edit', 'post', api_get_self().'?session_id='.$sessionId.'&user_id='.$userId); $form->add_header(get_lang('EditUserSessionDuration')); +$sessionInfo = SessionManager::fetch($sessionId); $data = SessionManager::getUserSession($userId, $sessionId); +// Show current end date for the session for this user, if any +$userAccess = CourseManager::getFirstCourseAccessPerSessionAndUser( + $sessionId, + $userId +); +if (count($userAccess) == 0) { + // User never accessed the session. End date is still open + $msg = sprintf(get_lang('UserNeverAccessedSessionDefaultDurationIsX'), $sessionInfo['duration']); +} else { + // The user already accessed the session. Show a clear detail of the days count. + $duration = $sessionInfo['duration']; + if (!empty($data['duration'])) { + $duration = $data['duration']; + } + $days = SessionManager::getDayLeftInSession($sessionId, $userId, $duration); + $firstAccess = api_strtotime($userAccess['login_course_date'], 'UTC'); + if ($days > 0) { + $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateInZ'), $firstAccess, $duration, $days); + } else { + $endDateInSeconds = $firstAccess + $duration*24*60*60; + $last = api_get_local_time($endDateInSeconds); + $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateWasZ'), $firstAccess, $duration, $last); + } +} +$form->addElement('html', $msg); + $form->addElement('text', 'duration', array(get_lang('Duration'), null, get_lang('Days'))); $form->addElement('button', 'submit', get_lang('Send')); $form->setDefaults($data); $message = null; if ($form->validate()) { $duration = $form->getSubmitValue('duration'); - SessionManager::editUserSessionDuration($duration, $userId, $sessionId); - $message = Display::return_message(get_lang('ItemUpdated'), 'confirmation'); + // Only update if the duration is different from the default duration + if ($duration != $sessionInfo['duration']) { + SessionManager::editUserSessionDuration($duration, $userId, $sessionId); + $message = Display::return_message(get_lang('ItemUpdated'), 'confirmation'); + } else { + $message = Display::return_message(get_lang('DurationIsSameAsDefault'), 'warning'); + } } // display the header From 7e8308b0a47037cedde026703056dca728e32175 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 18:12:55 -0500 Subject: [PATCH 03/10] Add better messaging (show user and session names) to sessions duration by user edition screen - refs #8317 --- main/admin/session_user_edit.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main/admin/session_user_edit.php b/main/admin/session_user_edit.php index d9a97696a1..984382f11d 100644 --- a/main/admin/session_user_edit.php +++ b/main/admin/session_user_edit.php @@ -37,8 +37,8 @@ $interbreadcrumb[] = array('url' => "resume_session.php?id_session=".$sessionId, $form = new FormValidator('edit', 'post', api_get_self().'?session_id='.$sessionId.'&user_id='.$userId); $form->add_header(get_lang('EditUserSessionDuration')); -$sessionInfo = SessionManager::fetch($sessionId); $data = SessionManager::getUserSession($userId, $sessionId); +$userInfo = api_get_user_info($userId); // Show current end date for the session for this user, if any $userAccess = CourseManager::getFirstCourseAccessPerSessionAndUser( @@ -64,6 +64,8 @@ if (count($userAccess) == 0) { $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateWasZ'), $firstAccess, $duration, $last); } } +$form->addElement('html', sprintf(get_lang('UserXSessionY'), $userInfo['complete_name'], $sessionInfo['name'])); +$form->addElement('html', '
'); $form->addElement('html', $msg); $form->addElement('text', 'duration', array(get_lang('Duration'), null, get_lang('Days'))); From b78c707420ddc9eb40ef00aafe12a77fde711be3 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 18:15:13 -0500 Subject: [PATCH 04/10] Set session duration as default in sessions duration by user edition screen - refs #8317 --- main/admin/session_user_edit.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/main/admin/session_user_edit.php b/main/admin/session_user_edit.php index 984382f11d..83e164c925 100644 --- a/main/admin/session_user_edit.php +++ b/main/admin/session_user_edit.php @@ -70,6 +70,10 @@ $form->addElement('html', $msg); $form->addElement('text', 'duration', array(get_lang('Duration'), null, get_lang('Days'))); $form->addElement('button', 'submit', get_lang('Send')); + +if (empty($data['duration'])) { + $data['duration'] = $sessionInfo['duration']; +} $form->setDefaults($data); $message = null; if ($form->validate()) { From 325c14fcb7873c6d42e75a4e55cc4531ef9ce17a Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 18:25:49 -0500 Subject: [PATCH 05/10] Fix condition whereby a user that never accessed a session with duration to which he is subscribed could not see it in courses list - refs #8317 --- main/inc/lib/main_api.lib.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/main/inc/lib/main_api.lib.php b/main/inc/lib/main_api.lib.php index 00b3f17c3b..1acda60d8f 100755 --- a/main/inc/lib/main_api.lib.php +++ b/main/inc/lib/main_api.lib.php @@ -2024,6 +2024,11 @@ function api_get_session_visibility($session_id, $course_code = null, $ignore_vi $session_id, api_get_user_id() ); + // If there is a session duration but there is no previous + // access by the user, then the session is still available + if (count($courseAccess) == 0) { + return SESSION_AVAILABLE; + } $currentTime = time(); $firstAccess = api_strtotime($courseAccess['login_course_date'], 'UTC'); $userDurationData = SessionManager::getUserSession( From 6adb396dcf6a73aab833eac2fd963d52ea7da6a5 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 18:36:56 -0500 Subject: [PATCH 06/10] Fix issue with cumulative session access days by user (was counting absolute value instead of sum) - refs #8317 --- main/admin/session_user_edit.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main/admin/session_user_edit.php b/main/admin/session_user_edit.php index 83e164c925..193ca3b5e0 100644 --- a/main/admin/session_user_edit.php +++ b/main/admin/session_user_edit.php @@ -52,7 +52,7 @@ if (count($userAccess) == 0) { // The user already accessed the session. Show a clear detail of the days count. $duration = $sessionInfo['duration']; if (!empty($data['duration'])) { - $duration = $data['duration']; + $duration = $duration + $data['duration']; } $days = SessionManager::getDayLeftInSession($sessionId, $userId, $duration); $firstAccess = api_strtotime($userAccess['login_course_date'], 'UTC'); @@ -68,18 +68,18 @@ $form->addElement('html', sprintf(get_lang('UserXSessionY'), $userInfo['complete $form->addElement('html', '
'); $form->addElement('html', $msg); -$form->addElement('text', 'duration', array(get_lang('Duration'), null, get_lang('Days'))); +$form->addElement('text', 'duration', array(get_lang('ExtraDuration'), null, get_lang('Days'))); $form->addElement('button', 'submit', get_lang('Send')); if (empty($data['duration'])) { - $data['duration'] = $sessionInfo['duration']; + $data['duration'] = 0; } $form->setDefaults($data); $message = null; if ($form->validate()) { $duration = $form->getSubmitValue('duration'); // Only update if the duration is different from the default duration - if ($duration != $sessionInfo['duration']) { + if ($duration != 0) { SessionManager::editUserSessionDuration($duration, $userId, $sessionId); $message = Display::return_message(get_lang('ItemUpdated'), 'confirmation'); } else { From 1e0c8e36f30b7c0f503584e3e2329522e8b37b38 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 18:42:15 -0500 Subject: [PATCH 07/10] Minor display fixes to session duration edition form - refs #8317 --- main/admin/session_user_edit.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main/admin/session_user_edit.php b/main/admin/session_user_edit.php index 193ca3b5e0..fcfc048121 100644 --- a/main/admin/session_user_edit.php +++ b/main/admin/session_user_edit.php @@ -57,10 +57,10 @@ if (count($userAccess) == 0) { $days = SessionManager::getDayLeftInSession($sessionId, $userId, $duration); $firstAccess = api_strtotime($userAccess['login_course_date'], 'UTC'); if ($days > 0) { - $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateInZ'), $firstAccess, $duration, $days); + $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateInZDays'), $firstAccess, $duration, $days); } else { $endDateInSeconds = $firstAccess + $duration*24*60*60; - $last = api_get_local_time($endDateInSeconds); + $last = api_convert_and_format_date($endDateInSeconds, DATE_FORMAT_SHORT); $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateWasZ'), $firstAccess, $duration, $last); } } @@ -68,7 +68,7 @@ $form->addElement('html', sprintf(get_lang('UserXSessionY'), $userInfo['complete $form->addElement('html', '
'); $form->addElement('html', $msg); -$form->addElement('text', 'duration', array(get_lang('ExtraDuration'), null, get_lang('Days'))); +$form->addElement('text', 'duration', array(get_lang('ExtraDurationForUser'), null, get_lang('Days'))); $form->addElement('button', 'submit', get_lang('Send')); if (empty($data['duration'])) { From 2e87d0bdae1cc33590953082d200f6ea654fd1c2 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 18:55:06 -0500 Subject: [PATCH 08/10] Minor display fixes to session duration edition form (again) - refs #8317 --- main/admin/session_user_edit.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main/admin/session_user_edit.php b/main/admin/session_user_edit.php index fcfc048121..a1adcf50d0 100644 --- a/main/admin/session_user_edit.php +++ b/main/admin/session_user_edit.php @@ -56,12 +56,13 @@ if (count($userAccess) == 0) { } $days = SessionManager::getDayLeftInSession($sessionId, $userId, $duration); $firstAccess = api_strtotime($userAccess['login_course_date'], 'UTC'); + $firstAccessString = api_convert_and_format_date($userAccess['login_course_date'], DATE_FORMAT_SHORT, 'UTC'); if ($days > 0) { - $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateInZDays'), $firstAccess, $duration, $days); + $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateInZDays'), $firstAccessString, $duration, $days); } else { $endDateInSeconds = $firstAccess + $duration*24*60*60; $last = api_convert_and_format_date($endDateInSeconds, DATE_FORMAT_SHORT); - $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateWasZ'), $firstAccess, $duration, $last); + $msg = sprintf(get_lang('FirstAccessWasXSessionDurationYEndDateWasZ'), $firstAccessString, $duration, $last); } } $form->addElement('html', sprintf(get_lang('UserXSessionY'), $userInfo['complete_name'], $sessionInfo['name'])); From 75cd218c8ebb4a6d1cc4565b91c40cd868ac20a8 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 29 Jul 2014 19:02:28 -0500 Subject: [PATCH 09/10] Improve UI that leads to session duration edition form - refs #8317 --- main/admin/resume_session.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/admin/resume_session.php b/main/admin/resume_session.php index f8d91add8b..7d97f07711 100755 --- a/main/admin/resume_session.php +++ b/main/admin/resume_session.php @@ -459,7 +459,7 @@ if ($session['nbr_users']==0) { if (isset($sessionInfo['duration']) && !empty($sessionInfo['duration'])) { $editUrl = api_get_path(WEB_CODE_PATH) . 'admin/session_user_edit.php?session_id=' . $id_session . '&user_id=' . $user['user_id']; $editUrl = Display::url( - Display::return_icon('edit.png', get_lang('Edit')), + Display::return_icon('agenda.png', get_lang('SessionDurationEdit')), $editUrl ); } From 1973d6fda8ca2846eeca444e78819ea3139fa7c5 Mon Sep 17 00:00:00 2001 From: Anibal Copitan Date: Tue, 29 Jul 2014 19:21:29 -0500 Subject: [PATCH 10/10] Add details to reporting screen - refs BT#8397 --- main/tracking/courseLog.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main/tracking/courseLog.php b/main/tracking/courseLog.php index 1a428e202d..ff745f400b 100755 --- a/main/tracking/courseLog.php +++ b/main/tracking/courseLog.php @@ -379,14 +379,14 @@ if (count($a_students) > 0) { $table->set_header(3, get_lang('Login'), false); $tab_table_header[] = get_lang('Login'); - $table->set_header(4, get_lang('TrainingTime'), false); + $table->set_header(4, get_lang('TrainingTime').' '.Display::return_icon('info3.gif', get_lang('TrainingTimeInfo'), array('align' => 'absmiddle', 'hspace' => '3px')), false, array('style' => 'width:110px;')); $tab_table_header[] = get_lang('TrainingTime'); $table->set_header(5, get_lang('CourseProgress').' '.Display::return_icon('info3.gif', get_lang('ScormAndLPProgressTotalAverage'), array('align' => 'absmiddle', 'hspace' => '3px')), false, array('style' => 'width:110px;')); $tab_table_header[] = get_lang('CourseProgress'); - $table->set_header(6, get_lang('ExerciseProgress'), false); + $table->set_header(6, get_lang('ExerciseProgress').' '.Display::return_icon('info3.gif', get_lang('ExerciseProgressInfo'), array('align' => 'absmiddle', 'hspace' => '3px')), false, array('style' => 'width:110px;')); $tab_table_header[] = get_lang('ExerciseProgress'); - $table->set_header(7, get_lang('ExerciseAverage'), false); + $table->set_header(7, get_lang('ExerciseAverage').' '.Display::return_icon('info3.gif', get_lang('ExerciseAverageInfo'), array('align' => 'absmiddle', 'hspace' => '3px')), false, array('style' => 'width:110px;')); $tab_table_header[] = get_lang('ExerciseAverage'); $table->set_header(8, get_lang('Score').' '.Display::return_icon('info3.gif', get_lang('ScormAndLPTestTotalAverage'), array('align' => 'absmiddle', 'hspace' => '3px')), false, array('style' => 'width:110px;')); $tab_table_header[] = get_lang('Score');