Simplifying reports see BT#7297

1.9.x
Julio Montoya 12 years ago
parent 1fabb3f6bb
commit 6d80a3d4dc
  1. 426
      main/inc/lib/tracking.lib.php
  2. 1034
      main/mySpace/index.php

@ -24,18 +24,28 @@ class Tracking
{
/**
* Calculates the time spent on the platform by a user
* @param int User id
* @param int|array User id
* @param string type of time filter: 'last_week' or 'custom'
* @param strgin start date date('Y-m-d H:i:s')
* @param strgin end date date('Y-m-d H:i:s')
* @return timestamp $nb_seconds
*/
public static function get_time_spent_on_the_platform($user_id, $time_filter = 'last_7_days', $start_date = null, $end_date = null)
{
$tbl_track_login = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_LOGIN);
public static function get_time_spent_on_the_platform(
$user_id,
$time_filter = 'last_7_days',
$start_date = null,
$end_date = null
) {
$tbl_track_login = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LOGIN);
$condition_time = '';
if (is_array($user_id)) {
$userList = array_map('intval', $user_id);
$userCondition = " login_user_id IN ('".implode("','", $userList)."')";
} else {
$userCondition = " login_user_id = ".intval($user_id);
}
if (empty($time_filter)) {
$time_filter = 'last_week';
}
@ -54,47 +64,24 @@ class Tracking
$condition_time = ' AND (login_date >= "'.$new_date.'" AND logout_date <= "'.$today.'") ';
break;
case 'custom':
if (!empty($start_date) && !empty($end_date)) {
if (!empty($start_date) && !empty($end_date)) {
$condition_time = ' AND (login_date >= "'.$start_date.'" AND logout_date <= "'.$end_date.'" ) ';
}
break;
}
$sql = 'SELECT login_date, logout_date FROM '.$tbl_track_login.'
WHERE login_user_id = '.intval($user_id).$condition_time;
$sql = 'SELECT SUM(TIMESTAMPDIFF(SECOND, login_date, logout_date)) diff
FROM '.$tbl_track_login.'
WHERE '.$userCondition.$condition_time;
$rs = Database::query($sql);
$row = Database::fetch_array($rs, 'ASSOC');
$diff = $row['diff'];
$nb_seconds = 0;
$wrong_logout_dates = false;
while ($a_connections = Database::fetch_array($rs)) {
$s_login_date = $a_connections["login_date"];
$s_logout_date = $a_connections["logout_date"];
$i_timestamp_login_date = strtotime($s_login_date);
$i_timestamp_logout_date = strtotime($s_logout_date);
if ($i_timestamp_logout_date > 0) {
// @TODO YW 20110708: for some reason the result here is often
// negative, resulting in a negative time total. Considering the
// logout_date is > 0, this can only mean that the database
// contains items where the login_date is higher (=later) than
// the logout date for a specific connexion. This has to be
// analyzed and fixed. Also see the get_time_spent_on_the_course
// for SQL summing.
$nb_seconds += abs($i_timestamp_logout_date - $i_timestamp_login_date);
} else { // there are wrong datas in db, then we can't give a wrong time
$wrong_logout_dates = true;
}
}
if($nb_seconds>0 || !$wrong_logout_dates) {
return $nb_seconds;
} else {
return -1; //-1 means we have wrong datas in the db
}
if ($diff >= 0) {
return $diff;
} else {
return -1;
}
}
/**
@ -106,13 +93,10 @@ class Tracking
*/
public static function get_time_spent_on_the_course($user_id, $course_code, $session_id = 0)
{
// protect datas
$course_code = Database::escape_string($course_code);
$session_id = intval($session_id);
$tbl_track_course = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
$condition_user = "";
if (is_array($user_id)) {
$user_id = array_map('intval', $user_id);
$condition_user = " AND user_id IN (".implode(',',$user_id).") ";
@ -122,7 +106,9 @@ class Tracking
}
$sql = "SELECT
SUM(UNIX_TIMESTAMP(logout_course_date) - UNIX_TIMESTAMP(login_course_date)) as nb_seconds
SUM (
UNIX_TIMESTAMP(logout_course_date) - UNIX_TIMESTAMP(login_course_date)
) as nb_seconds
FROM $tbl_track_course
WHERE
UNIX_TIMESTAMP(logout_course_date) > UNIX_TIMESTAMP(login_course_date) AND
@ -155,7 +141,6 @@ class Tracking
return false;
}
/**
* Get las connection date for a student
* @param int Student id
@ -198,6 +183,44 @@ class Tracking
return false;
}
/**
* Get las connection date for a student
* @param array Student id array
* @param int $days
* @param bool $getCount
* @return int
*/
public static function getInactiveUsers($studentList, $days, $getCount = true)
{
if (empty($studentList)) {
return 0;
}
$days = intval($days);
$date = api_get_utc_datetime(strtotime($days.' days ago'));
$studentList = array_map('intval', $studentList);
$tbl_track_login = Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_LOGIN);
$select = " SELECT login_user_id ";
if ($getCount) {
$select = " SELECT count(DISTINCT login_user_id) as count";
}
$sql = "$select
FROM $tbl_track_login
WHERE
login_user_id IN (' ". implode("','", $studentList) . "' ) AND
login_date < '$date'
";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
if ($getCount) {
$count = Database::fetch_array($rs);
return $count['count'];
}
return Database::store_result($rs, 'ASSOC');
}
return false;
}
/**
* Get first user's connection date on the course
* @param int User id
@ -555,69 +578,60 @@ class Tracking
* @param bool Will return an array of the type: [sum_of_progresses, number] if it is set to true
* @return double Average progress of the user in this course
*/
public static function get_avg_student_progress($student_id, $course_code, $lp_ids = array(), $session_id = null, $return_array = false)
public static function get_avg_student_progress($student_id, $course_code = null, $lp_ids = array(), $session_id = null, $return_array = false)
{
$conditions = array();
// Get the information of the course.
$course_info = api_get_course_info($course_code);
if (!empty($course_info)) {
// table definition
$tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW);
$tbl_course_lp = Database :: get_course_table(TABLE_LP_MAIN);
$conditions[] = " c_id = {$course_info['real_id']} ";
}
// table definition
$tbl_course_lp_view = Database :: get_course_table(TABLE_LP_VIEW);
// Compose a filter based on optional learning paths list given
$condition_lp = "";
// Compose a filter based on optional learning paths list given
$condition_lp = null;
if (!empty($lp_ids)) {
if (count($lp_ids) > 0) {
$lp_ids = array_map('intval', $lp_ids);
$conditions[] = " lp_view.lp_id IN(".implode(',', $lp_ids).") ";
}
}
if (!empty($lp_ids)) {
if (count($lp_ids) > 0) {
$condition_lp =" AND id IN(".implode(',',$lp_ids).") ";
}
}
$session_id = intval($session_id);
$sql = "SELECT id FROM $tbl_course_lp lp WHERE c_id = {$course_info['real_id']} $condition_lp";
$res_count_lp = Database::query($sql);
// count the number of learning paths
$lp_id = array();
while ($row_lp = Database::fetch_array($res_count_lp,'ASSOC')) {
$lp_id[] = $row_lp['id'];
// If there is at least one learning path and one student.
if (!empty($student_id)) {
if (is_array($student_id)) {
$student_id = array_map('intval', $student_id);
$conditions[] = " lp_view.user_id IN (".implode(',', $student_id).") ";
} else {
$student_id = intval($student_id);
$conditions[] = " lp_view.user_id = '$student_id' ";
}
$count_lp = count($lp_id);
// If there is at least one learning path and one student.
if ($count_lp>0 && !empty($student_id)) {
if (is_array($student_id)) {
array_walk($student_id,'intval');
$condition_user = " lp_view.user_id IN (".implode(',',$student_id).") AND ";
} else {
$student_id = intval($student_id);
$condition_user = " lp_view.user_id = '$student_id' AND ";
}
// Get last view for each student (in case of multi-attempt)
// Also filter on LPs of this session
$sql_maxes = "SELECT MAX(view_count), progress FROM $tbl_course_lp_view lp_view
WHERE c_id = {$course_info['real_id']} AND
$condition_user session_id = $session_id AND
lp_view.lp_id IN (".implode(',',$lp_id).")
GROUP BY lp_id, user_id";
$res_maxes = Database::query($sql_maxes);
$sum = 0;
while ($row_maxes = Database::fetch_array($res_maxes)) {
$sum += $row_maxes[1];
}
// average progress = total sum divided by the number of views
// summed up.
$number_items = count($lp_id);
if ($number_items == 0) {
return 0; //not necessary to return something else if there is no view
}
if (!$return_array) {
$avg_progress = round($sum / $number_items, 1);
return $avg_progress;
} else {
return array($sum, $number_items);
}
if (!empty($session_id)) {
$conditions[] = " session_id = $session_id ";
}
$conditionToString = implode('AND', $conditions);
// Get last view for each student (in case of multi-attempt)
// Also filter on LPs of this session
$sql = " SELECT
MAX(view_count),
AVG(progress) average,
SUM(progress) sum_progress,
count(progress) count_progress
FROM $tbl_course_lp_view lp_view
WHERE
$conditionToString
GROUP BY lp_id";
$result = Database::query($sql);
$row = Database::fetch_array($result, 'ASSOC');
if (!$return_array) {
$avg_progress = round($row['average'], 1);
return $avg_progress;
} else {
return array($row['sum_progress'], $row['count_progress']);
}
}
return null;
}
/**
@ -946,6 +960,89 @@ class Tracking
return null;
}
/**
* This function gets:
* 1. The score average from all SCORM Test items in all LP in a course-> All the answers / All the max scores.
* 2. The score average from all Tests (quiz) in all LP in a course-> All the answers / All the max scores.
* 3. And finally it will return the average between 1. and 2.
* This function does not take the results of a Test out of a LP
*
* @param int|array Array of user ids or an user id
* @param string Course code
* @param array List of LP ids
* @param int Session id (optional), if param $session_id is null(default) it'll return results including sessions, 0 = session is not filtered
* @param bool Returns an array of the type [sum_score, num_score] if set to true
* @param bool get only the latest attempts or ALL attempts
* @return string Value (number %) Which represents a round integer explain in got in 3.
*/
public static function getAverageStudentScore(
$student_id,
$course_code = null,
$lp_ids = array(),
$session_id = null
) {
$tbl_stats_exercices = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
$tbl_stats_attempts = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
if (empty($student_id)) {
return 0;
}
$conditions = array();
if (!empty($course_code)) {
$course = api_get_course_info($course_code);
$course_id = $course['real_id'];
$conditions[] = " c_id = {$course['real_id']}";
}
// get course tables names
$tbl_quiz_questions = Database :: get_course_table(TABLE_QUIZ_QUESTION);
$lp_table = Database :: get_course_table(TABLE_LP_MAIN);
$lp_item_table = Database :: get_course_table(TABLE_LP_ITEM);
$lp_view_table = Database :: get_course_table(TABLE_LP_VIEW);
$lp_item_view_table = Database :: get_course_table(TABLE_LP_ITEM_VIEW);
// Compose a filter based on optional learning paths list given
if (!empty($lp_ids) && count($lp_ids) > 0) {
$conditions[] = " id IN(".implode(',', $lp_ids).") ";
}
// Compose a filter based on optional session id
$session_id = intval($session_id);
if (!empty($session_id)) {
$conditions[] = " session_id = $session_id ";
}
if (is_array($student_id)) {
array_walk($student_id, 'intval');
$conditions[] =" lp_view.user_id IN (".implode(',', $student_id).") ";
} else {
$conditions[] =" lp_view.user_id = $student_id ";
}
$conditionsToString = implode('AND ', $conditions);
//lp_iv.max_score as max_score_item_view,
$sql = "SELECT SUM(lp_iv.score) sum_score,
SUM(lp_i.max_score) sum_max_score,
count(*) as count
FROM $lp_item_view_table as lp_iv
INNER JOIN $lp_item_table as lp_i
ON lp_i.id = lp_iv.lp_item_id
INNER JOIN $lp_table as lp
ON lp.id = lp_i.lp_id
INNER JOIN $lp_view_table as lp_view
ON (lp_view.lp_id = lp.id)
WHERE (lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."') AND
$conditionsToString
";
$result = Database::query($sql);
$row = Database::fetch_array($result, 'ASSOC');
return ($row['sum_score'] / $row['sum_max_score'])*100;
}
/**
* This function gets time spent in learning path for a student inside a course
* @param int|array Student id(s)
@ -1478,12 +1575,12 @@ class Tracking
$a_course = CourseManager::get_course_information($course_code);
if (!empty($a_course)) {
// table definition
$tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
$tbl_document = Database :: get_course_table(TABLE_DOCUMENT);
$tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
$tbl_document = Database :: get_course_table(TABLE_DOCUMENT);
$course_id = $a_course['real_id'];
if (is_array($student_id)) {
$student_id = array_map('intval', $student_id);
$condition_user = " AND ip.insert_user_id IN (".implode(',', $student_id).") ";
$studentList = array_map('intval', $student_id);
$condition_user = " AND ip.insert_user_id IN ('".implode(',', $studentList)."') ";
} else {
$student_id = intval($student_id);
$condition_user = " AND ip.insert_user_id = '$student_id' ";
@ -1495,7 +1592,7 @@ class Tracking
$condition_session = " AND pub.session_id = $session_id ";
}
$sql = "SELECT count(ip.tool)
$sql = "SELECT count(ip.tool) AS count
FROM $tbl_item_property ip INNER JOIN $tbl_document pub
ON ip.ref = pub.id
WHERE ip.c_id = $course_id AND
@ -1505,7 +1602,7 @@ class Tracking
$condition_user $condition_session ";
$rs = Database::query($sql);
$row = Database::fetch_row($rs);
return $row[0];
return $row['count'];
}
return null;
}
@ -1517,83 +1614,98 @@ class Tracking
* @param int Session id (optional), if param $session_id is null(default) return count of assignments including sessions, 0 = session is not filtered
* @return int Count of assignments
*/
public static function count_student_assignments($student_id, $course_code, $session_id = null)
public static function count_student_assignments($student_id, $course_code = null, $session_id = null)
{
if (empty($student_id)) {
return 0;
}
$conditions = array();
// Get the information of the course
$a_course = CourseManager::get_course_information($course_code);
if (!empty($a_course)) {
// table definition
$tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
$tbl_student_publication = Database :: get_course_table(TABLE_STUDENT_PUBLICATION);
$course_id = $a_course['real_id'];
$conditions[]= " ip.c_id = $course_id AND pub.c_id = $course_id ";
}
if (is_array($student_id)) {
$condition_user = " AND ip.insert_user_id IN (".implode(',',$student_id).") ";
} else {
$condition_user = " AND ip.insert_user_id = '$student_id' ";
}
$condition_session = "";
if (isset($session_id)) {
$session_id = intval($session_id);
$condition_session = " AND pub.session_id = $session_id ";
}
// table definition
$tbl_item_property = Database :: get_course_table(TABLE_ITEM_PROPERTY);
$tbl_student_publication = Database :: get_course_table(TABLE_STUDENT_PUBLICATION);
$sql = "SELECT count(ip.tool)
FROM $tbl_item_property ip INNER JOIN $tbl_student_publication pub
ON ip.ref = pub.id
WHERE ip.c_id = $course_id AND
pub.c_id = $course_id AND
ip.tool='work'
$condition_user $condition_session ";
$rs = Database::query($sql);
$row = Database::fetch_row($rs);
return $row[0];
if (is_array($student_id)) {
$studentList = array_map('intval', $student_id);
$conditions[]= " ip.insert_user_id IN ('".implode("','", $studentList)."') ";
} else {
$student_id = intval($student_id);
$conditions[]= " ip.insert_user_id = '$student_id' ";
}
return null;
if (isset($session_id)) {
$session_id = intval($session_id);
$conditions[]= " pub.session_id = $session_id ";
}
$conditionToString = implode('AND', $conditions);
$sql = "SELECT count(ip.tool) as count
FROM $tbl_item_property ip
INNER JOIN $tbl_student_publication pub ON ip.ref = pub.id
WHERE
ip.tool='work' AND
$conditionToString";
$rs = Database::query($sql);
$row = Database::fetch_array($rs, 'ASSOC');
return $row['count'];
}
/**
* Count messages per student inside forum tool
* @param int Student id
* @param int|array Student id
* @param string Course code
* @param int Session id (optional), if param $session_id is null(default) return count of messages including sessions, 0 = session is not filtered
* @param int Session id (optional), if param $session_id is
* null(default) return count of messages including sessions, 0 = session is not filtered
* @return int Count of messages
*/
public static function count_student_messages($student_id, $courseCode, $session_id = null)
public static function count_student_messages($student_id, $courseCode = null, $session_id = null)
{
$student_id = intval($student_id);
if (empty($student_id)) {
return 0;
}
$courseInfo = api_get_course_info($courseCode);
$courseCondition = null;
$conditions = array();
if (!empty($courseInfo)) {
// Table definition
$tbl_forum_post = Database :: get_course_table(TABLE_FORUM_POST);
$tbl_forum = Database :: get_course_table(TABLE_FORUM);
$course_id = $courseInfo['real_id'];
$conditions[]= " post.c_id = $course_id AND forum.c_id = $course_id ";
}
if (is_array($student_id)) {
$condition_user = " AND post.poster_id IN (".implode(',',$student_id).") ";
} else {
$condition_user = " AND post.poster_id = '$student_id' ";
}
$condition_session = "";
if (isset($session_id)) {
$session_id = intval($session_id);
$condition_session = " AND forum.session_id = $session_id";
}
// Table definition.
$tbl_forum_post = Database :: get_course_table(TABLE_FORUM_POST);
$tbl_forum = Database :: get_course_table(TABLE_FORUM);
$sql = "SELECT 1 FROM $tbl_forum_post post INNER JOIN $tbl_forum forum
ON forum.forum_id = post.forum_id
WHERE post.c_id = $course_id AND
forum.c_id = $course_id
$condition_user $condition_session ";
$rs = Database::query($sql);
return Database::num_rows($rs);
if (is_array($student_id)) {
$studentList = array_map('intval', $student_id);
$conditions[]= " post.poster_id IN ('".implode("','", $studentList)."') ";
} else {
return null;
$student_id = intval($student_id);
$conditions[]= " post.poster_id = '$student_id' ";
}
if (isset($session_id)) {
$session_id = intval($session_id);
$conditions[]= " forum.session_id = $session_id";
}
$conditionsToString = implode('AND ', $conditions);
$sql = "SELECT count(poster_id) as count
FROM $tbl_forum_post post INNER JOIN $tbl_forum forum
ON forum.forum_id = post.forum_id
WHERE $conditionsToString";
$rs = Database::query($sql);
$row = Database::fetch_array($rs, 'ASSOC');
$count = $row['count'];
return $count;
}
/**

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save