Merge branch '1.11.x' of https://github.com/chamilo/chamilo-lms into 1.11.x

pull/3883/head
Christian 5 years ago
commit f35edf31a4
  1. 32
      main/admin/course_intro_pdf_import.php
  2. 4
      main/admin/user_export.php
  3. 14
      main/admin/user_information.php
  4. 9
      main/exercise/aiken.php
  5. 6
      main/exercise/exercise_report.php
  6. 12
      main/exercise/export/aiken/aiken_import.inc.php
  7. 19
      main/inc/lib/api.lib.php
  8. 8
      main/inc/lib/fileUpload.lib.php
  9. 67
      main/inc/lib/sessionmanager.lib.php
  10. 23
      main/inc/lib/usermanager.lib.php
  11. 1
      main/lang/dutch/trad4all.inc.php
  12. 3
      main/lang/english/trad4all.inc.php
  13. 3
      main/lang/french/trad4all.inc.php
  14. 3
      main/lang/spanish/trad4all.inc.php
  15. 41
      main/mySpace/myStudents.php
  16. 3
      main/user/career_diagram.php

@ -20,7 +20,7 @@ $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')]
set_time_limit(0);
if ($_POST['formSent']) {
if (isset($_POST['formSent'])) {
if (empty($_FILES['import_file']['tmp_name'])) {
$error_message = get_lang('UplUploadFailed');
Display::addFlash(Display::return_message($error_message, 'error', false));
@ -37,28 +37,17 @@ if ($_POST['formSent']) {
);
} else {
$errors = import_pdfs($subDir);
if (count($errors) == 0) {
error_log('Course intros imported successfully in '.__FILE__.', line '.__LINE__);
}
}
}
}
if (count($errors) != 0) {
if (!empty($errors)) {
$error_message = '<ul>';
foreach ($errors as $index => $error_course) {
$error_message .= '<li>'.get_lang('Course').': '.$error_course['Title'].' ('.$error_course['Code'].')</li>';
}
$error_message .= '</ul>';
Display::addFlash(Display::return_message($error_message, 'normal', false));
} elseif ($_POST['formSent']) {
Display::addFlash(
Display::return_message(
get_lang('CourseIntroductionsAllImportedSuccessfully'),
'confirmation',
false
)
);
}
Display::display_header($tool_name);
@ -101,7 +90,7 @@ Display::display_footer();
*
* @param string $subDir The subdirectory in which to put the files in each course
*
* @return array List of possible errors found
* @return bool|array List of possible errors found
*/
function import_pdfs($subDir = '/')
{
@ -112,9 +101,7 @@ function import_pdfs($subDir = '/')
@mkdir($baseDir.$uploadPath);
}
if (!unzip_uploaded_file($_FILES['import_file'], $uploadPath, $baseDir, 1024 * 1024 * 1024)) {
error_log('Could not unzip uploaded file in '.__FILE__.', line '.__LINE__);
return $errors;
return false;
}
$list = scandir($baseDir.$uploadPath);
$i = 0;
@ -174,7 +161,6 @@ function import_pdfs($subDir = '/')
$course_description->insert();
}
} else {
error_log($parts[0].' is not a course, apparently');
$errors[] = ['Line' => 0, 'Code' => $parts[0], 'Title' => $parts[0].' - '.get_lang('CodeDoesNotExists')];
}
$i++; //found at least one entry that is not a dir or a .
@ -183,5 +169,15 @@ function import_pdfs($subDir = '/')
$errors[] = ['Line' => 0, 'Code' => '.', 'Title' => get_lang('NoPDFFoundAtRoot')];
}
if (empty($errors)) {
Display::addFlash(
Display::return_message(
get_lang('CourseIntroductionsAllImportedSuccessfully'),
'confirmation',
false
)
);
}
return $errors;
}

