Browse Source

Adding user session duration see BT#8317

Julio Montoya 10 years ago
parent
commit
c0e4ee509b

+ 33 - 6
main/admin/resume_session.php

@@ -230,11 +230,23 @@ if ($multiple_url_is_on) {
     echo '</td>';
     echo '<td>';
     $url_list = UrlManager::get_access_url_from_session($id_session);
-    foreach($url_list as $url_data) {
+    foreach ($url_list as $url_data) {
         echo $url_data['url'].'<br />';
     }
     echo '</td></tr>';
 }
+
+if (SessionManager::durationPerUserIsEnabled()) {
+    $sessionInfo = api_get_session_info($id_session);
+    echo '<tr><td>';
+    echo get_lang('Duration');
+    echo '</td>';
+    echo '<td>';
+    echo $sessionInfo['duration'].' ';
+    echo get_lang('Days');
+    echo '</td></tr>';
+
+}
 ?>
 </table>
 <br />
@@ -387,11 +399,8 @@ $url .= Display::url(
     "session_user_import.php?id_session=$id_session"
 );
 echo Display::page_subheader(get_lang('UserList').$url);
-
 ?>
-
 <!--List of users -->
-
 <table class="data_table">
     <tr>
         <th>
@@ -444,15 +453,28 @@ if ($session['nbr_users']==0) {
                 $link_to_add_user_in_url = '<a href="resume_session.php?action=add_user_to_url&id_session='.$id_session.'&user_id='.$user['user_id'].'">'.$add.'</a>';
             }
         }
+
+        $editUrl = null;
+        if (SessionManager::durationPerUserIsEnabled()) {
+            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')),
+                    $editUrl
+                );
+            }
+        }
 		echo '<tr>
-                <td width="90%">
+                <td width="80%">
                     '.$user_link.'
                 </td>
                 <td>
+                    '.$editUrl.'
                     <a href="../mySpace/myStudents.php?student='.$user['user_id'].''.$orig_param.'">'.Display::return_icon('statistics.gif', get_lang('Reporting')).'</a>&nbsp;
                     <a href="session_course_user.php?id_user='.$user['user_id'].'&id_session='.$id_session.'">'.Display::return_icon('course.gif', get_lang('BlockCoursesForThisUser')).'</a>&nbsp;
                     <a href="'.api_get_self().'?id_session='.$id_session.'&action=delete&user='.$user['user_id'].'" onclick="javascript:if(!confirm(\''.get_lang('ConfirmYourChoice').'\')) return false;">'.Display::return_icon('delete.png', get_lang('Delete')).'</a>
                     '.$link_to_add_user_in_url.'
+
                 </td>
                 </tr>';
 	}
@@ -460,11 +482,16 @@ if ($session['nbr_users']==0) {
 ?>
 </table>
 <?php
-// footer
+
 Display :: display_footer();
 
 /*
  ALTER TABLE session_rel_course ADD COLUMN position int;
  ALTER TABLE session_rel_course ADD COLUMN category varchar(255);
+
+ https://task.beeznest.com/issues/8317:
+
+ ALTER TABLE session ADD COLUMN duration int;
+ ALTER TABLE session_rel_user ADD COLUMN duration int;
  *
 */

+ 58 - 0
main/admin/session_user_edit.php

@@ -0,0 +1,58 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+$language_file = 'admin';
+$cidReset = true;
+
+// including the global Chamilo file
+require_once '../inc/global.inc.php';
+
+api_protect_admin_script(true);
+
+$sessionId = isset($_GET['session_id']) ? $_GET['session_id'] : null;
+$userId = isset($_GET['user_id']) ? $_GET['user_id'] : null;
+
+SessionManager::protect_session_edit($sessionId);
+
+$sessionInfo = api_get_session_info($sessionId);
+if (empty($sessionInfo)) {
+    api_not_allowed(true);
+}
+
+if (!isset($sessionInfo['duration']) ||
+    isset($sessionInfo['duration']) && empty($sessionInfo['duration'])) {
+    api_not_allowed(true);
+}
+
+if (!SessionManager::durationPerUserIsEnabled()) {
+    api_not_allowed(true);
+}
+if (empty($sessionId) || empty($userId)) {
+    api_not_allowed(true);
+}
+
+$interbreadcrumb[] = array('url' => 'index.php', 'name' => get_lang('PlatformAdmin'));
+$interbreadcrumb[] = array('url' => 'session_list.php','name' => get_lang('SessionList'));
+$interbreadcrumb[] = array('url' => "resume_session.php?id_session=".$sessionId, "name" => get_lang('SessionOverview'));
+
+$form = new FormValidator('edit', 'post', api_get_self().'?session_id='.$sessionId.'&user_id='.$userId);
+$form->add_header(get_lang('EditUserSessionDuration'));
+$data = SessionManager::getUserSession($userId, $sessionId);
+
+$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');
+}
+
+// display the header
+Display::display_header(get_lang('Edit'));
+
+echo $message;
+$form->display();
+
+Display :: display_footer();

