Use course/session entities, fix queries

pull/3844/head
Julio Montoya 5 years ago
parent 96141eaf4e
commit 10c2aab1be
  1. 22
      public/main/inc/lib/api.lib.php
  2. 197
      public/main/inc/lib/tracking.lib.php
  3. 2
      public/main/inc/lib/webservices/Rest.php
  4. 56
      public/main/mySpace/myStudents.php
  5. 9
      public/main/tracking/courseLog.php
  6. 33
      src/CourseBundle/Repository/CLpRepository.php

@ -2307,6 +2307,10 @@ function api_get_course_entity($courseId = 0): ?Course
$courseId = api_get_course_int_id(); $courseId = api_get_course_int_id();
} }
if (empty($courseId)) {
return null;
}
return Container::getCourseRepository()->find($courseId); return Container::getCourseRepository()->find($courseId);
} }
@ -6381,23 +6385,21 @@ function api_get_jquery_libraries_js($libraries)
* *
* This function relies on api_get_course_info() * This function relies on api_get_course_info()
* *
* @param string $courseCode The course code - optional (takes it from context if not given) * @param int $courseId The course code - optional (takes it from context if not given)
* @param int $sessionId The session ID - optional (takes it from context if not given) * @param int $sessionId The session ID - optional (takes it from context if not given)
* @param int $groupId The group ID - optional (takes it from context if not given) * @param int $groupId The group ID - optional (takes it from context if not given)
* *
* @return string The URL to a course, a session, or empty string if nothing works * @return string The URL to a course, a session, or empty string if nothing works
* e.g. https://localhost/courses/ABC/index.php?session_id=3&gidReq=1 * e.g. https://localhost/courses/ABC/index.php?session_id=3&gidReq=1
* *
* @author Julio Montoya <gugli100@gmail.com> * @author Julio Montoya
*/ */
function api_get_course_url($courseCode = null, $sessionId = null, $groupId = null) function api_get_course_url($courseId = null, $sessionId = null, $groupId = null)
{ {
$url = ''; $url = '';
// If courseCode not set, get context or [] // If courseCode not set, get context or []
if (empty($courseCode)) { if (empty($courseId)) {
$courseInfo = api_get_course_info(); $courseId = api_get_course_int_id();
} else {
$courseInfo = api_get_course_info($courseCode);
} }
// If sessionId not set, get context or 0 // If sessionId not set, get context or 0
@ -6410,10 +6412,12 @@ function api_get_course_url($courseCode = null, $sessionId = null, $groupId = nu
$groupId = api_get_group_id(); $groupId = api_get_group_id();
} }
// Build the URL // Build the URL
if (!empty($courseInfo)) { if (!empty($courseId)) {
$webCourseHome = '/course/'.$courseId.'/home';
// directory not empty, so we do have a course // directory not empty, so we do have a course
$url = $courseInfo['course_public_url'].'?sid='.$sessionId.'&gid='.$groupId; $url = $webCourseHome.'?sid='.$sessionId.'&gid='.$groupId;
} else { } else {
if (!empty($sessionId) && 'true' !== api_get_setting('session.remove_session_url')) { if (!empty($sessionId) && 'true' !== api_get_setting('session.remove_session_url')) {
// if the course was unset and the session was set, send directly to the session // if the course was unset and the session was set, send directly to the session

@ -7,7 +7,9 @@ use Chamilo\CoreBundle\Entity\ExtraField as EntityExtraField;
use Chamilo\CoreBundle\Entity\Session as SessionEntity; use Chamilo\CoreBundle\Entity\Session as SessionEntity;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Framework\Container; use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CourseBundle\Entity\CLp;
use Chamilo\CourseBundle\Entity\CQuiz; use Chamilo\CourseBundle\Entity\CQuiz;
use Chamilo\CourseBundle\Entity\CStudentPublication;
use ChamiloSession as Session; use ChamiloSession as Session;
use CpChart\Cache as pCache; use CpChart\Cache as pCache;
use CpChart\Data as pData; use CpChart\Data as pData;
@ -80,29 +82,25 @@ class Tracking
); );
$average = self::get_avg_student_score( $average = self::get_avg_student_score(
$user_data['user_id'], $user_data['user_id'],
$courseCode, $course,
[], [],
$sessionId $session
); );
if (is_numeric($average)) { if (is_numeric($average)) {
$avg_student_score += $average; $avg_student_score += $average;
} }
$avg_student_progress += self::get_avg_student_progress( $avg_student_progress += self::get_avg_student_progress(
$user_data['user_id'], $user_data['user_id'],
$courseCode, $course,
[], [],
$sessionId $session
); );
$work += Container::getStudentPublicationRepository()->countUserPublications( $work += Container::getStudentPublicationRepository()->countUserPublications(
$user, $user,
$course, $course,
$session $session
); );
$messages += self::count_student_messages( $messages += Container::getForumPostRepository()->countUserForumPosts($user, $course, $session);
$user_data['user_id'],
$courseInfo['code'],
$sessionId
);
} }
$countUsers = count($users); $countUsers = count($users);
@ -2303,7 +2301,8 @@ class Tracking
* @param string code * @param string code
* @param int id (optional), filtered by exercise * @param int id (optional), filtered by exercise
* @param int id (optional), if param $session_id is null * @param int id (optional), if param $session_id is null
* it'll return results including sessions, 0 = session is not filtered * it'll return results including sessions, 0 = session is not
* filtered
* *
* @return string value (number %) Which represents a round integer about the score average * @return string value (number %) Which represents a round integer about the score average
*/ */
@ -2606,9 +2605,9 @@ class Tracking
* course, it will take into account the progress that were not started. * course, it will take into account the progress that were not started.
* *
* @param int|array $studentId * @param int|array $studentId
* @param string $courseCode * @param Course $course
* @param array $lpIdList Limit average to listed lp ids * @param array $lpIdList Limit average to listed lp ids
* @param int $sessionId Session id (optional), * @param SessionEntity $session Session id (optional),
* if parameter $session_id is null(default) it'll return results including * if parameter $session_id is null(default) it'll return results including
* sessions, 0 = session is not filtered * sessions, 0 = session is not filtered
* @param bool $returnArray Will return an array of the type: * @param bool $returnArray Will return an array of the type:
@ -2619,9 +2618,9 @@ class Tracking
*/ */
public static function get_avg_student_progress( public static function get_avg_student_progress(
$studentId, $studentId,
$courseCode = null, Course $course,
$lpIdList = [], $lpIdList = [],
$sessionId = null, SessionEntity $session = null,
$returnArray = false, $returnArray = false,
$onlySeriousGame = false $onlySeriousGame = false
) { ) {
@ -2630,16 +2629,24 @@ class Tracking
return false; return false;
} }
$sessionId = (int) $sessionId; $repo = Container::getLpRepository();
$courseInfo = api_get_course_info($courseCode); $qb = $repo->findAllByCourse($course, $session);
$lps = $qb->getQuery()->getResult();
$filteredLP = [];
if (empty($courseInfo)) { $sessionId = null !== $session ? $session->getId() : 0;
/** @var CLp $lp */
foreach ($lps as $lp) {
$filteredLP[] = $lp->getIid();
}
if (empty($filteredLP)) {
return false; return false;
} }
$lPTable = Database::get_course_table(TABLE_LP_MAIN);
$lpViewTable = Database::get_course_table(TABLE_LP_VIEW); $lpViewTable = Database::get_course_table(TABLE_LP_VIEW);
$lpConditions = []; /*$lpConditions = [];
$lpConditions['c_id = ? '] = $courseInfo['real_id']; $lpConditions['c_id = ? '] = $courseInfo['real_id'];
if ($sessionId > 0) { if ($sessionId > 0) {
@ -2669,10 +2676,10 @@ class Tracking
if (empty($filteredLP)) { if (empty($filteredLP)) {
return false; return false;
} }*/
$conditions = [ $conditions = [
" c_id = {$courseInfo['real_id']} ", //" c_id = {$courseInfo['real_id']} ",
" lp_view.lp_id IN (".implode(', ', $filteredLP).") ", " lp_view.lp_id IN (".implode(', ', $filteredLP).") ",
]; ];
@ -2688,7 +2695,7 @@ class Tracking
if (empty($lpIdList)) { if (empty($lpIdList)) {
$lpList = new LearnpathList( $lpList = new LearnpathList(
$studentId, $studentId,
$courseInfo, ['real_id' => $course->getId()],
$sessionId, $sessionId,
null, null,
false, false,
@ -2767,13 +2774,10 @@ class Tracking
* 2. The score average from all Tests (quiz) 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. * 3. And finally it will return the average between 1. and 2.
* *
* @todo improve performance, when loading 1500 users with 20 lps the script dies
* This function does not take the results of a Test out of a LP
*
* @param mixed $student_id Array of user ids or an user id * @param mixed $student_id Array of user ids or an user id
* @param string $course_code * @param Course $course
* @param array $lp_ids List of LP ids * @param array $lp_ids List of LP ids
* @param int $session_id Session id (optional), * @param SessionEntity $session
* if param $session_id is null(default) it'll return results * if param $session_id is null(default) it'll return results
* including sessions, 0 = session is not filtered * including sessions, 0 = session is not filtered
* @param bool $return_array Returns an array of the * @param bool $return_array Returns an array of the
@ -2782,27 +2786,26 @@ class Tracking
* @param bool $getOnlyBestAttempt * @param bool $getOnlyBestAttempt
* *
* @return string value (number %) Which represents a round integer explain in got in 3 * @return string value (number %) Which represents a round integer explain in got in 3
* @todo improve performance, when loading 1500 users with 20 lps the script dies
* This function does not take the results of a Test out of a LP
*
*/ */
public static function get_avg_student_score( public static function get_avg_student_score(
$student_id, $student_id,
$course_code, Course $course,
$lp_ids = [], $lp_ids = [],
$session_id = null, SessionEntity $session = null,
$return_array = false, $return_array = false,
$get_only_latest_attempt_results = false, $get_only_latest_attempt_results = false,
$getOnlyBestAttempt = false $getOnlyBestAttempt = false
) { ) {
$debug = false; if (empty($student_id)) {
if ($debug) { return null;
echo '<h1>Tracking::get_avg_student_score</h1>';
} }
$debug = false;
$tbl_stats_exercices = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES); $tbl_stats_exercices = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
$tbl_stats_attempts = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); $tbl_stats_attempts = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
$course = api_get_course_info($course_code);
if (empty($course)) {
return null;
}
// Get course tables names // Get course tables names
$tbl_quiz_questions = Database::get_course_table(TABLE_QUIZ_QUESTION); $tbl_quiz_questions = Database::get_course_table(TABLE_QUIZ_QUESTION);
@ -2810,7 +2813,7 @@ class Tracking
$lp_item_table = Database::get_course_table(TABLE_LP_ITEM); $lp_item_table = Database::get_course_table(TABLE_LP_ITEM);
$lp_view_table = Database::get_course_table(TABLE_LP_VIEW); $lp_view_table = Database::get_course_table(TABLE_LP_VIEW);
$lp_item_view_table = Database::get_course_table(TABLE_LP_ITEM_VIEW); $lp_item_view_table = Database::get_course_table(TABLE_LP_ITEM_VIEW);
$course_id = $course['real_id']; $course_id = $course->getId();
// Compose a filter based on optional learning paths list given // Compose a filter based on optional learning paths list given
$condition_lp = ''; $condition_lp = '';
@ -2819,8 +2822,8 @@ class Tracking
} }
// Compose a filter based on optional session id // Compose a filter based on optional session id
$session_id = (int) $session_id; //$session_id = (int) $session_id;
if (count($lp_ids) > 0) { /*if (count($lp_ids) > 0) {
$condition_session = " AND session_id = $session_id "; $condition_session = " AND session_id = $session_id ";
} else { } else {
$condition_session = " WHERE session_id = $session_id "; $condition_session = " WHERE session_id = $session_id ";
@ -2835,19 +2838,34 @@ class Tracking
c_id = $course_id AND c_id = $course_id AND
(session_id = 0 OR session_id IS NULL) $condition_lp "; (session_id = 0 OR session_id IS NULL) $condition_lp ";
} else { } else {
$sql = "SELECT DISTINCT(iid), use_max_score
FROM $lp_table
WHERE c_id = $course_id $condition_lp ";
}
$res_row_lp = Database::query($sql); }*/
$count_row_lp = Database::num_rows($res_row_lp);
$lp_list = $use_max_score = []; $lp_list = $use_max_score = [];
if (empty($condition_lp)) {
$repo = Container::getLpRepository();
$qb = $repo->findAllByCourse($course, $session);
$lps = $qb->getQuery()->getResult();
/** @var CLp $lp */
foreach ($lps as $lp) {
$lpId = $lp->getIid();
$lp_list[] = $lpId;
$use_max_score[$lpId] = $lp->getUseMaxScore();
}
} else {
$sql = "SELECT DISTINCT(iid), use_max_score
FROM $lp_table
WHERE $condition_lp ";
$res_row_lp = Database::query($sql);
while ($row_lp = Database::fetch_array($res_row_lp)) { while ($row_lp = Database::fetch_array($res_row_lp)) {
$lp_list[] = $row_lp['iid']; $lp_list[] = $row_lp['iid'];
$use_max_score[$row_lp['iid']] = $row_lp['use_max_score']; $use_max_score[$row_lp['iid']] = $row_lp['use_max_score'];
} }
}
if (empty($lp_list)) {
return null;
}
// prepare filter on users // prepare filter on users
if (is_array($student_id)) { if (is_array($student_id)) {
@ -2857,24 +2875,18 @@ class Tracking
$condition_user1 = " AND user_id = $student_id "; $condition_user1 = " AND user_id = $student_id ";
} }
if (empty($count_row_lp) || empty($student_id)) {
return null;
}
// Getting latest LP result for a student // Getting latest LP result for a student
//@todo problem when a course have more than 1500 users //@todo problem when a course have more than 1500 users
$sql = "SELECT MAX(view_count) as vc, iid, progress, lp_id, user_id $sql = "SELECT MAX(view_count) as vc, iid, progress, lp_id, user_id
FROM $lp_view_table FROM $lp_view_table
WHERE WHERE
c_id = $course_id AND
lp_id IN (".implode(',', $lp_list).") lp_id IN (".implode(',', $lp_list).")
$condition_user1 AND $condition_user1
session_id = $session_id
GROUP BY lp_id, user_id"; GROUP BY lp_id, user_id";
//AND session_id = $session_id
$rs_last_lp_view_id = Database::query($sql); $rs_last_lp_view_id = Database::query($sql);
$global_result = 0; $global_result = 0;
if (Database::num_rows($rs_last_lp_view_id) > 0) { if (Database::num_rows($rs_last_lp_view_id) > 0) {
// Cycle through each line of the results (grouped by lp_id, user_id) // Cycle through each line of the results (grouped by lp_id, user_id)
while ($row_lp_view = Database::fetch_array($rs_last_lp_view_id)) { while ($row_lp_view = Database::fetch_array($rs_last_lp_view_id)) {
@ -2896,7 +2908,6 @@ class Tracking
$sql = "SELECT DISTINCT lp_item_id $sql = "SELECT DISTINCT lp_item_id
FROM $lp_item_view_table FROM $lp_item_view_table
WHERE WHERE
c_id = $course_id AND
lp_view_id = $lp_view_id lp_view_id = $lp_view_id
ORDER BY lp_item_id"; ORDER BY lp_item_id";
$res_lp_item = Database::query($sql); $res_lp_item = Database::query($sql);
@ -2920,12 +2931,9 @@ class Tracking
FROM $lp_item_view_table as lp_iv FROM $lp_item_view_table as lp_iv
INNER JOIN $lp_item_table as lp_i INNER JOIN $lp_item_table as lp_i
ON ( ON (
lp_i.iid = lp_iv.lp_item_id AND lp_i.iid = lp_iv.lp_item_id
lp_iv.c_id = lp_i.c_id
) )
WHERE WHERE
lp_iv.c_id = $course_id AND
lp_i.c_id = $course_id AND
lp_item_id = $my_lp_item_id AND lp_item_id = $my_lp_item_id AND
lp_view_id = $lp_view_id AND lp_view_id = $lp_view_id AND
(lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."') (lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."')
@ -2950,11 +2958,8 @@ class Tracking
lp_i.iid lp_i.iid
FROM $lp_item_view_table as lp_iv FROM $lp_item_view_table as lp_iv
INNER JOIN $lp_item_table as lp_i INNER JOIN $lp_item_table as lp_i
ON lp_i.iid = lp_iv.lp_item_id AND ON lp_i.iid = lp_iv.lp_item_id
lp_iv.c_id = lp_i.c_id
WHERE WHERE
lp_iv.c_id = $course_id AND
lp_i.c_id = $course_id AND
lp_view_id = $lp_view_id AND lp_view_id = $lp_view_id AND
(lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."') (lp_i.item_type='sco' OR lp_i.item_type='".TOOL_QUIZ."')
"; ";
@ -2976,7 +2981,7 @@ class Tracking
echo '<h3>Item Type: '.$row_max_score['item_type'].'</h3>'; echo '<h3>Item Type: '.$row_max_score['item_type'].'</h3>';
} }
if ('sco' == $row_max_score['item_type']) { if ('sco' === $row_max_score['item_type']) {
/* Check if it is sco (easier to get max_score) /* Check if it is sco (easier to get max_score)
when there's no max score, we assume 100 as the max score, when there's no max score, we assume 100 as the max score,
as the SCORM 1.2 says that the value should always be between 0 and 100. as the SCORM 1.2 says that the value should always be between 0 and 100.
@ -3057,10 +3062,10 @@ class Tracking
ponderation ponderation
FROM $tbl_stats_attempts AS at FROM $tbl_stats_attempts AS at
INNER JOIN $tbl_quiz_questions AS q INNER JOIN $tbl_quiz_questions AS q
ON (q.iid = at.question_id AND q.c_id = q.c_id) ON (q.iid = at.question_id)
WHERE WHERE
exe_id ='$id_last_attempt' AND exe_id ='$id_last_attempt' AND
q.c_id = $course_id at.c_id = $course_id
) )
AS t"; AS t";
@ -3094,7 +3099,7 @@ class Tracking
echo '$count_items: '.$count_items; echo '$count_items: '.$count_items;
} }
} }
} //end for }
$score_of_scorm_calculate += $count_items ? (($lpPartialTotal / $count_items) * 100) : 0; $score_of_scorm_calculate += $count_items ? (($lpPartialTotal / $count_items) * 100) : 0;
$global_result += $score_of_scorm_calculate; $global_result += $score_of_scorm_calculate;
@ -3104,7 +3109,7 @@ class Tracking
var_dump("score_of_scorm_calculate: $score_of_scorm_calculate"); var_dump("score_of_scorm_calculate: $score_of_scorm_calculate");
var_dump("global_result: $global_result"); var_dump("global_result: $global_result");
} }
} // end while }
} }
$lp_with_quiz = 0; $lp_with_quiz = 0;
@ -3113,7 +3118,6 @@ class Tracking
$sql = "SELECT count(iid) as count $sql = "SELECT count(iid) as count
FROM $lp_item_table FROM $lp_item_table
WHERE WHERE
c_id = $course_id AND
(item_type = 'quiz' OR item_type = 'sco') AND (item_type = 'quiz' OR item_type = 'sco') AND
lp_id = ".$lp_id; lp_id = ".$lp_id;
$result_have_quiz = Database::query($sql); $result_have_quiz = Database::query($sql);
@ -3127,8 +3131,6 @@ class Tracking
if ($debug) { if ($debug) {
echo '<h3>$lp_with_quiz '.$lp_with_quiz.' </h3>'; echo '<h3>$lp_with_quiz '.$lp_with_quiz.' </h3>';
}
if ($debug) {
echo '<h3>Final return</h3>'; echo '<h3>Final return</h3>';
} }
@ -4836,11 +4838,11 @@ class Tracking
$time = api_time_to_hms($total_time_login); $time = api_time_to_hms($total_time_login);
$progress = self::get_avg_student_progress( $progress = self::get_avg_student_progress(
$user_id, $user_id,
$courseCode $course
); );
$bestScore = self::get_avg_student_score( $bestScore = self::get_avg_student_score(
$user_id, $user_id,
$courseCode, $course,
[], [],
null, null,
false, false,
@ -4905,7 +4907,7 @@ class Tracking
} else { } else {
$html .= '<tr class="row_even">'; $html .= '<tr class="row_even">';
} }
$url = api_get_course_url($courseCode, $session_id); $url = api_get_course_url($courseId, $session_id);
$course_url = Display::url($course_title, $url, ['target' => SESSION_LINK_TARGET]); $course_url = Display::url($course_title, $url, ['target' => SESSION_LINK_TARGET]);
if (empty($bestScore)) { if (empty($bestScore)) {
$bestScoreResult = '-'; $bestScoreResult = '-';
@ -5308,9 +5310,9 @@ class Tracking
$bestScore = self::get_avg_student_score( $bestScore = self::get_avg_student_score(
$user_id, $user_id,
$course_code, $course,
[], [],
$session_id_from_get, $session,
false, false,
false, false,
true true
@ -5333,9 +5335,9 @@ class Tracking
$progress = self::get_avg_student_progress( $progress = self::get_avg_student_progress(
$user_id, $user_id,
$course_code, $course,
[], [],
$session_id_from_get $session
); );
$total_time_login = self::get_time_spent_on_the_course( $total_time_login = self::get_time_spent_on_the_course(
@ -5347,9 +5349,9 @@ class Tracking
$percentage_score = self::get_avg_student_score( $percentage_score = self::get_avg_student_score(
$user_id, $user_id,
$course_code, $course,
[], [],
$session_id_from_get $session
); );
$courseCodeFromGet = isset($_GET['course']) ? $_GET['course'] : null; $courseCodeFromGet = isset($_GET['course']) ? $_GET['course'] : null;
@ -5359,7 +5361,7 @@ class Tracking
$html .= '<tr class="row_even">'; $html .= '<tr class="row_even">';
} }
$url = api_get_course_url($course_code, $session_id_from_get); $url = api_get_course_url($courseId, $session_id_from_get);
$course_url = Display::url( $course_url = Display::url(
$course_title, $course_title,
$url, $url,
@ -5395,7 +5397,8 @@ class Tracking
'#course_session_data' '#course_session_data'
); );
} else { } else {
$url = api_get_self().'?course='.$course_code.'&session_id='.$session_id_from_get.$extra_params.'#course_session_data'; $url = api_get_self().
'?course='.$course_code.'&session_id='.$session_id_from_get.$extra_params.'#course_session_data';
$details = Display::url( $details = Display::url(
Display::return_icon( Display::return_icon(
'2rightarrow.png', '2rightarrow.png',
@ -6558,11 +6561,9 @@ class Tracking
/** /**
* @param string $tool * @param string $tool
* @param sessionEntity |null $session Optional * @param SessionEntity |null $session
* *
* @throws \Doctrine\ORM\NonUniqueResultException * @return CStudentPublication|null
*
* @return \Chamilo\CourseBundle\Entity\CStudentPublication|null
*/ */
public static function getLastStudentPublication( public static function getLastStudentPublication(
User $user, User $user,
@ -7369,10 +7370,10 @@ class Tracking
$created_dir = '/'.$created_dir; $created_dir = '/'.$created_dir;
$now = new DateTime(api_get_utc_datetime(), new DateTimeZone('UTC')); $now = new DateTime(api_get_utc_datetime(), new DateTimeZone('UTC'));
//Creating directory //Creating directory
$publication = new \Chamilo\CourseBundle\Entity\CStudentPublication(); $publication = new CStudentPublication();
$publication $publication
->setUrl($created_dir) //->setUrl($created_dir)
->setCId($course_id) //->setCId($course_id)
->setTitle($parent_data['title']) ->setTitle($parent_data['title'])
->setDescription( ->setDescription(
$parent_data['description']."folder_moved_from_session_id_$origin_session_id" $parent_data['description']."folder_moved_from_session_id_$origin_session_id"
@ -7457,7 +7458,7 @@ class Tracking
$data['sent_date'] = new DateTime($data['sent_date'], new DateTimeZone('UTC')); $data['sent_date'] = new DateTime($data['sent_date'], new DateTimeZone('UTC'));
$data['post_group_id'] = (int) $data['post_group_id']; $data['post_group_id'] = (int) $data['post_group_id'];
$publication = new \Chamilo\CourseBundle\Entity\CStudentPublication(); $publication = new CStudentPublication();
$publication $publication
->setUrl($new_url) ->setUrl($new_url)
->setCId($course_id) ->setCId($course_id)
@ -8262,7 +8263,7 @@ class TrackingCourseLog
$conditions = [], $conditions = [],
$options = [] $options = []
) { ) {
global $user_ids, $course_code, $export_csv, $session_id; global $user_ids, $export_csv, $session_id;
$includeInvitedUsers = $conditions['include_invited_users']; // include the invited users $includeInvitedUsers = $conditions['include_invited_users']; // include the invited users
$getCount = isset($conditions['get_count']) ? $conditions['get_count'] : false; $getCount = isset($conditions['get_count']) ? $conditions['get_count'] : false;
@ -8437,17 +8438,17 @@ class TrackingCourseLog
); );
$avg_student_score = Tracking::get_avg_student_score( $avg_student_score = Tracking::get_avg_student_score(
$user['user_id'], $userEntity,
$courseCode, $course,
[], [],
$session_id $session
); );
$averageBestScore = Tracking::get_avg_student_score( $averageBestScore = Tracking::get_avg_student_score(
$user['user_id'], $user['user_id'],
$courseCode, $course,
[], [],
$session_id, $session,
false, false,
false, false,
true true
@ -8455,9 +8456,9 @@ class TrackingCourseLog
$avg_student_progress = Tracking::get_avg_student_progress( $avg_student_progress = Tracking::get_avg_student_progress(
$user['user_id'], $user['user_id'],
$courseCode, $course,
[], [],
$session_id $session
); );
if (empty($avg_student_progress)) { if (empty($avg_student_progress)) {

@ -856,7 +856,7 @@ class Rest extends WebService
$lpId, $lpId,
$this->user->getId(), $this->user->getId(),
$this->course, $this->course,
$sessionId $this->session
)) { )) {
continue; continue;
} }

@ -25,10 +25,11 @@ $courseCode = '';
if (null !== $course) { if (null !== $course) {
$courseCode = $course->getCode(); $courseCode = $course->getCode();
} }
$session = api_get_session_entity($sessionId);
$studentId = isset($_GET['student']) ? (int) $_GET['student'] : 0; $studentId = isset($_GET['student']) ? (int) $_GET['student'] : 0;
$coachId = isset($_GET['id_coach']) ? (int) $_GET['id_coach'] : 0; $coachId = isset($_GET['id_coach']) ? (int) $_GET['id_coach'] : 0;
$details = isset($_GET['details']) ? Security::remove_XSS($_GET['details']) : ''; $details = isset($_GET['details']) ? Security::remove_XSS($_GET['details']) : '';
$currentUrl = api_get_self().'?student='.$studentId.'&course='.$courseCode.'&id_session='.$sessionId $currentUrl = api_get_self().'?student='.$studentId.'&course='.$courseCode.'&sid='.$sessionId
.'&origin='.$origin.'&details='.$details.'&cid='.$courseId; .'&origin='.$origin.'&details='.$details.'&cid='.$courseId;
$allowMessages = api_get_configuration_value('private_messages_about_user'); $allowMessages = api_get_configuration_value('private_messages_about_user');
$workingTime = api_get_configuration_value('considered_working_time'); $workingTime = api_get_configuration_value('considered_working_time');
@ -111,7 +112,7 @@ if (!empty($details)) {
if ('user_course' === $origin) { if ('user_course' === $origin) {
if (empty($cidReq)) { if (empty($cidReq)) {
$interbreadcrumb[] = [ $interbreadcrumb[] = [
'url' => api_get_course_url($course->getCode()), 'url' => api_get_course_url($course->getId()),
'name' => $course->getTitle(), 'name' => $course->getTitle(),
]; ];
} }
@ -320,9 +321,9 @@ switch ($action) {
foreach ($courses as $course) { foreach ($courses as $course) {
$courseId = $course['c_id']; $courseId = $course['c_id'];
$courseInfoItem = api_get_course_info_by_id($courseId); $course = api_get_course_entity($courseId);
$courseId = $courseInfoItem['real_id']; $courseId = $course->getId();
$courseCodeItem = $courseInfoItem['code']; $courseCodeItem = $course->getCode();
$isSubscribed = CourseManager::is_user_subscribed_in_course( $isSubscribed = CourseManager::is_user_subscribed_in_course(
$studentId, $studentId,
@ -357,8 +358,8 @@ switch ($action) {
$courseTable .= '<tr> $courseTable .= '<tr>
<td> <td>
<a href="'.$courseInfoItem['course_public_url'].'?id_session='.$sId.'">'. <a href="'.api_get_course_url($courseId).'?sid='.$sId.'">'.
$courseInfoItem['title'].'</a> $course->getTitle().'</a>
</td> </td>
<td >'.$time_spent_on_course.'</td> <td >'.$time_spent_on_course.'</td>
<td >'.$progress.'</td> <td >'.$progress.'</td>
@ -790,17 +791,17 @@ if (empty($sessionId)) {
if ($isSubscribedToCourse) { if ($isSubscribedToCourse) {
$avg_student_progress = Tracking::get_avg_student_progress( $avg_student_progress = Tracking::get_avg_student_progress(
$studentId, $studentId,
$courseCode, $course,
[], [],
$sessionId $session
); );
// the score inside the Reporting table // the score inside the Reporting table
$avg_student_score = Tracking::get_avg_student_score( $avg_student_score = Tracking::get_avg_student_score(
$studentId, $studentId,
$courseCode, $course,
[], [],
$sessionId $session
); );
} }
@ -1248,10 +1249,11 @@ if (empty($details)) {
$totalCourses = count($courses); $totalCourses = count($courses);
$scoreDisplay = ScoreDisplay::instance(); $scoreDisplay = ScoreDisplay::instance();
$session = api_get_session_entity($sId);
foreach ($courses as $courseId) { foreach ($courses as $courseId) {
$courseInfoItem = api_get_course_info_by_id($courseId); $course = api_get_course_entity($courseId);
$courseId = $courseInfoItem['real_id']; $courseId = $course->getId();
$courseCodeItem = $courseInfoItem['code']; $courseCodeItem = $course->getCode();
if (empty($session_info)) { if (empty($session_info)) {
$isSubscribed = CourseManager::is_user_subscribed_in_course( $isSubscribed = CourseManager::is_user_subscribed_in_course(
@ -1279,8 +1281,8 @@ if (empty($details)) {
// get average of faults in attendances by student // get average of faults in attendances by student
$results_faults_avg = $attendance->get_faults_average_by_course( $results_faults_avg = $attendance->get_faults_average_by_course(
$studentId, $studentId,
api_get_course_entity($courseId), $course,
api_get_session_entity($sId) $session
); );
$attendances_faults_avg = '0/0 (0%)'; $attendances_faults_avg = '0/0 (0%)';
@ -1288,9 +1290,9 @@ if (empty($details)) {
if (api_is_drh()) { if (api_is_drh()) {
$attendances_faults_avg = Display::url( $attendances_faults_avg = Display::url(
$results_faults_avg['faults'].'/'.$results_faults_avg['total'] $results_faults_avg['faults'].'/'.$results_faults_avg['total']
.' ('.$results_faults_avg['porcent'].'%)', .' ('.$results_faults_avg['percent'].'%)',
api_get_path(WEB_CODE_PATH) api_get_path(WEB_CODE_PATH)
.'attendance/index.php?cidReq='.$courseCodeItem.'&id_session='.$sId.'&student_id=' .'attendance/index.php?cid='.$courseId.'&sid='.$sId.'&student_id='
.$studentId, .$studentId,
['title' => get_lang('GoAttendance')] ['title' => get_lang('GoAttendance')]
); );
@ -1335,18 +1337,18 @@ if (empty($details)) {
$progress = Tracking::get_avg_student_progress( $progress = Tracking::get_avg_student_progress(
$studentId, $studentId,
$courseCodeItem, $course,
[], [],
$sId $session
); );
$totalProgress += $progress; $totalProgress += $progress;
$score = Tracking::get_avg_student_score( $score = Tracking::get_avg_student_score(
$studentId, $studentId,
$courseCodeItem, $course,
[], [],
$sId $session
); );
if (is_numeric($score)) { if (is_numeric($score)) {
@ -1358,7 +1360,7 @@ if (empty($details)) {
$csvRow = [ $csvRow = [
$session_name, $session_name,
$courseInfoItem['title'], $course->getTitle(),
$time_spent_on_course, $time_spent_on_course,
$progress, $progress,
$score, $score,
@ -1371,8 +1373,8 @@ if (empty($details)) {
echo '<tr> echo '<tr>
<td> <td>
<a href="'.$courseInfoItem['course_public_url'].'?id_session='.$sId.'">'. <a href="'.api_get_course_url($courseId).'?sid='.$sId.'">'.
$courseInfoItem['title'].' $course->getTitle().'
</a> </a>
</td> </td>
<td >'.$time_spent_on_course.'</td> <td >'.$time_spent_on_course.'</td>
@ -1383,12 +1385,12 @@ if (empty($details)) {
if (!empty($coachId)) { if (!empty($coachId)) {
echo '<td width="10"><a href="'.api_get_self().'?student='.$studentId echo '<td width="10"><a href="'.api_get_self().'?student='.$studentId
.'&details=true&course='.$courseInfoItem['code'].'&id_coach='.$coachId.'&origin='.$origin .'&details=true&course='.$courseCode.'&id_coach='.$coachId.'&origin='.$origin
.'&id_session='.$sId.'#infosStudent">' .'&id_session='.$sId.'#infosStudent">'
.Display::return_icon('2rightarrow.png', get_lang('Details')).'</a></td>'; .Display::return_icon('2rightarrow.png', get_lang('Details')).'</a></td>';
} else { } else {
echo '<td width="10"><a href="'.api_get_self().'?student='.$studentId echo '<td width="10"><a href="'.api_get_self().'?student='.$studentId
.'&details=true&course='.$courseInfoItem['code'].'&origin='.$origin.'&id_session='.$sId.'#infosStudent">' .'&details=true&course='.$courseCode.'&origin='.$origin.'&id_session='.$sId.'#infosStudent">'
.Display::return_icon('2rightarrow.png', get_lang('Details')).'</a></td>'; .Display::return_icon('2rightarrow.png', get_lang('Details')).'</a></td>';
} }
echo '</tr>'; echo '</tr>';

@ -16,6 +16,7 @@ if (null === $course) {
} }
$sessionId = api_get_session_id(); $sessionId = api_get_session_id();
$is_allowedToTrack = Tracking::isAllowToTrack($sessionId); $is_allowedToTrack = Tracking::isAllowToTrack($sessionId);
$session = api_get_session_entity($sessionId);
if (!$is_allowedToTrack) { if (!$is_allowedToTrack) {
api_not_allowed(true); api_not_allowed(true);
@ -844,9 +845,9 @@ if (!empty($groupList)) {
foreach ($usersInGroup as $studentId) { foreach ($usersInGroup as $studentId) {
$lpProgress = Tracking::get_avg_student_progress( $lpProgress = Tracking::get_avg_student_progress(
$usersInGroup, $usersInGroup,
$courseCode, $course,
[], [],
$sessionId $session
); );
$totalGroupLpProgress += $lpProgress; $totalGroupLpProgress += $lpProgress;
} }
@ -941,9 +942,9 @@ if (!empty($groupList)) {
foreach ($studentIdList as $studentId) { foreach ($studentIdList as $studentId) {
$lpProgress = Tracking::get_avg_student_progress( $lpProgress = Tracking::get_avg_student_progress(
$studentId, $studentId,
$courseCode, $course,
[], [],
$sessionId $session
); );
$totalLpProgress += $lpProgress; $totalLpProgress += $lpProgress;
} }

@ -6,10 +6,13 @@ declare(strict_types=1);
namespace Chamilo\CourseBundle\Repository; namespace Chamilo\CourseBundle\Repository;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\ResourceInterface; use Chamilo\CoreBundle\Entity\ResourceInterface;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Repository\ResourceRepository; use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Repository\ResourceWithLinkInterface; use Chamilo\CoreBundle\Repository\ResourceWithLinkInterface;
use Chamilo\CourseBundle\Entity\CLp; use Chamilo\CourseBundle\Entity\CLp;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Routing\RouterInterface; use Symfony\Component\Routing\RouterInterface;
@ -20,6 +23,27 @@ final class CLpRepository extends ResourceRepository implements ResourceWithLink
parent::__construct($registry, CLp::class); parent::__construct($registry, CLp::class);
} }
public function findAllByCourse(
Course $course,
Session $session = null,
?string $title = null,
?int $active = null,
bool $onlyPublished = true,
?int $categoryId = null
): QueryBuilder {
$qb = $this->getResourcesByCourse($course, $session);
/*if ($onlyPublished) {
$this->addDateFilterQueryBuilder(new DateTime(), $qb);
}*/
//$this->addCategoryQueryBuilder($categoryId, $qb);
//$this->addActiveQueryBuilder($active, $qb);
//$this->addNotDeletedQueryBuilder($qb);
$this->addTitleQueryBuilder($title, $qb);
return $qb;
}
public function getLink(ResourceInterface $resource, RouterInterface $router, array $extraParams = []): string public function getLink(ResourceInterface $resource, RouterInterface $router, array $extraParams = []): string
{ {
$params = [ $params = [
@ -33,4 +57,13 @@ final class CLpRepository extends ResourceRepository implements ResourceWithLink
return $router->generate('legacy_main', $params); return $router->generate('legacy_main', $params);
} }
private function addNotDeletedQueryBuilder(QueryBuilder $qb = null): QueryBuilder
{
$qb = $this->getOrCreateQueryBuilder($qb);
$qb->andWhere('resource.active <> -1');
return $qb;
}
} }

Loading…
Cancel
Save