@ -146,7 +146,8 @@ if ($form->validate()) {
'OfficialCode',
'PhoneNumber',
'RegistrationDate',
'Active',
'Active',
'ExpirationDate',
];
} else {
$data[] = [
@ -162,6 +163,7 @@ if ($form->validate()) {
'PhoneNumber',
'RegistrationDate',
'Active',
'ExpirationDate',
];
}

@ -286,7 +286,6 @@ if (api_get_setting('allow_social_tool') === 'true') {
*/
$sessions = SessionManager::get_sessions_by_user($userId, true);
$personal_course_list = [];
$courseToolInformationTotal = null;
$sessionInformation = '';
if (count($sessions) > 0) {
$header = [
@ -310,9 +309,9 @@ if (count($sessions) > 0) {
$data = [];
$personal_course_list = [];
$id_session = $session_item['session_id'];
$csvContent[] = [$session_item['session_name']];
$csvContent[] = $headerList;
$courseToolInformationTotal = '';
foreach ($session_item['courses'] as $my_course) {
$courseInfo = api_get_course_info_by_id($my_course['real_id']);
$sessionStatus = SessionManager::get_user_status_in_course_session(
@ -341,7 +340,8 @@ if (count($sessions) > 0) {
Display::return_icon('course_home.png', get_lang('CourseHomepage')).'</a>';
if (!empty($my_course['status']) && $my_course['status'] == STUDENT) {
$tools .= '<a href="user_information.php?action=unsubscribe_session_course&course_id='.$courseInfo['real_id'].'&user_id='.$userId.'&id_session='.$id_session.'">'.
$tools .= '<a
href="user_information.php?action=unsubscribe_session_course&course_id='.$courseInfo['real_id'].'&user_id='.$userId.'&id_session='.$id_session.'">'.
Display::return_icon('delete.png', get_lang('Delete')).'</a>';
}
@ -419,7 +419,6 @@ if (count($sessions) > 0) {
} else {
$sessionInformation = '<p>'.get_lang('NoSessionsForThisUser').'</p>';
}
$courseToolInformationTotal = '';
/**
* Show the courses in which this user is subscribed.
@ -449,7 +448,7 @@ if (Database::num_rows($res) > 0) {
$csvContent[] = $headerList;
$data = [];
$courseToolInformationTotal = null;
$courseToolInformationTotal = '';
while ($course = Database::fetch_object($res)) {
$courseInfo = api_get_course_info_by_id($course->c_id);
$courseCode = $courseInfo['code'];
@ -698,6 +697,11 @@ $layoutTemplate = $tpl->get_template('admin/user_information.tpl');
$content = $tpl->fetch($layoutTemplate);
echo $content;
if (api_get_configuration_value('allow_career_users')) {
if (!empty($sessions)) {
foreach ($sessions as $session) {
echo SessionManager::getCareerDiagramPerSession($session['session_id'], $userId);
}
}
echo MyStudents::getBlockForCareers($userId);
}

@ -15,7 +15,6 @@ api_protect_course_script(true);
$lib_path = api_get_path(LIBRARY_PATH);
$main_path = api_get_path(SYS_CODE_PATH);
// including additional libraries
require_once $main_path.'exercise/export/aiken/aiken_import.inc.php';
require_once $main_path.'exercise/export/aiken/aiken_classes.php';
@ -27,13 +26,12 @@ if (!api_is_allowed_to_edit(null, true)) {
api_not_allowed();
}
// the breadcrumbs
$interbreadcrumb[] = [
'url' => 'exercise.php?'.api_get_cidreq(),
'name' => get_lang('Exercises'),
];
$is_allowedToEdit = api_is_allowed_to_edit(null, true);
// import file
if ((api_is_allowed_to_edit(null, true))) {
if (isset($_POST['submit'])) {
$id = aiken_import_file($_FILES['userFile']);
@ -44,11 +42,6 @@ if ((api_is_allowed_to_edit(null, true))) {
}
}
// display header
Display::display_header(get_lang('ImportAikenQuiz'), 'Exercises');
// display Aiken form
aiken_display_form();
// display the footer
Display::display_footer();

@ -252,7 +252,11 @@ if (isset($_REQUEST['comments']) &&
$res = Database::query($qry);
$tot = 0;
while ($row = Database :: fetch_array($res, 'ASSOC')) {
$tot += $row['marks'];
$marks = $row['marks'];
if (!$objExerciseTmp->propagate_neg && $marks < 0) {
continue;
}
$tot += $marks;
}
} else {
$tot = $pluginEvaluation->getResultWithFormula($id, $formula);

@ -75,7 +75,8 @@ function get_and_unzip_uploaded_exercise($baseWorkDir, $uploadPath)
null,
1,
'overwrite',
false
false,
true
)
) {
if (!function_exists('gzopen')) {
@ -115,12 +116,11 @@ function aiken_import_exercise($file)
$archive_path = api_get_path(SYS_ARCHIVE_PATH).'aiken/';
$baseWorkDir = $archive_path;
if (!is_dir($baseWorkDir)) {
mkdir($baseWorkDir, api_get_permissions_for_new_directories(), true);
$uploadPath = 'aiken_'.api_get_unique_id();
if (!is_dir($baseWorkDir.$uploadPath)) {
mkdir($baseWorkDir.$uploadPath, api_get_permissions_for_new_directories(), true);
}
$uploadPath = 'aiken_'.api_get_unique_id().'/';
// set some default values for the new exercise
$exercise_info = [];
$exercise_info['name'] = preg_replace('/.(zip|txt)$/i', '', $file);
@ -133,7 +133,7 @@ function aiken_import_exercise($file)
// unzip the uploaded file in a tmp directory
if (preg_match('/.(zip|txt)$/i', $file)) {
if (!get_and_unzip_uploaded_exercise($baseWorkDir, $uploadPath)) {
if (!get_and_unzip_uploaded_exercise($baseWorkDir.$uploadPath, '/')) {
return 'ThereWasAProblemWithYourFile';
}
}

@ -2788,7 +2788,8 @@ function api_get_session_info($id)
function api_get_session_visibility(
$session_id,
$courseId = null,
$ignore_visibility_for_admins = true
$ignore_visibility_for_admins = true,
$userId = 0
) {
if (api_is_platform_admin()) {
if ($ignore_visibility_for_admins) {
@ -2796,6 +2797,8 @@ function api_get_session_visibility(
}
}
$userId = empty($userId) ? api_get_user_id() : (int) $userId;
$now = time();
if (empty($session_id)) {
return 0; // Means that the session is still available.
@ -2818,7 +2821,7 @@ function api_get_session_visibility(
// Session duration per student.
if (isset($row['duration']) && !empty($row['duration'])) {
$duration = $row['duration'] * 24 * 60 * 60;
$courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser($session_id, api_get_user_id());
$courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser($session_id, $userId);
// If there is a session duration but there is no previous
// access by the user, then the session is still available
@ -2830,10 +2833,7 @@ function api_get_session_visibility(
$firstAccess = isset($courseAccess['login_course_date'])
? api_strtotime($courseAccess['login_course_date'], 'UTC')
: 0;
$userDurationData = SessionManager::getUserSession(
api_get_user_id(),
$session_id
);
$userDurationData = SessionManager::getUserSession($userId, $session_id);
$userDuration = isset($userDurationData['duration'])
? (intval($userDurationData['duration']) * 24 * 60 * 60)
: 0;
@ -2862,7 +2862,7 @@ function api_get_session_visibility(
}
// If I'm a coach the visibility can change in my favor depending in the coach dates.
$isCoach = api_is_coach($session_id, $courseId);
$isCoach = api_is_coach($session_id, $courseId, $userId);
if ($isCoach) {
// Test start date.
@ -3250,12 +3250,13 @@ function api_is_course_session_coach($user_id, $courseId, $session_id)
* @param int $session_id
* @param int $courseId
* @param bool Check whether we are in student view and, if we are, return false
* @param int $userId
*
* @return bool True if current user is a course or session coach
*/
function api_is_coach($session_id = 0, $courseId = null, $check_student_view = true)
function api_is_coach($session_id = 0, $courseId = null, $check_student_view = true, $userId = 0)
{
$userId = api_get_user_id();
$userId = empty($userId) ? api_get_user_id() : (int) $userId;
if (!empty($session_id)) {
$session_id = (int) $session_id;

@ -1013,8 +1013,12 @@ function unzip_uploaded_file($uploaded_file, $upload_path, $base_work_dir, $max_
$zip_content_array = $zip_file->listContent();
$ok_scorm = false;
$realFileSize = 0;
foreach ($zip_content_array as &$this_content) {
if (preg_match('~.(php.*|phtml)$~i', $this_content['filename'])) {
$ok_plantyn_scorm1 = false;
$ok_plantyn_scorm2 = false;
$ok_plantyn_scorm3 = false;
$ok_aicc_scorm = false;
foreach ($zip_content_array as $this_content) {
if (preg_match('~.(php.*|phtml|phar|htaccess)$~i', $this_content['filename'])) {
Display::addFlash(
Display::return_message(get_lang('ZipNoPhp'))
);

@ -6126,12 +6126,34 @@ class SessionManager
if (!empty($keyword)) {
$keyword = Database::escape_string($keyword);
$keywordParts = explode(' ', $keyword);
$extraConditions = '';
if (!empty($keywordParts)) {
$keywordParts = array_filter($keywordParts);
foreach ($keywordParts as $part) {
if (empty($part)) {
continue;
}
$part = Database::escape_string($part);
$extraConditions .= "
OR
(u.username LIKE '%$part%' OR
u.firstname LIKE '%$part%' OR
u.lastname LIKE '%$part%' OR
u.official_code LIKE '%$part%'
)
";
}
}
$userConditions .= " AND (
u.username LIKE '%$keyword%' OR
u.firstname LIKE '%$keyword%' OR
u.lastname LIKE '%$keyword%' OR
u.official_code LIKE '%$keyword%' OR
u.email LIKE '%$keyword%'
$extraConditions
)";
}
@ -6199,6 +6221,7 @@ class SessionManager
}
$sql .= $limitCondition;
$result = Database::query($sql);
return Database::store_result($result);
@ -9628,6 +9651,50 @@ class SessionManager
}
}
public static function getCareerDiagramPerSession($sessionId, $userId): string
{
$extraFieldValueSession = new ExtraFieldValue('session');
$extraFieldValueCareer = new ExtraFieldValue('career');
$visibility = api_get_session_visibility($sessionId, null, false, $userId);
$content = '';
if (SESSION_AVAILABLE === $visibility) {
$value = $extraFieldValueSession->get_values_by_handler_and_field_variable($sessionId, 'careerid');
if (isset($value['value']) && !empty($value['value'])) {
$careerList = str_replace(['[', ']'], '', $value['value']);
$careerList = explode(',', $careerList);
foreach ($careerList as $career) {
$careerIdValue = $extraFieldValueCareer->get_item_id_from_field_variable_and_field_value(
'external_career_id',
$career
);
if (isset($careerIdValue['item_id']) && !empty($careerIdValue['item_id'])) {
$finalCareerId = $careerIdValue['item_id'];
$career = new Career();
$careerInfo = $career->get($finalCareerId);
if (!empty($careerInfo)) {
$careerUrl = api_get_path(WEB_CODE_PATH).
'user/career_diagram.php?iframe=1&career_id='.$finalCareerId;
$content .= '<iframe
style="width:100%; height:500px"
border="0"
frameborder="0"
src="'.$careerUrl.'"></iframe>';
}
}
}
}
}
if (!empty($content)) {
$content = Display::page_subheader(get_lang('OngoingTraining')).$content;
}
return $content;
}
/**
* @param int $id
*

@ -5395,12 +5395,35 @@ class UserManager
if (!empty($keyword)) {
$keyword = Database::escape_string($keyword);
$keywordParts = explode(' ', $keyword);
$extraConditions = '';
if (!empty($keywordParts)) {
$keywordParts = array_filter($keywordParts);
foreach ($keywordParts as $part) {
if (empty($part)) {
continue;
}
$part = Database::escape_string($part);
$extraConditions .= "
OR
(u.username LIKE '%$part%' OR
u.firstname LIKE '%$part%' OR
u.lastname LIKE '%$part%' OR
u.official_code LIKE '%$part%'
)
";
}
}
$userConditions .= " AND (
u.username LIKE '%$keyword%' OR
u.firstname LIKE '%$keyword%' OR
u.lastname LIKE '%$keyword%' OR
u.official_code LIKE '%$keyword%' OR
u.email LIKE '%$keyword%'
$extraConditions
)";
}

@ -6881,4 +6881,5 @@ Deze module maakt deel uit van de opleiding %s.";
$YourNextModule = "Jouw eerstvolgende lesmoment voor de module";
$FirstLesson = "Eerste lesmoment";
$UserGuides = "Gidsen voor gebruikers";
$OngoingTraining = "Lopende opleiding(en)";
?>

@ -8773,4 +8773,5 @@ $XPercentCompleted = "%s %% Completed";
$EmailToTeachersWhenNewPost = "E-mail to teachers on new user's post in the portfolio tool";
$PortfolioAlertNewPostContent = "There is a new post by %s in the portfolio of course %s. To view it <a href='%s'>go here</a>.";
$PortfolioAlertNewPostSubject = "[Portfolio] New post in course %s";
?>
$OngoingTraining = "Ongoing training";
?>

@ -8705,4 +8705,5 @@ $XPercentCompleted = "%s %% Complété";
$EmailToTeachersWhenNewPost = "E-mail aux enseignants quand il y a un nouveau post dans l'outil portfolio";
$PortfolioAlertNewPostContent = "Il y a un nouveau post de %s dans le portfolio du cours %s. Pour le voir <a href='%s'> cliquer ici</a>.";
$PortfolioAlertNewPostSubject = "[Portfolio] Nouveau post dans le cours %s";
?>
$OngoingTraining = "Formation(s) en cours";
?>

@ -8801,4 +8801,5 @@ $XPercentCompleted = "%s %% Completado";
$EmailToTeachersWhenNewPost = "Enviar correo electrónico a los profesores sobre los nuevos artículos en la herramienta de portafolio";
$PortfolioAlertNewPostContent = "Hay un nuevo artículo por %s en el portafolio del curso %s. Para verlo haga <a href='%s'>click aquí</a>.";
$PortfolioAlertNewPostSubject = "[Portfolio] Nuevo artículo en el curso %s";
?>
$OngoingTraining = "Formación(es) en curso";
?>

@ -939,7 +939,13 @@ $content = $tpl->fetch($templateName);
echo $content;
// Careers.
echo MyStudents::getBlockForCareers($student_id);
if (api_get_configuration_value('allow_career_users')) {
foreach ($courses_in_session as $sId => $courses) {
echo SessionManager::getCareerDiagramPerSession($sId, $student_id);
}
echo MyStudents::getBlockForCareers($student_id);
}
echo MyStudents::getBlockForSkills(
$student_id,
$courseInfo ? $courseInfo['real_id'] : 0,
@ -994,39 +1000,6 @@ if (empty($details)) {
.' '.$session_name.($date_session ? ' ('.$date_session.')' : '');
}
if (api_get_configuration_value('allow_career_users')) {
$visibility = api_get_session_visibility($sId);
if (SESSION_AVAILABLE === $visibility) {
$value = $extraFieldValueSession->get_values_by_handler_and_field_variable($sId, 'careerid');
if (isset($value['value']) && !empty($value['value'])) {
$careerList = str_replace(['[', ']'], '', $value['value']);
$careerList = explode(',', $careerList);
foreach ($careerList as $career) {
$careerIdValue = $extraFieldValueCareer->get_item_id_from_field_variable_and_field_value(
'external_career_id',
$career
);
if (isset($careerIdValue['item_id']) && !empty($careerIdValue['item_id'])) {
$finalCareerId = $careerIdValue['item_id'];
$career = new Career();
$careerInfo = $career->get($finalCareerId);
if (!empty($careerInfo)) {
$careerUrl = api_get_path(WEB_PATH).
'main/user/career_diagram.php?iframe=1&career_id='.$finalCareerId;
echo '<iframe
style="width:100%; height:500px"
border="0"
frameborder="0"
src="'.$careerUrl.'"></iframe>';
}
}
}
}
}
}
// Courses
echo '<h3>'.$title.'</h3>';
echo '<div class="table-responsive">';

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
/*
@ -31,7 +32,7 @@ if (empty($careerInfo)) {
}
$userId = api_get_user_id();
$allow = UserManager::userHasCareer($userId, $careerId) || api_is_platform_admin();
$allow = UserManager::userHasCareer($userId, $careerId) || api_is_platform_admin() || api_is_drh();
if ($allow === false) {
api_not_allowed(true);

Loading…
Cancel
Save