+ 12 - 1
main/inc/lib/display.lib.php

@@ -1389,7 +1389,18 @@ class Display
                     $session['coach'] = get_lang('GeneralCoach').': '.api_get_person_name($session_info['firstname'], $session_info['lastname']);
                 }
                 if (isset($session_info['duration']) && !empty($session_info['duration'])) {
-                    $daysLeft = SessionManager::getDayLeftInSession($session_id, api_get_user_id(), $session_info['duration']);
+
+                    $userDurationData = SessionManager::getUserSession(
+                            api_get_user_id(),
+                            $session_id
+                    );
+                    $totalDuration = $session_info['duration'] + intval($userDurationData['duration']);
+
+                    $daysLeft = SessionManager::getDayLeftInSession(
+                        $session_id,
+                        api_get_user_id(),
+                        $totalDuration
+                    );
                     $session['duration'] = sprintf(get_lang('SessionDurationXDaysLeft'), $daysLeft);
                 }
                 $active = true;

+ 8 - 1
main/inc/lib/main_api.lib.php

@@ -2026,7 +2026,14 @@ function api_get_session_visibility($session_id, $course_code = null, $ignore_vi
                         );
                         $currentTime = time();
                         $firstAccess = api_strtotime($courseAccess['login_course_date'], 'UTC');
-                        if (($firstAccess + $duration) > $currentTime) {
+                        $userDurationData = SessionManager::getUserSession(
+                            api_get_user_id(),
+                            $session_id
+                        );
+                        $userDuration = intval($userDurationData['duration'])*24*60*60;
+
+                        $totalDuration = $firstAccess + $duration + $userDuration;
+                        if ($totalDuration > $currentTime) {
                             return SESSION_AVAILABLE;
                         } else {
                             return SESSION_INVISIBLE;

+ 54 - 6
main/inc/lib/sessionmanager.lib.php

@@ -4666,7 +4666,9 @@ class SessionManager
 
     /**
      * Use the session duration to allow/block user access see BT#8317
-     * Needs "ALTER TABLE session ADD COLUMN duration int;"
+     * Needs these DB changes
+     * ALTER TABLE session ADD COLUMN duration int;
+     * ALTER TABLE session_rel_user ADD COLUMN duration int;
      */
     public static function durationPerUserIsEnabled()
     {
@@ -4683,24 +4685,70 @@ class SessionManager
     /**
      * @param int $userId
      * @param int $sessionId
+     * @param int $duration in days
      * @return int
      */
-    public function getDayLeftInSession($sessionId, $userId, $duration)
+    public static function getDayLeftInSession($sessionId, $userId, $duration)
     {
         $courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser(
             $sessionId,
             $userId
         );
+
         $currentTime = time();
 
         $firstAccess = api_strtotime($courseAccess['login_course_date'], 'UTC');
-        //var_dump(api_get_utc_datetime($firstAccess));
-        //var_dump($duration);
+
         $endDateInSeconds = $firstAccess + $duration*24*60*60;
         $leftDays = round(($endDateInSeconds- $currentTime) / 60 / 60 / 24);
-        /*var_dump(api_get_utc_datetime($endDateInSeconds));
-        var_dump(api_get_utc_datetime($currentTime));*/
+
         return $leftDays;
+    }
+
+    /**
+     * @param int $duration
+     * @param int $userId
+     * @param int $sessionId
+     */
+    public static function editUserSessionDuration($duration, $userId, $sessionId)
+    {
+        $duration = intval($duration);
+        $userId = intval($userId);
+        $sessionId = intval($sessionId);
+
+        if (empty($userId) || empty($sessionId)) {
+            return false;
+        }
+
+        $table = Database::get_main_table(TABLE_MAIN_SESSION_USER);
+        $parameters = array('duration' => $duration);
+        $where = array('id_session = ? AND id_user = ? ' => array($sessionId, $userId));
+        Database::update($table, $parameters, $where);
+    }
+
+    /**
+     * @param int $userId
+     * @param int $sessionId
+     *
+     * @param return array
+     */
+    public static function getUserSession($userId, $sessionId)
+    {
+        $userId = intval($userId);
+        $sessionId = intval($sessionId);
+
+        if (empty($userId) || empty($sessionId)) {
+            return false;
+        }
+
+        $table = Database::get_main_table(TABLE_MAIN_SESSION_USER);
+        $sql = "SELECT * FROM $table WHERE id_session =$sessionId AND id_user = $userId";
+        $result = Database::query($sql);
+        $values = array();
+        if (Database::num_rows($result)) {
+            $values = Database::fetch_array($result, 'ASSOC');
+        }
 
+        return $values;
     }
 }