Update from 1.11.x

pull/3696/head
Julio Montoya 5 years ago
parent a02707f649
commit b8fadda865
  1. 10
      public/main/admin/user_edit.php
  2. 15
      public/main/auth/courses.php
  3. 52
      public/main/auth/inscription.php
  4. 30
      public/main/exercise/TestCategory.php
  5. 57
      public/main/inc/lib/CoursesAndSessionsCatalog.class.php
  6. 41
      public/main/inc/lib/TicketManager.php
  7. 76
      public/main/inc/lib/api.lib.php
  8. 15
      public/main/inc/lib/auth.lib.php
  9. 2
      public/main/inc/lib/chat.lib.php
  10. 2
      public/main/inc/lib/conditional_login.class.php
  11. 137
      public/main/inc/lib/course.lib.php
  12. 33
      public/main/inc/lib/course_category.lib.php
  13. 26
      public/main/inc/lib/plugin.lib.php

@ -459,16 +459,12 @@ if ($form->validate()) {
$currentUserId = api_get_user_id(); $currentUserId = api_get_user_id();
$userObj = api_get_user_entity($user_id);
UserManager::add_user_as_admin($userObj);
if ($user_id != $currentUserId) { if ($user_id != $currentUserId) {
if (1 == $platform_admin) {
$userObj = api_get_user_entity($user_id); $userObj = api_get_user_entity($user_id);
UserManager::add_user_as_admin($userObj); if ($platform_admin == 1) {
UserManager::addUserAsAdmin($userObj);
} else { } else {
UserManager::remove_user_admin($user_id); UserManager::removeUserAdmin($userObj);
} }
} }

@ -108,7 +108,7 @@ switch ($action) {
case 'subscribe_course': case 'subscribe_course':
if (api_is_anonymous()) { if (api_is_anonymous()) {
//header('Location: '.api_get_path(WEB_CODE_PATH).'auth/inscription.php?c='.$courseCodeToSubscribe); //header('Location: '.api_get_path(WEB_CODE_PATH).'auth/inscription.php?c='.$courseCodeToSubscribe);
header('Location: '.api_get_path(WEB_CODE_PATH).'auth/inscription.php'); header('Location: '.api_get_path(WEB_CODE_PATH).'auth/inscription.php?c='.$courseCodeToSubscribe);
exit; exit;
} }
$courseCodeToSubscribe = isset($_GET['course_code']) ? Security::remove_XSS($_GET['course_code']) : ''; $courseCodeToSubscribe = isset($_GET['course_code']) ? Security::remove_XSS($_GET['course_code']) : '';
@ -519,8 +519,9 @@ switch ($action) {
$courseUrl.$course['directory'].'/index.php?id_session=0', $courseUrl.$course['directory'].'/index.php?id_session=0',
['class' => 'btn btn-primary'] ['class' => 'btn btn-primary']
); );
if (!$courseClosed) { if (!$courseClosed && $course_unsubscribe_allowed &&
if ($course_unsubscribe_allowed) { false === $userRegisteredInCourseAsTeacher
) {
$course['unregister_formatted'] = CoursesAndSessionsCatalog::return_unregister_button( $course['unregister_formatted'] = CoursesAndSessionsCatalog::return_unregister_button(
$course, $course,
$stok, $stok,
@ -528,17 +529,16 @@ switch ($action) {
$categoryCode $categoryCode
); );
} }
}
} elseif ($userRegisteredInCourseAsTeacher) { } elseif ($userRegisteredInCourseAsTeacher) {
// if user registered as teacher // if user registered as teacher
if ($course_unsubscribe_allowed) { /*if ($course_unsubscribe_allowed) {
$course['unregister_formatted'] = CoursesAndSessionsCatalog::return_unregister_button( $course['unregister_formatted'] = CoursesAndSessionsCatalog::return_unregister_button(
$course, $course,
$stok, $stok,
$searchTerm, $searchTerm,
$categoryCode $categoryCode
); );
} }*/
} else { } else {
// if user not registered in the course // if user not registered in the course
if (!$courseClosed) { if (!$courseClosed) {
@ -624,7 +624,8 @@ switch ($action) {
$requirementsData = $repository->checkRequirementsForUser( $requirementsData = $repository->checkRequirementsForUser(
$sequences, $sequences,
SequenceResource::SESSION_TYPE, SequenceResource::SESSION_TYPE,
$userId $userId,
$sessionId
); );
$continueWithSubscription = $repository->checkSequenceAreCompleted($requirementsData); $continueWithSubscription = $repository->checkSequenceAreCompleted($requirementsData);

@ -121,6 +121,10 @@ if (false === $user_already_registered_show_terms &&
} }
} }
$LastnameLabel = get_lang('LastName');
if (api_get_configuration_value('registration_add_helptext_for_2_names') == true) {
$LastnameLabel = [$LastnameLabel, get_lang('InsertTwoNames')];
}
if (api_is_western_name_order()) { if (api_is_western_name_order()) {
// FIRST NAME and LAST NAME // FIRST NAME and LAST NAME
$form->addElement('text', 'firstname', get_lang('First name'), ['size' => 40]); $form->addElement('text', 'firstname', get_lang('First name'), ['size' => 40]);
@ -796,52 +800,10 @@ if ($form->validate()) {
/* If the account has to be approved then we set the account to inactive, /* If the account has to be approved then we set the account to inactive,
sent a mail to the platform admin and exit the page.*/ sent a mail to the platform admin and exit the page.*/
if ('approval' === api_get_setting('allow_registration')) { if (api_get_setting('allow_registration') === 'approval') {
// 1. Send mail to all platform admin // 1. Send mail to all platform admin
$emailsubject = get_lang('Approval for new account').': '.$values['username']; $chamiloUser = api_get_user_entity($user_id);
$emailbody = get_lang('Approval for new account')."\n"; MessageManager::sendNotificationOfNewRegisteredUserApproval($chamiloUser);
$emailbody .= get_lang('Username').': '.$values['username']."\n";
if (api_is_western_name_order()) {
$emailbody .= get_lang('First name').': '.$values['firstname']."\n";
$emailbody .= get_lang('Last name').': '.$values['lastname']."\n";
} else {
$emailbody .= get_lang('Last name').': '.$values['lastname']."\n";
$emailbody .= get_lang('First name').': '.$values['firstname']."\n";
}
$emailbody .= get_lang('e-mail').': '.$values['email']."\n";
$emailbody .= get_lang('Status').': '.$values['status']."\n\n";
$url_edit = Display::url(
api_get_path(WEB_CODE_PATH).'admin/user_edit.php?user_id='.$user_id,
api_get_path(WEB_CODE_PATH).'admin/user_edit.php?user_id='.$user_id
);
$emailbody .= get_lang('Manage user').": $url_edit";
if (api_get_configuration_value('send_inscription_notification_to_general_admin_only')) {
$email = api_get_setting('emailAdministrator');
$firtname = api_get_setting('administratorSurname');
$lastname = api_get_setting('administratorName');
api_mail_html("$firtname $lastname", $email, $emailsubject, $emailbody);
} else {
$admins = UserManager::get_all_administrators();
foreach ($admins as $admin_info) {
MessageManager::send_message(
$admin_info['user_id'],
$emailsubject,
$emailbody,
[],
[],
null,
null,
null,
null,
$user_id
);
}
}
// 2. set account inactive // 2. set account inactive
UserManager::disable($user_id); UserManager::disable($user_id);

@ -647,36 +647,6 @@ class TestCategory
return $content; return $content;
} }
/**
* Return the category name for question with question_id = $questionId
* In this version, a question has only 1 category.
*
* @param $questionId
* @param int $courseId
*
* @return string
*/
public static function getCategoryNameForQuestion($questionId, $courseId = 0)
{
if (empty($courseId)) {
$courseId = api_get_course_int_id();
}
$courseId = (int) $courseId;
$categoryId = self::getCategoryForQuestion($questionId, $courseId);
$table = Database::get_course_table(TABLE_QUIZ_QUESTION_CATEGORY);
$sql = "SELECT title
FROM $table
WHERE iid = $categoryId ";
$res = Database::query($sql);
$data = Database::fetch_array($res);
$result = '';
if (Database::num_rows($res) > 0) {
$result = $data['title'];
}
return $result;
}
/** /**
* sortTabByBracketLabel ($tabCategoryQuestions) * sortTabByBracketLabel ($tabCategoryQuestions)
* key of $tabCategoryQuestions are the category id (0 for not in a category) * key of $tabCategoryQuestions are the category id (0 for not in a category)

@ -176,17 +176,25 @@ class CoursesAndSessionsCatalog
]; ];
$allCategories = CourseCategory::getAllCategories(); $allCategories = CourseCategory::getAllCategories();
$categoryToAvoid = '';
if (api_is_student()) {
$categoryToAvoid = api_get_configuration_value('course_category_code_to_use_as_model');
}
foreach ($allCategories as $category) { foreach ($allCategories as $category) {
$categoryCode = $category['code'];
if (!empty($categoryToAvoid) && $categoryToAvoid == $categoryCode) {
continue;
}
if (empty($category['parent_id'])) { if (empty($category['parent_id'])) {
$list[$category['code']] = $category; $list[$categoryCode] = $category;
$list[$category['code']]['level'] = 0; $list[$categoryCode]['level'] = 0;
list($subList, $childrenCount) = self::buildCourseCategoryTree($allCategories, $category['code'], 0); list($subList, $childrenCount) = self::buildCourseCategoryTree($allCategories, $categoryCode, 0);
foreach ($subList as $item) { foreach ($subList as $item) {
$list[$item['code']] = $item; $list[$item['code']] = $item;
} }
// Real course count // Real course count
$countCourses = CourseCategory::countCoursesInCategory($category['code']); $countCourses = CourseCategory::countCoursesInCategory($categoryCode);
$list[$category['code']]['number_courses'] = $childrenCount + $countCourses; $list[$categoryCode]['number_courses'] = $childrenCount + $countCourses;
} }
} }
@ -1155,21 +1163,27 @@ class CoursesAndSessionsCatalog
/** /**
* Display the unregister button of a course in the course catalog. * Display the unregister button of a course in the course catalog.
* *
* @param $course * @param array $course
* @param $stok * @param string $stok
* @param $search_term * @param string $search_term
* @param $categoryCode * @param string $categoryCode
* @param int $sessionId
* *
* @return string * @return string
*/ */
public static function return_unregister_button($course, $stok, $search_term, $categoryCode) public static function return_unregister_button($course, $stok, $search_term, $categoryCode, $sessionId = 0)
{ {
$title = get_lang('Unsubscription'); $title = get_lang('Unsubscription');
$search_term = Security::remove_XSS($search_term);
$categoryCode = Security::remove_XSS($categoryCode);
$sessionId = (int) $sessionId;
$url = api_get_self().'?action=unsubscribe&sec_token='.$stok.'&sid='.$sessionId.'&course_code='.$course['code'].
'&search_term='.$search_term.'&category_code='.$categoryCode;
return Display::url( return Display::url(
Display::returnFontAwesomeIcon('sign-in').' '.$title, Display::returnFontAwesomeIcon('sign-in').' '.$title,
api_get_self().'?action=unsubscribe&sec_token='.$stok $url,
.'&course_code='.$course['code'].'&search_term='.$search_term.'&category_code='.$categoryCode,
['class' => 'btn btn-danger', 'title' => $title, 'aria-label' => $title] ['class' => 'btn btn-danger', 'title' => $title, 'aria-label' => $title]
); );
} }
@ -1195,14 +1209,13 @@ class CoursesAndSessionsCatalog
) { ) {
$sessionId = (int) $sessionId; $sessionId = (int) $sessionId;
$class = 'btn-sm';
if ($btnBing) { if ($btnBing) {
$btnBing = 'btn-lg btn-block'; $class = 'btn-lg btn-block';
} else {
$btnBing = 'btn-sm';
} }
if ($checkRequirements) { if ($checkRequirements) {
return self::getRequirements($sessionId, SequenceResource::SESSION_TYPE, $includeText, $btnBing); return self::getRequirements($sessionId, SequenceResource::SESSION_TYPE, $includeText, $class);
} }
$catalogSessionAutoSubscriptionAllowed = false; $catalogSessionAutoSubscriptionAllowed = false;
@ -1225,7 +1238,7 @@ class CoursesAndSessionsCatalog
'pencil', 'pencil',
'primary', 'primary',
[ [
'class' => $btnBing.' ajax', 'class' => $class.' ajax',
'data-title' => get_lang('AreYouSureToSubscribe'), 'data-title' => get_lang('AreYouSureToSubscribe'),
'data-size' => 'md', 'data-size' => 'md',
'title' => get_lang('Subscribe'), 'title' => get_lang('Subscribe'),
@ -1244,7 +1257,7 @@ class CoursesAndSessionsCatalog
$url, $url,
'pencil', 'pencil',
'primary', 'primary',
['class' => $btnBing], ['class' => $class],
$includeText $includeText
); );
} }
@ -1264,18 +1277,18 @@ class CoursesAndSessionsCatalog
return $result; return $result;
} }
public static function getRequirements($id, $type, $includeText, $btnBing) public static function getRequirements($id, $type, $includeText, $class, $sessionId = 0)
{ {
$id = (int) $id; $id = (int) $id;
$type = (int) $type; $type = (int) $type;
$url = api_get_path(WEB_AJAX_PATH); $url = api_get_path(WEB_AJAX_PATH).'sequence.ajax.php?';
$url .= 'sequence.ajax.php?';
$url .= http_build_query( $url .= http_build_query(
[ [
'a' => 'get_requirements', 'a' => 'get_requirements',
'id' => $id, 'id' => $id,
'type' => $type, 'type' => $type,
'sid' => $sessionId,
] ]
); );
@ -1285,7 +1298,7 @@ class CoursesAndSessionsCatalog
'shield', 'shield',
'info', 'info',
[ [
'class' => $btnBing.' ajax', 'class' => $class.' ajax',
'data-title' => get_lang('CheckRequirements'), 'data-title' => get_lang('CheckRequirements'),
'data-size' => 'md', 'data-size' => 'md',
'title' => get_lang('CheckRequirements'), 'title' => get_lang('CheckRequirements'),

@ -285,6 +285,8 @@ class TicketManager
* @param string $priority * @param string $priority
* @param string $status * @param string $status
* @param int $assignedUserId * @param int $assignedUserId
* @param int $exerciseId
* @param int $lpId
* *
* @return bool * @return bool
*/ */
@ -301,7 +303,9 @@ class TicketManager
$source = '', $source = '',
$priority = '', $priority = '',
$status = '', $status = '',
$assignedUserId = 0 $assignedUserId = 0,
$exerciseId = null,
$lpId = null
) { ) {
$table_support_tickets = Database::get_main_table(TABLE_TICKET_TICKET); $table_support_tickets = Database::get_main_table(TABLE_TICKET_TICKET);
$table_support_category = Database::get_main_table(TABLE_TICKET_CATEGORY); $table_support_category = Database::get_main_table(TABLE_TICKET_CATEGORY);
@ -365,6 +369,13 @@ class TicketManager
'total_messages' => 0, 'total_messages' => 0,
]; ];
if (!empty($exerciseId)) {
$params['exercise_id'] = $exerciseId;
}
if (!empty($lpId)) {
$params['lp_id'] = $lpId;
}
if (!empty($course_id)) { if (!empty($course_id)) {
$params['course_id'] = $course_id; $params['course_id'] = $course_id;
} }
@ -1205,6 +1216,34 @@ class TicketManager
if ($course) { if ($course) {
$row['course_url'] = '<a href="'.$course['course_public_url'].'?id_session='.$sessionId.'">'.$course['name'].'</a>'; $row['course_url'] = '<a href="'.$course['course_public_url'].'?id_session='.$sessionId.'">'.$course['name'].'</a>';
} }
$row['exercise_url'] = null;
if (!empty($row['exercise_id'])) {
$exerciseTitle = ExerciseLib::getExerciseTitleById($row['exercise_id']);
$dataExercise = [
'cidReq' => $course['code'],
'id_session' => $sessionId,
'exerciseId' => $row['exercise_id'],
];
$urlParamsExercise = http_build_query($dataExercise);
$row['exercise_url'] = '<a href="'.api_get_path(WEB_CODE_PATH).'exercise/overview.php?'.$urlParamsExercise.'">'.$exerciseTitle.'</a>';
}
$row['lp_url'] = null;
if (!empty($row['lp_id'])) {
$lpName = learnpath::getLpNameById($row['lp_id']);
$dataLp = [
'cidReq' => $course['code'],
'id_session' => $sessionId,
'lp_id' => $row['lp_id'],
'action' => 'view',
];
$urlParamsLp = http_build_query($dataLp);
$row['lp_url'] = '<a href="'.api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.$urlParamsLp.'">'.$lpName.'</a>';
}
} }
$userInfo = api_get_user_info($row['sys_insert_user_id']); $userInfo = api_get_user_info($row['sys_insert_user_id']);

@ -165,6 +165,7 @@ define('SECTION_DASHBOARD', 'dashboard');
define('SECTION_REPORTS', 'reports'); define('SECTION_REPORTS', 'reports');
define('SECTION_GLOBAL', 'global'); define('SECTION_GLOBAL', 'global');
define('SECTION_INCLUDE', 'include'); define('SECTION_INCLUDE', 'include');
define('SECTION_CUSTOMPAGE', 'custompage');
// CONSTANT name for local authentication source // CONSTANT name for local authentication source
define('PLATFORM_AUTH_SOURCE', 'platform'); define('PLATFORM_AUTH_SOURCE', 'platform');
@ -1102,7 +1103,7 @@ function api_protect_course_script($print_headers = false, $allow_session_admins
} }
} }
apiBlockInactiveUser(); api_block_inactive_user();
return true; return true;
} }
@ -1128,10 +1129,68 @@ function api_protect_admin_script($allow_sessions_admins = false, $allow_drh = f
return false; return false;
} }
api_block_inactive_user();
return true; return true;
} }
/**
* Blocks inactive users with a currently active session from accessing more pages "live".
*
* @return bool Returns true if the feature is disabled or the user account is still enabled.
* Returns false (and shows a message) if the feature is enabled *and* the user is disabled.
*/
function api_block_inactive_user()
{
$data = true;
if (api_get_configuration_value('security_block_inactive_users_immediately') != 1) {
return $data;
}
$userId = api_get_user_id();
$homeUrl = api_get_path(WEB_PATH);
if ($userId == 0) {
return $data;
}
$sql = "SELECT active FROM ".Database::get_main_table(TABLE_MAIN_USER)."
WHERE id = $userId";
$result = Database::query($sql);
if (Database::num_rows($result) > 0) {
$result_array = Database::fetch_array($result);
$data = (bool) $result_array['active'];
}
if ($data == false) {
$tpl = new Template(null, true, true, false, true, false, true, 0);
$tpl->assign('hide_login_link', 1);
//api_not_allowed(true, get_lang('AccountInactive'));
// we were not in a course, return to home page
$msg = Display::return_message(
get_lang('AccountInactive'),
'error',
false
);
$msg .= '<p class="text-center">
<a class="btn btn-default" href="'.$homeUrl.'">'.get_lang('BackHome').'</a></p>';
if (api_is_anonymous()) {
$form = api_get_not_allowed_login_form();
$msg .= '<div class="well">';
$msg .= $form->returnForm();
$msg .= '</div>';
}
$tpl->assign('content', $msg);
$tpl->display_one_col_template();
exit;
}
return $data;
}
/** /**
* Function used to protect a teacher script. * Function used to protect a teacher script.
* The function blocks access when the user has no teacher rights. * The function blocks access when the user has no teacher rights.
@ -1168,6 +1227,7 @@ function api_block_anonymous_users($printHeaders = true)
return false; return false;
} }
api_block_inactive_user();
return true; return true;
} }
@ -2590,6 +2650,20 @@ function get_status_from_code($status_code)
return get_lang('SessionsAdmin', ''); return get_lang('SessionsAdmin', '');
case DRH: case DRH:
return get_lang('Drh', ''); return get_lang('Drh', '');
case ANONYMOUS:
return get_lang('Anonymous', '');
case PLATFORM_ADMIN:
return get_lang('Administrator', '');
case SESSION_COURSE_COACH:
return get_lang('SessionCourseCoach', '');
case SESSION_GENERAL_COACH:
return get_lang('SessionGeneralCoach', '');
case COURSE_TUTOR:
return get_lang('CourseAssistant', '');
case STUDENT_BOSS:
return get_lang('StudentBoss', '');
case INVITEE:
return get_lang('Invitee', '');
} }
} }

@ -21,9 +21,11 @@ class Auth
/** /**
* This function get all the courses in the particular user category. * This function get all the courses in the particular user category.
* *
* @param bool $hidePrivate
*
* @return array * @return array
*/ */
public function getCoursesInCategory() public function getCoursesInCategory($hidePrivate = true)
{ {
$user_id = api_get_user_id(); $user_id = api_get_user_id();
@ -31,7 +33,7 @@ class Auth
$TABLECOURS = Database::get_main_table(TABLE_MAIN_COURSE); $TABLECOURS = Database::get_main_table(TABLE_MAIN_COURSE);
$TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER); $TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$avoidCoursesCondition = CoursesAndSessionsCatalog::getAvoidCourseCondition(); $avoidCoursesCondition = CoursesAndSessionsCatalog::getAvoidCourseCondition();
$visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true); $visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true, $hidePrivate);
$sql = "SELECT $sql = "SELECT
course.id as real_id, course.id as real_id,
@ -301,7 +303,7 @@ class Auth
* *
* @return bool True if it success * @return bool True if it success
*/ */
public function remove_user_from_course($course_code) public function remove_user_from_course($course_code, $sessionId = 0)
{ {
$tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER); $tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER);
@ -311,6 +313,9 @@ class Auth
$result = true; $result = true;
$courseInfo = api_get_course_info($course_code); $courseInfo = api_get_course_info($course_code);
if ('1' !== $courseInfo['unsubscribe']) {
return false;
}
$courseId = $courseInfo['real_id']; $courseId = $courseInfo['real_id'];
// we check (once again) if the user is not course administrator // we check (once again) if the user is not course administrator
@ -327,7 +332,9 @@ class Auth
$result = false; $result = false;
} }
CourseManager::unsubscribe_user($current_user_id, $course_code); if ($result) {
CourseManager::unsubscribe_user($current_user_id, $course_code, $sessionId);
}
return $result; return $result;
} }

