Adding session duration feature see BT#8317

1.9.x
Julio Montoya 11 years ago
parent 019987dacf
commit eadeaf890c
  1. 80
      main/admin/session_add.php
  2. 42
      main/admin/session_edit.php
  3. 43
      main/inc/lib/course.lib.php
  4. 4
      main/inc/lib/display.lib.php
  5. 60
      main/inc/lib/main_api.lib.php
  6. 139
      main/inc/lib/sessionmanager.lib.php
  7. 4
      main/inc/lib/userportal.lib.php

@ -97,29 +97,46 @@ function fill_coach_field (username) {
if ($_POST['formSent']) {
$formSent = 1;
$name = $_POST['name'];
$year_start = $_POST['year_start'];
$month_start = $_POST['month_start'];
$day_start = $_POST['day_start'];
$year_end = $_POST['year_end'];
$month_end = $_POST['month_end'];
$day_end = $_POST['day_end'];
$nb_days_acess_before = $_POST['nb_days_acess_before'];
$nb_days_acess_after = $_POST['nb_days_acess_after'];
//$nolimit = $_POST['nolimit'];
$coach_username = $_POST['coach_username'];
$id_session_category = $_POST['session_category'];
$id_visibility = $_POST['session_visibility'];
$end_limit = $_POST['end_limit'];
$start_limit = $_POST['start_limit'];
$name = $_POST['name'];
$year_start = $_POST['year_start'];
$month_start = $_POST['month_start'];
$day_start = $_POST['day_start'];
$year_end = $_POST['year_end'];
$month_end = $_POST['month_end'];
$day_end = $_POST['day_end'];
$nb_days_acess_before = $_POST['nb_days_acess_before'];
$nb_days_acess_after = $_POST['nb_days_acess_after'];
$coach_username = $_POST['coach_username'];
$id_session_category = $_POST['session_category'];
$id_visibility = $_POST['session_visibility'];
$end_limit = $_POST['end_limit'];
$start_limit = $_POST['start_limit'];
$duration = isset($_POST['duration']) ? $_POST['duration'] : null;
if (empty($end_limit) && empty($start_limit)) {
$nolimit = 1;
} else {
$nolimit = null;
}
$return = SessionManager::create_session($name,$year_start,$month_start,$day_start,$year_end,$month_end,$day_end,$nb_days_acess_before,$nb_days_acess_after,$nolimit,$coach_username, $id_session_category,$id_visibility, $start_limit, $end_limit);
$return = SessionManager::create_session(
$name,
$year_start,
$month_start,
$day_start,
$year_end,
$month_end,
$day_end,
$nb_days_acess_before,
$nb_days_acess_after,
$nolimit,
$coach_username,
$id_session_category,
$id_visibility,
$start_limit,
$end_limit,
$duration
);
if ($return == strval(intval($return))) {
// integer => no error on session creation
@ -394,6 +411,23 @@ for ($i=$thisYear-5;$i <= ($thisYear+5);$i++) {
</div>
</div>
<?php
if (SessionManager::durationPerUserIsEnabled()) {
?>
<div class="control-group">
<label class="control-label">
<?php echo get_lang('SessionDurationTitle') ?> <br />
</label>
<div class="controls">
<input id="duration" type="text" name="duration" class="span1" maxlength="50" value="">
<br />
<?php echo get_lang('SessionDurationDescription') ?>
</div>
</div>
<?php
}
?>
<div class="control-group">
<div class="controls">
@ -433,6 +467,8 @@ function disable_endtime(select) {
end_div.style.display = 'block';
else
end_div.style.display = 'none';
emptyDuration();
}
function disable_starttime(select) {
@ -441,7 +477,15 @@ function disable_starttime(select) {
start_div.style.display = 'block';
else
start_div.style.display = 'none';
emptyDuration();
}
function emptyDuration() {
if ($('#duration').val()) {
$('#duration').val('');
}
}
</script>
<?php
Display::display_footer();
Display::display_footer();

@ -60,7 +60,7 @@ if (isset($_POST['formSent']) && $_POST['formSent']) {
$id_coach = $_POST['id_coach'];
$id_session_category = $_POST['session_category'];
$id_visibility = $_POST['session_visibility'];
$duration = isset($_POST['duration']) ? $_POST['duration'] : null;
$description = isset($_POST['description']) ? $_POST['description'] : null;
$showDescription = isset($_POST['show_description']) ? 1 : 0;
@ -91,7 +91,8 @@ if (isset($_POST['formSent']) && $_POST['formSent']) {
$start_limit,
$end_limit,
$description,
$showDescription
$showDescription,
$duration
);
if ($return == strval(intval($return))) {
@ -376,6 +377,29 @@ if (!empty($return)) {
<?php } ?>
<?php
if (SessionManager::durationPerUserIsEnabled()) {
if (empty($infos['duration'])) {
$duration = null;
} else {
$duration = $infos['duration'];
}
?>
<div class="control-group">
<label class="control-label">
<?php echo get_lang('SessionDurationTitle') ?> <br />
</label>
<div class="controls">
<input id="duration" type="text" name="duration" class="span1" maxlength="50" value="<?php if($formSent) echo Security::remove_XSS($duration); else echo $duration; ?>">
<br />
<?php echo get_lang('SessionDurationDescription') ?>
</div>
</div>
<?php
}
?>
<div class="control-group">
<div class="controls">
<button class="save" type="submit" value="<?php echo get_lang('ModifyThisSession') ?>"><?php echo get_lang('ModifyThisSession') ?></button>
@ -386,9 +410,11 @@ if (!empty($return)) {
<script type="text/javascript">
<?php if($year_start=="0000") echo "setDisable(document.form.nolimit);\r\n"; ?>
<?php
//if($year_start=="0000") echo "setDisable(document.form.nolimit);\r\n";
?>
function setDisable(select){
function setDisable(select) {
document.form.day_start.disabled = (select.checked) ? true : false;
document.form.month_start.disabled = (select.checked) ? true : false;
@ -419,6 +445,7 @@ function disable_endtime(select) {
end_div.style.display = 'block';
else
end_div.style.display = 'none';
emptyDuration();
}
function disable_starttime(select) {
@ -427,6 +454,13 @@ function disable_starttime(select) {
start_div.style.display = 'block';
else
start_div.style.display = 'none';
emptyDuration();
}
function emptyDuration() {
if ($('#duration').val()) {
$('#duration').val('');
}
}
</script>

@ -4645,4 +4645,47 @@ class CourseManager
return Database::num_rows($result) > 0;
}
/**
* Get information from the track_e_course_access table
* @param int $sessionId
* @param int $userId
* @return array
*/
public static function getCourseAccessPerSessionAndUser($sessionId, $userId, $limit = null)
{
$table = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
$sql = "SELECT * FROM $table
WHERE session_id = $sessionId AND user_id = $userId";
if (!empty($limit)) {
$limit = intval($limit);
$sql .= " LIMIT $limit";
}
$result = Database::query($sql);
return Database::store_result($result);
}
/**
* Get information from the track_e_course_access table
* @param int $sessionId
* @param int $userId
* @return array
*/
public static function getFirstCourseAccessPerSessionAndUser($sessionId, $userId)
{
$table = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
$sql = "SELECT * FROM $table
WHERE session_id = $sessionId AND user_id = $userId
ORDER BY login_course_date ASC
LIMIT 1";
$result = Database::query($sql);
$courseAccess = array();
if (Database::num_rows($result)) {
$courseAccess = Database::fetch_array($result, 'ASSOC');
}
return $courseAccess;
}
}

@ -1388,6 +1388,10 @@ class Display
if (api_get_setting('show_session_coach') === 'true') {
$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']);
$session['duration'] = sprintf(get_lang('SessionDurationXDaysLeft'), $daysLeft);
}
$active = true;
} else {
$start = $stop = false;

@ -2003,23 +2003,37 @@ function api_get_session_visibility($session_id, $course_code = null, $ignore_vi
$session_id = intval($session_id);
$tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
$sql = "SELECT
visibility,
date_start,
date_end,
nb_days_access_after_end,
nb_days_access_before_beginning
FROM $tbl_session
$sql = "SELECT * FROM $tbl_session
WHERE id = $session_id ";
$result = Database::query($sql);
if (Database::num_rows($result) > 0 ) {
if (Database::num_rows($result) > 0) {
$row = Database::fetch_array($result, 'ASSOC');
$visibility = $original_visibility = $row['visibility'];
// I don't care the session visibility.
if ($row['date_start'] == '0000-00-00' && $row['date_end'] == '0000-00-00') {
// Session duration per student.
if (SessionManager::durationPerUserIsEnabled()) {
if (isset($row['duration']) && !empty($row['duration'])) {
$duration = $row['duration']*24*60*60;
$courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser(
$session_id,
api_get_user_id()
);
$currentTime = time();
$firstAccess = api_strtotime($courseAccess['login_course_date'], 'UTC');
if (($firstAccess + $duration) > $currentTime) {
return SESSION_AVAILABLE;
} else {
return SESSION_INVISIBLE;
}
}
}
return SESSION_AVAILABLE;
} else {
// If start date was set.
@ -3234,6 +3248,7 @@ function api_get_item_visibility($_course, $tool, $id, $session = 0)
if (!is_array($_course) || count($_course) == 0 || empty($tool) || empty($id)) {
return -1;
}
$tool = Database::escape_string($tool);
$id = intval($id);
$session = (int) $session;
@ -3595,28 +3610,30 @@ function api_get_track_item_property_history($tool, $ref)
* @param int course id
* @param string tool name, linked to 'rubrique' of the course tool_list (Warning: language sensitive !!)
* @param int id of the item itself, linked to key of every tool ('id', ...), "*" = all items of the tool
* @param int $session_id
*/
function api_get_item_property_info($course_id, $tool, $ref, $session_id = 0)
{
$course_info = api_get_course_info_by_id($course_id);
if (empty($course_info)) {
return false;
}
$tool = Database::escape_string($tool);
$ref = intval($ref);
$course_id = intval($course_id);
$tool = Database::escape_string($tool);
$ref = intval($ref);
$course_id = $course_info['real_id'];
$session_id = intval($session_id);
// Definition of tables.
$TABLE_ITEMPROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
$course_id = $course_info['real_id'];
$table = Database::get_course_table(TABLE_ITEM_PROPERTY);
$sql = "SELECT * FROM $TABLE_ITEMPROPERTY
WHERE c_id = $course_id AND tool = '$tool' AND ref = $ref ";
if (!empty($session_id)) {
$session_id = intval($session_id);
$sql .= "AND id_session = $session_id ";
}
$sql = "SELECT * FROM $table
WHERE
c_id = $course_id AND
tool = '$tool' AND
ref = $ref AND
id_session = $session_id ";
$rs = Database::query($sql);
$row = array();
@ -3686,6 +3703,7 @@ function api_display_language_form($hide_if_no_choice = false) {
if (isset($_SESSION['user_language_choice'])) {
$user_selected_language = $_SESSION['user_language_choice'];
}
if (empty($user_selected_language)) {
$user_selected_language = api_get_setting('platformLanguage');
}
@ -3701,10 +3719,12 @@ function api_display_language_form($hide_if_no_choice = false) {
}
//-->
</script>';
// var_dump($user_selected_language);
$html .= '<form id="lang_form" name="lang_form" method="post" action="'.api_get_self().'">';
$html .= '<label style="display: none;" for="language_list">' . get_lang('Language') . '</label>';
$html .= '<select id="language_list" class="chzn-select" name="language_list" onchange="javascript: jumpMenu(\'parent\',this,0);">';
foreach ($original_languages as $key => $value) {
if ($folder[$key] == $user_selected_language) {
$option_end = ' selected="selected" >';

@ -78,7 +78,8 @@ class SessionManager
$id_visibility,
$start_limit = true,
$end_limit = true,
$fix_name = false
$fix_name = false,
$duration = null
) {
global $_configuration;
@ -169,11 +170,28 @@ class SessionManager
}
if ($ready_to_create) {
$sql_insert = "INSERT INTO $tbl_session(name,date_start,date_end,id_coach,session_admin_id, nb_days_access_before_beginning, nb_days_access_after_end, session_category_id,visibility)
VALUES('" . $name . "','$date_start','$date_end','$id_coach'," . api_get_user_id() . "," . $nb_days_acess_before . ", " . $nb_days_acess_after . ", " . $id_session_category . ", " . $id_visibility . ")";
Database::query($sql_insert);
$sql = "INSERT INTO $tbl_session(name,date_start,date_end,id_coach,session_admin_id, nb_days_access_before_beginning, nb_days_access_after_end, session_category_id,visibility)
VALUES('" . $name . "','$date_start','$date_end','$id_coach'," . api_get_user_id() . "," . $nb_days_acess_before . ", " . $nb_days_acess_after . ", " . $id_session_category . ", " . $id_visibility . ")";
Database::query($sql);
$session_id = Database::insert_id();
if (self::durationPerUserIsEnabled()) {
$duration = intval($duration);
if (empty($duration)) {
$duration = null;
} else {
$sql = "UPDATE $tbl_session SET
date_start = '0000-00-00',
date_end = '0000-00-00'
WHERE id = $session_id";
Database::query($sql);
}
$sql = "UPDATE $tbl_session SET duration = $duration
WHERE id = $session_id";
Database::query($sql);
}
if (!empty($session_id)) {
/*
Sends a message to the user_id = 1
@ -1308,9 +1326,26 @@ class SessionManager
* The parameter id is a primary key
* */
public static function edit_session(
$id, $name, $year_start, $month_start, $day_start, $year_end, $month_end, $day_end, $nb_days_acess_before, $nb_days_acess_after, $nolimit, $id_coach, $id_session_category, $id_visibility, $start_limit = true, $end_limit = true, $description = null, $showDescription = null
)
{
$id,
$name,
$year_start,
$month_start,
$day_start,
$year_end,
$month_end,
$day_end,
$nb_days_acess_before,
$nb_days_acess_after,
$nolimit,
$id_coach,
$id_session_category,
$id_visibility,
$start_limit = true,
$end_limit = true,
$description = null,
$showDescription = null,
$duration = null
) {
$name = trim(stripslashes($name));
$year_start = intval($year_start);
$month_start = intval($month_start);
@ -1390,8 +1425,22 @@ class SessionManager
$showDescriptionCondition = ' show_description = "' . Database::escape_string($showDescription) . '" ,';
}
$sql = "UPDATE $tbl_session " .
"SET name='" . Database::escape_string($name) . "',
$durationCondition = null;
if (self::durationPerUserIsEnabled()) {
if (empty($duration)) {
$duration = null;
} else {
$date_start = '0000-00-00';
$date_end = "0000-00-00";
$duration = intval($duration);
}
$durationCondition = ' duration = "' . $duration . '" ,';
}
$sql = "UPDATE $tbl_session SET
name='" . Database::escape_string($name) . "',
date_start='" . $date_start . "',
date_end='" . $date_end . "',
id_coach='" . $id_coach . "',
@ -1400,8 +1449,10 @@ class SessionManager
session_category_id = " . $id_session_category . " ,
$descriptionCondition
$showDescriptionCondition
$durationCondition
visibility= " . $id_visibility . "
WHERE id='$id'";
Database::query($sql);
return $id;
}
@ -1482,9 +1533,12 @@ class SessionManager
* @return bool
*/
public static function suscribe_users_to_session(
$id_session, $user_list, $session_visibility = SESSION_VISIBLE_READ_ONLY, $empty_users = true, $send_email = false
)
{
$id_session,
$user_list,
$session_visibility = SESSION_VISIBLE_READ_ONLY,
$empty_users = true,
$send_email = false
) {
if ($id_session != strval(intval($id_session))) {
return false;
@ -3024,7 +3078,24 @@ class SessionManager
$consider_end = false;
}
$sid = self::create_session($s['name'] . ' ' . get_lang('CopyLabelSuffix'), $s['year_start'], $s['month_start'], $s['day_start'], $s['year_end'], $s['month_end'], $s['day_end'], $s['nb_days_acess_before_beginning'], $s['nb_days_acess_after_end'], false, (int) $s['id_coach'], $s['session_category_id'], (int) $s['visibility'], $consider_start, $consider_end, true);
$sid = self::create_session(
$s['name'] . ' ' . get_lang('CopyLabelSuffix'),
$s['year_start'],
$s['month_start'],
$s['day_start'],
$s['year_end'],
$s['month_end'],
$s['day_end'],
$s['nb_days_acess_before_beginning'],
$s['nb_days_acess_after_end'],
false,
(int)$s['id_coach'],
$s['session_category_id'],
(int)$s['visibility'],
$consider_start,
$consider_end,
true
);
if (!is_numeric($sid) || empty($sid)) {
return false;
@ -4478,7 +4549,7 @@ class SessionManager
}
/**
* Courses re-ordering in resume_session.php flag
* Courses re-ordering in resume_session.php flag see BT#8316
*/
public static function orderCourseIsEnabled()
{
@ -4579,4 +4650,44 @@ class SessionManager
{
return self::move('down', $sessionId, $courseCode);
}
/**
* Use the session duration to allow/block user access see BT#8317
* Needs "ALTER TABLE session ADD COLUMN duration int;"
*/
public static function durationPerUserIsEnabled()
{
global $_configuration;
if (isset($_configuration['session_duration_feature']) &&
$_configuration['session_duration_feature']
) {
return true;
}
return false;
}
/**
* @param int $userId
* @param int $sessionId
* @return int
*/
public 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;
}
}

@ -897,6 +897,9 @@ class IndexManager
}
}
$show_course_link = false;
$show_create_link = false;
// My account section
$my_account_content = '<ul class="nav nav-list">';
@ -1063,6 +1066,7 @@ class IndexManager
$params['icon'] = Display::return_icon('window_list.png', $session_box['title'], array('id' => 'session_img_'.$session_id), ICON_SIZE_LARGE);
$extra_info = !empty($session_box['coach']) ? $session_box['coach'] : null;
$extra_info .= !empty($session_box['coach']) ? ' - '.$session_box['dates'] : $session_box['dates'];
$extra_info .= isset($session_box['duration']) ? ' '.$session_box['duration'] : null;
if (api_is_drh()) {
$session_link = $session_box['title'];

Loading…
Cancel
Save