Update from 1.11.x

pull/3741/head
Julio Montoya 5 years ago
parent 05e539203f
commit 15a1589024
  1. 23
      public/main/inc/lib/tracking.lib.php
  2. 286
      public/main/inc/lib/usergroup.lib.php
  3. 11
      public/main/lp/lp_report.php
  4. 15
      public/main/mySpace/myStudents.php

@ -2108,6 +2108,29 @@ class Tracking
return false;
}
public static function getLastConnectionInAnyCourse($studentId)
{
$studentId = (int) $studentId;
if (empty($studentId)) {
return false;
}
$table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
$sql = "SELECT logout_course_date
FROM $table
WHERE user_id = $studentId
ORDER BY logout_course_date DESC
LIMIT 1";
$result = Database::query($sql);
if (Database::num_rows($result)) {
$row = Database::fetch_array($result);
return $row['logout_course_date'];
}
return false;
}
/**
* Get last course access by course/session.
*/

@ -30,15 +30,15 @@ class UserGroup extends Model
public $showGroupTypeSetting = false;
public $usergroup_rel_user_table;
public $usergroup_rel_course_table;
public $usergroup;
public $usergroup_rel_session_table;
public $session_table;
public $access_url_rel_usergroup;
public $session_rel_course_table;
public $access_url_rel_user;
public $table_course;
public $table_user;
/**
* Set ups DB tables.
*/
public function __construct()
{
parent::__construct();
@ -46,7 +46,10 @@ class UserGroup extends Model
$this->usergroup_rel_user_table = Database::get_main_table(TABLE_USERGROUP_REL_USER);
$this->usergroup_rel_course_table = Database::get_main_table(TABLE_USERGROUP_REL_COURSE);
$this->usergroup_rel_session_table = Database::get_main_table(TABLE_USERGROUP_REL_SESSION);
$this->session_table = Database::get_main_table(TABLE_MAIN_SESSION);
$this->usergroup_table = Database::get_main_table(TABLE_USERGROUP);
$this->access_url_rel_usergroup = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USERGROUP);
$this->session_rel_course_table = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
$this->access_url_rel_user = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$this->table_course = Database::get_main_table(TABLE_MAIN_COURSE);
$this->table_user = Database::get_main_table(TABLE_MAIN_USER);
@ -218,7 +221,7 @@ class UserGroup extends Model
INNER JOIN $this->access_url_rel_usergroup a
ON (u.id = a.usergroup_id)
WHERE access_url_id = $urlId $authorCondition
$extraWhereCondition
AND $extraWhereCondition
";
$result = Database::query($sql);
@ -437,19 +440,78 @@ class UserGroup extends Model
}
/**
* Gets all users that are part of a group or class.
*
* Example to obtain the number of registered:
* <code>
* <?php
*
* $options['where'] = [' usergroup.course_id = ? ' => $course_id];
* $obj = new UserGroup();
* $count = $obj->getUserGroupInCourse(
* $options,
* -1,
* true,
* true
* );
* echo "<pre>".var_export($count,true)."</pre>";
* ?>
* </code>
*
*
* Example to obtain the list of classes or groups registered:
* <code>
* <?php
*
* $options['where'] = [' usergroup.course_id = ? ' => $course_id];
* $obj = new UserGroup();
* $students = $obj->getUserGroupInCourse(
* $options,
* -1,
* false,
* true
* );
* echo "<pre>".var_export($students,true)."</pre>";
* ?>
* </code>
*
* @param array $options
* @param int $type
* @param int $type 0 = classes / 1 = social groups
* @param bool $withClasses Return with classes.
*
* @return array
*/
public function getUserGroupInCourse($options = [], $type = -1, $getCount = false)
{
public function getUserGroupInCourse(
$options = [],
$type = -1,
$getCount = false,
$withClasses = false
) {
$data = [];
$sqlClasses = '';
$whereClasess = '';
$resultClasess = null;
$counts = 0;
$select = 'DISTINCT u.*';
if ($getCount) {
$select = 'count(u.id) as count';
}
if (
$withClasses == true &&
isset($options['session_id']) &&
(int) $options['session_id'] != 0
) {
$sessionId = (int) $options['session_id'];
$courseId = (int) $options['course_id'];
unset($options['session_id']);
$whereClasess = " WHERE ur.session_id = $sessionId AND sc.c_id = $courseId ";
} else {
$withClasses = false;
}
if ($this->getUseMultipleUrl()) {
if ($withClasses != true) {
$sql = "SELECT $select
FROM {$this->usergroup_rel_course_table} usergroup
INNER JOIN {$this->table} u
@ -460,6 +522,18 @@ class UserGroup extends Model
ON (a.usergroup_id = u.id)
";
} else {
$sqlClasses = "SELECT".
" $select ".
" FROM".
" {$this->usergroup_rel_session_table} ur".
" INNER JOIN {$this->usergroup_table} u ON u.id = ur.usergroup_id ".
" INNER JOIN `{$this->session_table}` s ON s.id = ur.session_id".
" INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id = u.id) ".
" INNER JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ".
" $whereClasess ";
}
} else {
if ($withClasses != true) {
$sql = "SELECT $select
FROM {$this->usergroup_rel_course_table} usergroup
INNER JOIN {$this->table} u
@ -467,8 +541,18 @@ class UserGroup extends Model
INNER JOIN {$this->table_course} c
ON (usergroup.course_id = c.id)
";
} else {
$sqlClasses = "SELECT".
" $select ".
" FROM".
" {$this->usergroup_rel_session_table} ur".
" INNER JOIN {$this->usergroup_table} u ON u.id = ur.usergroup_id ".
" INNER JOIN `{$this->session_table}` s ON s.id = ur.session_id".
" INNER JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ".
" $whereClasess ";
}
}
if (-1 != $type) {
$type = (int) $type;
$options['where']['AND group_type = ? '] = $type;
@ -479,32 +563,66 @@ class UserGroup extends Model
}
$conditions = Database::parse_conditions($options);
if ($withClasses == true) {
$resultClasess = Database::query($sqlClasses);
} else {
$sql .= $conditions;
$result = Database::query($sql);
}
if ($getCount) {
if (!empty($result)) {
if (Database::num_rows($result)) {
$row = Database::fetch_array($result);
$counts += $row['count'];
}
}
if (!empty($sqlClasses)) {
if (Database::num_rows($resultClasess)) {
$row = Database::fetch_array($resultClasess);
$counts += $row['count'];
}
}
return $row['count'];
return $counts;
}
if (!empty($result)) {
if (Database::num_rows($result) > 0) {
while ($row = Database::fetch_array($result, 'ASSOC')) {
$data[] = $row;
}
}
}
if (!empty($sqlClasses)) {
if (Database::num_rows($resultClasess) > 0) {
while ($row = Database::fetch_array($resultClasess, 'ASSOC')) {
$data[] = $row;
}
}
}
$array = Database::store_result($result, 'ASSOC');
return $array;
return $data;
}
/**
* @param array $options
* @param int $type
* @param bool $getCount
* @param bool $withClasses
*
* @return array|bool
*/
public function getUserGroupNotInCourse($options = [], $type = -1, $getCount = false)
{
public function getUserGroupNotInCourse(
$options = [],
$type = -1,
$getCount = false,
$withClasses = false
) {
$data = [];
$sqlClasses = '';
$whereClasess = '';
$resultClasess = null;
$course_id = null;
if (isset($options['course_id'])) {
$course_id = (int) $options['course_id'];
@ -520,7 +638,20 @@ class UserGroup extends Model
$select = 'count(u.id) as count';
}
if (
$withClasses == true &&
isset($options['session_id']) &&
(int) $options['session_id'] != 0
) {
$sessionId = (int) $options['session_id'];
unset($options['session_id']);
$whereClasess = " WHERE ur.session_id != $sessionId ";
} else {
$withClasses = false;
}
if ($this->getUseMultipleUrl()) {
if ($withClasses == false) {
$sql = "SELECT $select
FROM {$this->table} u
INNER JOIN {$this->access_url_rel_usergroup} a
@ -529,11 +660,33 @@ class UserGroup extends Model
ON (u.id = urc.usergroup_id AND course_id = $course_id)
";
} else {
$sqlClasses = " SELECT".
" $select".
" FROM".
" {$this->usergroup_rel_session_table} ur".
" LEFT OUTER JOIN {$this->usergroup_table} u ON u.id = ur.usergroup_id".
" INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id = u.id) ".
" LEFT JOIN `{$this->session_table}` s ON s.id = ur.session_id".
" LEFT JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ".
" $whereClasess ";
}
} else {
if ($withClasses == false) {
$sql = "SELECT $select
FROM {$this->table} u
LEFT OUTER JOIN {$this->usergroup_rel_course_table} urc
ON (u.id = urc.usergroup_id AND course_id = $course_id)
";
} else {
$sqlClasses = " SELECT".
" $select".
" FROM".
" {$this->usergroup_rel_session_table} ur".
" LEFT OUTER JOIN {$this->usergroup_table} u ON u.id = ur.usergroup_id".
" LEFT JOIN `{$this->session_table}` s ON s.id = ur.session_id".
" LEFT JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ".
" $whereClasess ";
}
}
if (-1 != $type) {
@ -554,18 +707,44 @@ class UserGroup extends Model
$conditions = Database::parse_conditions($options);
if ($withClasses == true) {
$resultClasess = Database::query($sqlClasses);
} else {
$sql .= $conditions;
$result = Database::query($sql);
}
if ($getCount) {
if (!empty($result)) {
$result = Database::query($sql);
$array = Database::fetch_array($result, 'ASSOC');
return $array['count'];
}
$result = Database::query($sql);
$array = Database::store_result($result, 'ASSOC');
if (!empty($sqlClasses)) {
if (Database::num_rows($resultClasess)) {
$row = Database::fetch_array($resultClasess);
return $array;
return $row['count'];
}
}
}
if (!empty($result)) {
if (Database::num_rows($result) > 0) {
while ($row = Database::fetch_array($result, 'ASSOC')) {
$data[] = $row;
}
}
}
if (!empty($sqlClasses)) {
if (Database::num_rows($resultClasess) > 0) {
while ($row = Database::fetch_array($resultClasess, 'ASSOC')) {
$data[] = $row;
}
}
}
return $data;
}
/**
@ -612,15 +791,28 @@ class UserGroup extends Model
*
* @return bool
*/
public function usergroup_was_added_in_course($usergroup_id, $course_id)
{
public function usergroup_was_added_in_course(
$usergroup_id,
$course_id,
$Session = 0
) {
$Session = (int) $Session;
$results = Database::select(
'usergroup_id',
$this->usergroup_rel_course_table,
['where' => ['course_id = ? AND usergroup_id = ?' => [$course_id, $usergroup_id]]]
);
if (empty($results)) {
$resultSession = Database::select(
'usergroup_id',
$this->usergroup_rel_session_table,
['where' => ['session_id = ? AND usergroup_id = ?' => [$Session, $usergroup_id]]]
);
if (empty($results) && $Session == 0) {
return false;
}
if ((empty($resultSession)) && $Session != 0) {
return false;
}
@ -943,12 +1135,14 @@ class UserGroup extends Model
* @param int $usergroup_id
* @param array $delete_items
*/
public function unsubscribe_courses_from_usergroup($usergroup_id, $delete_items)
public function unsubscribe_courses_from_usergroup($usergroup_id, $delete_items, $sessionId = 0)
{
$sessionId = (int) $sessionId;
// Deleting items.
if (!empty($delete_items)) {
$user_list = $this->get_users_by_usergroup($usergroup_id);
$groupId = isset($_GET['id']) ? (int) $_GET['id'] : 0;
foreach ($delete_items as $course_id) {
$course_info = api_get_course_info_by_id($course_id);
if ($course_info) {
@ -956,7 +1150,8 @@ class UserGroup extends Model
foreach ($user_list as $user_id) {
CourseManager::unsubscribe_user(
$user_id,
$course_info['code']
$course_info['code'],
$sessionId
);
}
}
@ -971,6 +1166,11 @@ class UserGroup extends Model
]
);
}
if ($sessionId != 0 && $groupId != 0) {
$this->subscribe_sessions_to_usergroup($groupId, [0]);
} else {
$s = $sessionId;
}
}
}
}
@ -1613,10 +1813,11 @@ class UserGroup extends Model
* Get user list by usergroup.
*
* @param int $id
* @param string $orderBy
*
* @return array
*/
public function getUserListByUserGroup($id)
public function getUserListByUserGroup($id, $orderBy = '')
{
$id = (int) $id;
$sql = "SELECT u.* FROM $this->table_user u
@ -1624,6 +1825,10 @@ class UserGroup extends Model
ON c.user_id = u.id
WHERE c.usergroup_id = $id"
;
if (!empty($orderBy)) {
$orderBy = Database::escape_string($orderBy);
$sql .= " ORDER BY $orderBy ";
}
$result = Database::query($sql);
return Database::store_result($result);
@ -2935,4 +3140,41 @@ class UserGroup extends Model
api_protect_limit_for_session_admin();
}
}
public function getGroupsByLp($lpId, $courseId, $sessionId)
{
$lpId = (int) $lpId;
$courseId = (int) $courseId;
$sessionId = (int) $sessionId;
$sessionCondition = api_get_session_condition($sessionId, true);
$table = Database::get_course_table(TABLE_LP_REL_USERGROUP);
$sql = "SELECT usergroup_id FROM $table
WHERE
c_id = $courseId AND
lp_id = $lpId
$sessionCondition
";
$result = Database::query($sql);
return Database::store_result($result, 'ASSOC');
}
public function getGroupsByLpCategory($categoryId, $courseId, $sessionId)
{
$categoryId = (int) $categoryId;
$courseId = (int) $courseId;
$sessionId = (int) $sessionId;
$sessionCondition = api_get_session_condition($sessionId, true);
$table = Database::get_course_table(TABLE_LP_CATEGORY_REL_USERGROUP);
$sql = "SELECT usergroup_id FROM $table
WHERE
c_id = $courseId AND
lp_category_id = $categoryId
$sessionCondition
";
$result = Database::query($sql);
return Database::store_result($result, 'ASSOC');
}
}

@ -2,7 +2,6 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Repository\ItemPropertyRepository;
use Chamilo\CourseBundle\Entity\CLpCategory;
/**
@ -37,7 +36,11 @@ if (!empty($groupFilterParts) && isset($groupFilterParts[1])) {
$export = isset($_REQUEST['export']);
$reset = isset($_REQUEST['reset']) ? $_REQUEST['reset'] : '';
$lp = new learnpath($courseCode, $lpId, api_get_user_id());
$lpRepo = \Chamilo\CoreBundle\Framework\Container::getLpRepository();
/** @var \Chamilo\CourseBundle\Entity\CLp $entity */
$entity = $lpRepo->find($lpId);
$lp = new learnpath($entity, $courseInfo, api_get_user_id());
if (empty($lp)) {
api_not_allowed(true);
}
@ -342,7 +345,7 @@ if (!empty($users)) {
}
}
}
$trackingUrl = api_get_path(WEB_CODE_PATH).'mySpace/myStudents.php?details=true'.
$trackingUrl = api_get_path(WEB_CODE_PATH).'mySpace/myStudents.php?details=true&'.
api_get_cidreq().'&course='.$courseCode.'&origin=tracking_course&student='.$userId;
$row = [];
$row[] = Display::url($userInfo['firstname'], $trackingUrl);
@ -454,8 +457,6 @@ $template->assign('export', (int) $export);
$template->assign('group_form', $groupFilterForm);
$template->assign('url', $url);
$template->assign('url_base', $urlBase);
$layout = $template->get_template('learnpath/report.tpl');
$template->assign('header', $lpInfo['name']);
$template->assign('actions', Display::toolbarAction('lp_actions', [$actions]));
$result = $template->fetch('@ChamiloCore/LearnPath/report.html.twig');