@ -400,7 +400,7 @@ class Chat extends Model
$params = []; $params = [];
$params['from_user'] = (int) $fromUserId; $params['from_user'] = (int) $fromUserId;
$params['to_user'] = (int) $to_user_id; $params['to_user'] = (int) $to_user_id;
$params['message'] = $message; $params['message'] = $messagesan;
$params['sent'] = api_get_utc_datetime(); $params['sent'] = api_get_utc_datetime();
if (!empty($fromUserId) && !empty($to_user_id)) { if (!empty($fromUserId) && !empty($to_user_id)) {

@ -11,7 +11,7 @@ class ConditionalLogin
/** /**
* Check conditions based in the $login_conditions see conditional_login.php file. * Check conditions based in the $login_conditions see conditional_login.php file.
* *
* @param type $user * @param array $user
*/ */
public static function check_conditions($user) public static function check_conditions($user)
{ {

@ -4188,16 +4188,22 @@ class CourseManager
$user_id = api_get_user_id(); $user_id = api_get_user_id();
$course_info = api_get_course_info_by_id($course['real_id']); $course_info = api_get_course_info_by_id($course['real_id']);
$course_visibility = (int) $course_info['visibility']; $course_visibility = (int) $course_info['visibility'];
$allowUnsubscribe = api_get_configuration_value('enable_unsubscribe_button_on_my_course_page');
if (COURSE_VISIBILITY_HIDDEN === $course_visibility) { if ($course_visibility === COURSE_VISIBILITY_HIDDEN) {
return ''; return '';
} }
$sessionInfo = [];
if (!empty($session_id)) {
$sessionInfo = api_get_session_info($session_id);
}
$userInCourseStatus = self::getUserInCourseStatus($user_id, $course_info['real_id']); $userInCourseStatus = self::getUserInCourseStatus($user_id, $course_info['real_id']);
$course_info['status'] = empty($session_id) ? $userInCourseStatus : STUDENT; $course_info['status'] = empty($session_id) ? $userInCourseStatus : STUDENT;
$course_info['id_session'] = $session_id; $course_info['id_session'] = $session_id;
$is_coach = api_is_coach($session_id, $course_info['real_id']); $is_coach = api_is_coach($session_id, $course_info['real_id']);
$isAdmin = api_is_platform_admin();
// Display course entry. // Display course entry.
// Show a hyperlink to the course, unless the course is closed and user is not course admin. // Show a hyperlink to the course, unless the course is closed and user is not course admin.
@ -4223,15 +4229,15 @@ class CourseManager
$notifications .= Display::show_notification($course_info); $notifications .= Display::show_notification($course_info);
} }
$sessionCourseAvailable = false;
if ($session_accessible) { if ($session_accessible) {
if (COURSE_VISIBILITY_CLOSED != $course_visibility || if ($course_visibility != COURSE_VISIBILITY_CLOSED ||
COURSEMANAGER == $userInCourseStatus $userInCourseStatus == COURSEMANAGER
) { ) {
if (empty($course_info['id_session'])) { if (empty($course_info['id_session'])) {
$course_info['id_session'] = 0; $course_info['id_session'] = 0;
} }
$sessionCourseAvailable = false;
$sessionCourseStatus = api_get_session_visibility($session_id, $course_info['real_id']); $sessionCourseStatus = api_get_session_visibility($session_id, $course_info['real_id']);
if (in_array( if (in_array(
@ -4295,12 +4301,25 @@ class CourseManager
$repo = $entityManager->getRepository(SequenceResource::class); $repo = $entityManager->getRepository(SequenceResource::class);
$sequences = $repo->getRequirements($course_info['real_id'], SequenceResource::COURSE_TYPE); $sequences = $repo->getRequirements($course_info['real_id'], SequenceResource::COURSE_TYPE);
$sequenceList = $repo->checkRequirementsForUser($sequences, SequenceResource::COURSE_TYPE, $user_id); $sequenceList = $repo->checkRequirementsForUser(
$sequences,
SequenceResource::COURSE_TYPE,
$user_id,
$session_id
);
$completed = $repo->checkSequenceAreCompleted($sequenceList); $completed = $repo->checkSequenceAreCompleted($sequenceList);
//var_dump($course_info['real_id'], $completed); //var_dump($course_info['real_id'], $completed);
$params['completed'] = $completed; $params['completed'] = $completed;
$params['requirements'] = ''; $params['requirements'] = '';
if ($isAdmin ||
$userInCourseStatus === COURSEMANAGER ||
$is_coach ||
$user_id == $sessionInfo['session_admin_id']
) {
$params['completed'] = true;
$params['requirements'] = '';
} else {
if ($sequences && false === $completed) { if ($sequences && false === $completed) {
$hasRequirements = false; $hasRequirements = false;
foreach ($sequences as $sequence) { foreach ($sequences as $sequence) {
@ -4314,48 +4333,59 @@ class CourseManager
$course_info['real_id'], $course_info['real_id'],
SequenceResource::COURSE_TYPE, SequenceResource::COURSE_TYPE,
false, false,
false false,
$session_id
); );
} }
} }
}
$params['title'] = $session_title; $params['title'] = $session_title;
$params['name'] = $course_info['name']; $params['name'] = $course_info['name'];
$params['edit_actions'] = ''; $params['edit_actions'] = '';
$params['document'] = ''; $params['document'] = '';
$params['category'] = $course_info['categoryName']; $params['category'] = $course_info['categoryName'];
if ($course_visibility != COURSE_VISIBILITY_CLOSED &&
false === $is_coach && $allowUnsubscribe && '1' === $course_info['unsubscribe']) {
$params['unregister_button'] =
CoursesAndSessionsCatalog::return_unregister_button(
['code' => $course_info['code']],
Security::get_existing_token(),
'',
'',
$session_id
);
}
if (COURSE_VISIBILITY_CLOSED != $course_visibility && if (COURSE_VISIBILITY_CLOSED != $course_visibility &&
COURSE_VISIBILITY_HIDDEN != $course_visibility COURSE_VISIBILITY_HIDDEN != $course_visibility
) { ) {
if (api_is_platform_admin()) { if ($isAdmin) {
$params['edit_actions'] .= api_get_path(WEB_CODE_PATH).'course_info/infocours.php?cid='.$course_info['real_id']; $params['edit_actions'] .= api_get_path(WEB_CODE_PATH).'course_info/infocours.php?cidReq='.$course_info['code'];
if ($load_dirs) { if ($load_dirs) {
$params['document'] .= '<a $params['document'] .= '<a
id="document_preview_'.$course_info['real_id'].'_'.$course_info['id_session'].'" id="document_preview_'.$course_info['real_id'].'_'.$session_id.'"
class="document_preview btn btn-default btn-sm" class="document_preview btn btn-default btn-sm"
href="javascript:void(0);">'. href="javascript:void(0);">'.
Display::returnFontAwesomeIcon('folder-open').'</a>'; Display::returnFontAwesomeIcon('folder-open').'</a>';
$params['document'] .= Display::div('', [ $params['document'] .= Display::div('', [
'id' => 'document_result_'.$course_info['real_id'].'_'.$course_info['id_session'], 'id' => 'document_result_'.$course_info['real_id'].'_'.$session_id,
'class' => 'document_preview_container', 'class' => 'document_preview_container',
]); ]);
} }
} }
} }
if ('true' === api_get_setting('display_teacher_in_courselist')) { if ('true' === api_get_setting('display_teacher_in_courselist')) {
$teacher_list = self::getTeachersFromCourse( $teacher_list = self::getTeachersFromCourse($course_info['real_id'], true);
$course_coachs = self::get_coachs_from_course(
$session_id,
$course_info['real_id'], $course_info['real_id'],
true true
); );
$course_coachs = self::get_coachs_from_course(
$course_info['id_session'],
$course_info['real_id']
);
$params['teachers'] = $teacher_list; $params['teachers'] = $teacher_list;
if ((STUDENT == $course_info['status'] && !empty($course_info['id_session'])) || if (($course_info['status'] == STUDENT && !empty($session_id)) ||
($is_coach && COURSEMANAGER != $course_info['status']) ($is_coach && $course_info['status'] != COURSEMANAGER)
) { ) {
$params['coaches'] = $course_coachs; $params['coaches'] = $course_coachs;
} }
@ -4363,44 +4393,42 @@ class CourseManager
$special = isset($course['special_course']) ? true : false; $special = isset($course['special_course']) ? true : false;
$params['title'] = $session_title; $params['title'] = $session_title;
$params['special'] = $special; $params['special'] = $special;
if ('true' === api_get_setting('display_coursecode_in_courselist')) { if (api_get_setting('display_coursecode_in_courselist') === 'true') {
$params['visual_code'] = '('.$course_info['visual_code'].')'; $params['visual_code'] = '('.$course_info['visual_code'].')';
} }
$params['extra'] = ''; $params['extra'] = '';
$html = $params; $html = $params;
$session_category_id = null; $session_category_id = null;
if (1) {
$session = '';
$active = false; $active = false;
if (!empty($course_info['id_session'])) { if (!empty($session_id)) {
$session = api_get_session_info($course_info['id_session']);
$sessionCoachName = ''; $sessionCoachName = '';
if (!empty($session['id_coach'])) { if (!empty($sessionInfo['id_coach'])) {
$coachInfo = api_get_user_info($session['id_coach']); $coachInfo = api_get_user_info($sessionInfo['id_coach']);
$sessionCoachName = $coachInfo['complete_name']; $sessionCoachName = $coachInfo['complete_name'];
} }
$session_category_id = self::get_session_category_id_by_session_id($course_info['id_session']); $session_category_id = self::get_session_category_id_by_session_id($course_info['id_session']);
if ( if (
'0000-00-00 00:00:00' === $session['access_start_date'] || empty($session['access_start_date']) || $sessionInfo['access_start_date'] === '0000-00-00 00:00:00' ||
'0000-00-00' === $session['access_start_date'] empty($sessionInfo['access_start_date']) ||
$sessionInfo['access_start_date'] === '0000-00-00'
) { ) {
$session['dates'] = ''; $sessionInfo['dates'] = '';
if ('true' === api_get_setting('show_session_coach')) { if (api_get_setting('show_session_coach') === 'true') {
$session['coach'] = get_lang('General coach').': '.$sessionCoachName; $sessionInfo['coach'] = get_lang('GeneralCoach').': '.$sessionCoachName;
} }
$active = true; $active = true;
} else { } else {
$session['dates'] = ' - '. $sessionInfo['dates'] = ' - '.
get_lang('From').' '.$session['access_start_date'].' '. get_lang('From').' '.$sessionInfo['access_start_date'].' '.
get_lang('To').' '.$session['access_end_date']; get_lang('To').' '.$sessionInfo['access_end_date'];
if ('true' === api_get_setting('show_session_coach')) { if (api_get_setting('show_session_coach') === 'true') {
$session['coach'] = get_lang('General coach').': '.$sessionCoachName; $sessionInfo['coach'] = get_lang('GeneralCoach').': '.$sessionCoachName;
} }
$date_start = $session['access_start_date']; $date_start = $sessionInfo['access_start_date'];
$date_end = $session['access_end_date']; $date_end = $sessionInfo['access_end_date'];
$active = !$date_end ? ($date_start <= $now) : ($date_start <= $now && $date_end >= $now); $active = !$date_end ? ($date_start <= $now) : ($date_start <= $now && $date_end >= $now);
} }
} }
@ -4412,7 +4440,7 @@ class CourseManager
$user_course_category, $user_course_category,
$html, $html,
$course_info['id_session'], $course_info['id_session'],
$session, $sessionInfo,
'active' => $active, 'active' => $active,
'session_category_id' => $session_category_id, 'session_category_id' => $session_category_id,
]; ];
@ -4430,9 +4458,6 @@ class CourseManager
$output['skill']['icon'] = $skill->getIcon(); $output['skill']['icon'] = $skill->getIcon();
} }
} }
} else {
$output = [$course_info['user_course_cat'], $html];
}
return $output; return $output;
} }
@ -4457,14 +4482,14 @@ class CourseManager
if (!empty($course_info)) { if (!empty($course_info)) {
$cb = new CourseBuilder('', $course_info); $cb = new CourseBuilder('', $course_info);
$course = $cb->build($source_session_id, $source_course_code, true); $course = $cb->build($source_session_id, $source_course_code, $withBaseContent);
$course_restorer = new CourseRestorer($course); $restorer = new CourseRestorer($course);
$course_restorer->skip_content = $params; $restorer->skip_content = $params;
$course_restorer->restore( $restorer->restore(
$destination_course_code, $destination_course_code,
$destination_session_id, $destination_session_id,
true, true,
true $withBaseContent
); );
return true; return true;
@ -4481,6 +4506,7 @@ class CourseManager
* @param int source session id * @param int source session id
* @param int destination session id * @param int destination session id
* @param array $params * @param array $params
* @param bool $copySessionContent
* *
* @return array * @return array
*/ */
@ -4489,7 +4515,8 @@ class CourseManager
$source_course_code, $source_course_code,
$source_session_id = 0, $source_session_id = 0,
$destination_session_id = 0, $destination_session_id = 0,
$params = [] $params = [],
$copySessionContent = false
) { ) {
$source_course_info = api_get_course_info($source_course_code); $source_course_info = api_get_course_info($source_course_code);
if (!empty($source_course_info)) { if (!empty($source_course_info)) {
@ -4506,7 +4533,8 @@ class CourseManager
$source_session_id, $source_session_id,
$new_course_info['code'], $new_course_info['code'],
$destination_session_id, $destination_session_id,
$params $params,
true
); );
if ($result) { if ($result) {
return $new_course_info; return $new_course_info;
@ -5285,18 +5313,19 @@ class CourseManager
* *
* @param string $courseTableAlias Alias of the course table * @param string $courseTableAlias Alias of the course table
* @param bool $hideClosed Whether to hide closed and hidden courses * @param bool $hideClosed Whether to hide closed and hidden courses
* @param bool $checkHidePrivate
* *
* @return string SQL conditions * @return string SQL conditions
*/ */
public static function getCourseVisibilitySQLCondition( public static function getCourseVisibilitySQLCondition($courseTableAlias, $hideClosed = false, $checkHidePrivate = true)
$courseTableAlias, {
$hideClosed = false
) {
$visibilityCondition = ''; $visibilityCondition = '';
$hidePrivate = api_get_setting('course_catalog_hide_private'); if ($checkHidePrivate) {
if ('true' === $hidePrivate) { $hidePrivateSetting = api_get_setting('course_catalog_hide_private');
if ('true' === $hidePrivateSetting) {
$visibilityCondition .= " AND $courseTableAlias.visibility <> ".COURSE_VISIBILITY_REGISTERED; $visibilityCondition .= " AND $courseTableAlias.visibility <> ".COURSE_VISIBILITY_REGISTERED;
} }
}
if ($hideClosed) { if ($hideClosed) {
$visibilityCondition .= " AND $courseTableAlias.visibility NOT IN (".COURSE_VISIBILITY_CLOSED.','.COURSE_VISIBILITY_HIDDEN.')'; $visibilityCondition .= " AND $courseTableAlias.visibility NOT IN (".COURSE_VISIBILITY_CLOSED.','.COURSE_VISIBILITY_HIDDEN.')';
} }

@ -552,10 +552,11 @@ class CourseCategory
).' '.$category['name'].' ('.$category['code'].')', ).' '.$category['name'].' ('.$category['code'].')',
$url $url
); );
$countCourses = self::countCoursesInCategory($category['code'], null, false);
$content = [ $content = [
$title, $title,
$category['children_count'], $category['children_count'],
$category['nbr_courses'], $countCourses,
implode('', $actions), implode('', $actions),
]; ];
$column = 0; $column = 0;
@ -567,9 +568,8 @@ class CourseCategory
} }
return $table->toHtml(); return $table->toHtml();
} else {
return Display::return_message(get_lang('There are no categories here'), 'warning');
} }
return Display::return_message(get_lang('NoCategories'), 'warning');
} }
/** /**
@ -605,8 +605,16 @@ class CourseCategory
ORDER BY tree_pos"; ORDER BY tree_pos";
$res = Database::query($sql); $res = Database::query($sql);
$categoryToAvoid = '';
if (!api_is_platform_admin()) {
$categoryToAvoid = api_get_configuration_value('course_category_code_to_use_as_model');
}
$categories[''] = '-'; $categories[''] = '-';
while ($cat = Database::fetch_array($res)) { while ($cat = Database::fetch_array($res)) {
$categoryCode = $cat['code'];
if (!empty($categoryToAvoid) && $categoryToAvoid == $categoryCode) {
continue;
}
$categories[$cat['id']] = '('.$cat['code'].') '.$cat['name']; $categories[$cat['id']] = '('.$cat['code'].') '.$cat['name'];
ksort($categories); ksort($categories);
} }
@ -614,21 +622,18 @@ class CourseCategory
return $categories; return $categories;
} }
/** public static function getCoursesInCategory($category_code = '', $searchTerm = '', $avoidCourses = true, $conditions = [], $getCount = false)
* @param string $category_code {
* @param string $searchTerm
*
* @return int
*/
public static function countCoursesInCategory($category_code = '', $searchTerm = '')
{
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
$tblCourseCategory = Database::get_main_table(TABLE_MAIN_CATEGORY); $tblCourseCategory = Database::get_main_table(TABLE_MAIN_CATEGORY);
$avoidCoursesCondition = '';
if ($avoidCourses) {
$avoidCoursesCondition = CoursesAndSessionsCatalog::getAvoidCourseCondition();
}
$categoryCode = Database::escape_string($category_code); $categoryCode = Database::escape_string($category_code);
$searchTerm = Database::escape_string($searchTerm); $searchTerm = Database::escape_string($searchTerm);
$avoidCoursesCondition = CoursesAndSessionsCatalog::getAvoidCourseCondition();
$visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true); $visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true);
$categoryJoin = ''; $categoryJoin = '';
@ -669,11 +674,15 @@ class CourseCategory
"; ";
$result = Database::query($sql); $result = Database::query($sql);
if ($getCount) {
$row = Database::fetch_array($result); $row = Database::fetch_array($result);
return (int) $row['count']; return (int) $row['count'];
} }
return Database::store_result($result, 'ASSOC');
}
/** /**
* @param array $list * @param array $list
* *

@ -715,21 +715,27 @@ class AppPlugin
} }
$form->addHtml('<div class="panel panel-default">'); $form->addHtml('<div class="panel panel-default">');
$form->addHtml(' $form->addHtml(
'
<div class="panel-heading" role="tab" id="heading-'.$pluginName.'-settings"> <div class="panel-heading" role="tab" id="heading-'.$pluginName.'-settings">
<h4 class="panel-title"> <h4 class="panel-title">
<a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse-'.$pluginName.'-settings" aria-expanded="false" aria-controls="collapse-'.$pluginName.'-settings"> <a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse-'.$pluginName.'-settings" aria-expanded="false" aria-controls="collapse-'.$pluginName.'-settings">
'); '
);
$form->addHtml($icon.' '.$pluginTitle); $form->addHtml($icon.' '.$pluginTitle);
$form->addHtml(' $form->addHtml(
'
</a> </a>
</h4> </h4>
</div> </div>
'); '
$form->addHtml(' );
$form->addHtml(
'
<div id="collapse-'.$pluginName.'-settings" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-'.$pluginName.'-settings"> <div id="collapse-'.$pluginName.'-settings" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-'.$pluginName.'-settings">
<div class="panel-body"> <div class="panel-body">
'); '
);
$groups = []; $groups = [];
foreach ($obj->course_settings as $setting) { foreach ($obj->course_settings as $setting) {
@ -765,14 +771,14 @@ class AppPlugin
$form->addGroup($groups[$k], $k, [$obj->get_lang($k)]); $form->addGroup($groups[$k], $k, [$obj->get_lang($k)]);
} }
$form->addButtonSave(get_lang('Save settings')); $form->addButtonSave(get_lang('Save settings'));
$form->addHtml(' $form->addHtml(
'
</div> </div>
</div> </div>
'); '
);
$form->addHtml('</div>'); $form->addHtml('</div>');
} }
}
}
/** /**
* Get all course settings from all installed plugins. * Get all course settings from all installed plugins.

Loading…
Cancel
Save