@ -922,11 +922,15 @@ if (is_numeric($avg_student_score)) {
$score = $avg_student_score;
}
$userInfo['student_score'] = $score;
$userInfo['student_progress'] = $avg_student_progress;
$userInfo['student_score'] = (float) $score;
$userInfo['student_progress'] = (float) $avg_student_progress;
$userInfo['first_connection'] = $first_connection_date;
$userInfo['last_connection'] = $last_connection_date;
if ('true' === $details) {
$userInfo['last_connection_in_course'] = api_format_date(
Tracking::getLastConnectionInAnyCourse($user_info['user_id']),
DATE_FORMAT_SHORT
);
if ($details === 'true') {
$userInfo['time_spent_course'] = $time_spent_on_the_course;
}
@ -1055,6 +1059,7 @@ if (isset($_GET['action']) and 'all_attendance' == $_GET['action']) {
<tbody>';
foreach ($data as $attendanceData => $attendanceSheet) {
// $attendanceData can be in_category or not_category for courses
$totalAttendance = count($attendanceSheet);
for ($i = 0; $i < $totalAttendance; $i++) {
$attendanceWork = $attendanceSheet[$i];
@ -1066,7 +1071,6 @@ if (isset($_GET['action']) and 'all_attendance' == $_GET['action']) {
// get session name
$printSession = "(".$attendanceWork['sessionName'].")";
}
// $teacher = isset($attendanceWork['teacher'])?$attendanceWork['teacher']:'';
echo '
<tr>
<td>'.$date.'</td>
@ -1127,7 +1131,6 @@ if (!empty($courseInfo)) {
} else {
$details = false;
}
$tpl->assign('user', $userInfo);
$tpl->assign('details', $details);
$templateName = $tpl->get_template('my_space/user_details.tpl');
@ -2112,7 +2115,7 @@ if (empty($details)) {
</thead>
<tbody>
';
$workingTime = api_get_configuration_value('considered_working_time');
foreach ($userWorks as $work) {
$work = $work['work'];
$showOnce = true;

Loading…
Cancel
Save