diff --git a/index.php b/index.php index 59ed570ce6..37f4010699 100755 --- a/index.php +++ b/index.php @@ -150,6 +150,10 @@ $controller->tpl->assign('navigation_course_links', $controller->return_navigati $controller->tpl->assign('notice_block', $controller->return_notice()); //$controller->tpl->assign('main_navigation_block', $controller->return_navigation_links()); $controller->tpl->assign('help_block', $controller->return_help()); +$controller->tpl->assign('total_users', UserManager::getCountActiveUsers()); +$controller->tpl->assign('total_courses', CourseManager::getCountOpenCourses()); +$controller->tpl->assign('total_exercises', CourseManager::getCountExercisesFromOpenCourse()); + if (api_is_platform_admin() || api_is_drh()) { $controller->tpl->assign('skills_block', $controller->return_skills_links()); diff --git a/load_search.php b/load_search.php index bc071f6696..40dc4e54ca 100644 --- a/load_search.php +++ b/load_search.php @@ -276,8 +276,44 @@ $extra = $extraFieldUser->addElements( // Session fields $showOnlyThisFields = [ 'access_start_date', - 'access_end_date', - //'heures_disponibilite_par_semaine', this is only for user + 'access_end_date' +]; + +$extra = $extraField->addElements( + $form, + '', + [], + false, //filter + true, + $showOnlyThisFields, + $showOnlyThisFields, + $defaults, + [], + false, //$orderDependingDefaults + true, // force + [], // $separateExtraMultipleSelect + [] +); + +$fieldsToShow = [ + 'heures_disponibilite_par_semaine', +]; + +$extra = $extraFieldUser->addElements( + $form, + $userToLoad, + [], + $filter, + true, + $fieldsToShow, + $fieldsToShow, + [], + [], + false, + $forceShowFields //$forceShowFields = false +); + +$showOnlyThisFields = [ 'domaine', 'filiere', $theme, @@ -335,7 +371,6 @@ $column_model = $result['column_model']; $form->setDefaults($defaults); - /** @var HTML_QuickForm_select $element */ $domaine1 = $form->getElementByName('extra_domaine[0]'); $domaine2 = $form->getElementByName('extra_domaine[1]'); @@ -453,7 +488,17 @@ if ($form->validate()) { } if ($save) { + $userData = $params; + // Update extra_heures_disponibilite_par_semaine + $extraFieldValue = new ExtraFieldValue('user'); + $userDataToSave = [ + 'item_id' => $userToLoad, + 'extra_heures_disponibilite_par_semaine' => isset($userData['extra_heures_disponibilite_par_semaine']) ? $userData['extra_heures_disponibilite_par_semaine'] : '' + ]; + $extraFieldValue->saveFieldValues($userDataToSave, true, false, ['heures_disponibilite_par_semaine']); + + // Save session search /** @var \Chamilo\UserBundle\Entity\User $user */ $user = $em->getRepository('ChamiloUserBundle:User')->find($userToLoad); $extraFieldValueSession = new ExtraFieldValue('session'); @@ -476,17 +521,11 @@ if ($form->validate()) { 'extra_ecrire' ]; - $userData = $params; - foreach ($userData as $key => $value) { - - $found = strpos($key, '__persist__'); if ($found === false) { continue; } - - } if (isset($userData['extra_filiere_want_stage']) && diff --git a/main/auth/inscription.php b/main/auth/inscription.php index bea19a5153..b48fb7e626 100755 --- a/main/auth/inscription.php +++ b/main/auth/inscription.php @@ -670,38 +670,57 @@ if (api_get_setting('allow_terms_conditions') == 'true') { } } - $language = api_get_interface_language(); - $language = api_get_language_id($language); - $term_preview = LegalManager::get_last_condition($language); - - if (!$term_preview) { - //we load from the platform - $language = api_get_setting('platformLanguage'); + // Ofaj + if (!api_is_anonymous()) { + $language = api_get_interface_language(); $language = api_get_language_id($language); $term_preview = LegalManager::get_last_condition($language); - //if is false we load from english if (!$term_preview) { - $language = api_get_language_id('english'); //this must work + //we load from the platform + $language = api_get_setting('platformLanguage'); + $language = api_get_language_id($language); $term_preview = LegalManager::get_last_condition($language); - } - } - // Version and language - $form->addElement('hidden', 'legal_accept_type', $term_preview['version'].':'.$term_preview['language_id']); - $form->addElement('hidden', 'legal_info', $term_preview['id'].':'.$term_preview['language_id']); + //if is false we load from english + if (!$term_preview) { + $language = api_get_language_id('english'); //this must work + $term_preview = LegalManager::get_last_condition($language); + } + } - if ($term_preview['type'] == 1) { + // Version and language $form->addElement( - 'checkbox', - 'legal_accept', - null, - get_lang('IHaveReadAndAgree').' '.get_lang('TermsAndConditions').'' + 'hidden', + 'legal_accept_type', + $term_preview['version'].':'.$term_preview['language_id'] ); - $form->addRule('legal_accept', get_lang('ThisFieldIsRequired'), 'required'); - } else { - $preview = LegalManager::show_last_condition($term_preview); - $form->addElement('label', null, $preview); + $form->addElement( + 'hidden', + 'legal_info', + $term_preview['id'].':'.$term_preview['language_id'] + ); + + if ($term_preview['type'] == 1) { + $form->addElement( + 'checkbox', + 'legal_accept', + null, + get_lang( + 'IHaveReadAndAgree' + ).' '.get_lang( + 'TermsAndConditions' + ).'' + ); + $form->addRule( + 'legal_accept', + get_lang('ThisFieldIsRequired'), + 'required' + ); + } else { + $preview = LegalManager::show_last_condition($term_preview); + $form->addElement('label', null, $preview); + } } } diff --git a/main/inc/lib/api.lib.php b/main/inc/lib/api.lib.php index 82750ab4bb..f010aec79f 100644 --- a/main/inc/lib/api.lib.php +++ b/main/inc/lib/api.lib.php @@ -2564,7 +2564,7 @@ function api_get_user_platform_status($user_id = null) { case 5: $course_status['status'] = 'student'; //check if tutor - $tutor_course_status = CourseManager::get_tutor_in_course_status($user_id, $course_code); + $tutor_course_status = CourseManager::get_tutor_in_course_status($user_id, $course_id); if ($tutor_course_status) { $course_status['status'] = 'tutor'; } @@ -6979,7 +6979,7 @@ function api_detect_user_roles($user_id, $courseId, $session_id = 0) if (CourseManager::is_course_teacher($user_id, $course_code)) { $user_roles[] = COURSEMANAGER; } - if (CourseManager::get_tutor_in_course_status($user_id, $course_code)) { + if (CourseManager::get_tutor_in_course_status($user_id, $courseInfo['real_id'])) { $user_roles[] = COURSE_TUTOR; } @@ -8249,3 +8249,7 @@ function api_remove_uploaded_file($type, $file) } } +function api_student_boss_access_to_course_and_session() +{ + return true; +} \ No newline at end of file diff --git a/main/inc/lib/certificate.lib.php b/main/inc/lib/certificate.lib.php index 68e3027be9..efc4a1ca47 100755 --- a/main/inc/lib/certificate.lib.php +++ b/main/inc/lib/certificate.lib.php @@ -316,9 +316,11 @@ class Certificate extends Model $path_certificate ) { $table_certificate = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CERTIFICATE); + $now = api_get_utc_datetime(); if (!UserManager::is_user_certified($cat_id, $user_id)) { $sql = 'UPDATE '.$table_certificate.' SET - path_certificate="'.Database::escape_string($path_certificate).'" + path_certificate="'.Database::escape_string($path_certificate).'", + created_at = "'.$now.'" WHERE cat_id="'.intval($cat_id).'" AND user_id="'.intval($user_id).'" '; Database::query($sql); } diff --git a/main/inc/lib/course.lib.php b/main/inc/lib/course.lib.php index dc610b6f08..519218f590 100755 --- a/main/inc/lib/course.lib.php +++ b/main/inc/lib/course.lib.php @@ -343,14 +343,14 @@ class CourseManager * * @return mixed */ - public static function get_tutor_in_course_status($user_id, $course_code) + public static function get_tutor_in_course_status($user_id, $courseId) { $result = Database::fetch_array( Database::query(" SELECT is_tutor FROM " . Database::get_main_table(TABLE_MAIN_COURSE_USER) . " WHERE - course_code = '" . Database::escape_string($course_code) . "' AND + c_id = '" . Database::escape_string($courseId) . "' AND user_id = " . intval($user_id) ) ); @@ -2481,7 +2481,7 @@ class CourseManager public static function course_exists($course_code) { $sql = 'SELECT 1 FROM ' . Database::get_main_table(TABLE_MAIN_COURSE) . ' - WHERE code="' . Database::escape_string($course_code) . '"'; + WHERE code="' . Database::escape_string($course_code) . '"'; return Database::num_rows(Database::query($sql)); } @@ -6190,4 +6190,48 @@ class CourseManager $courseFieldValue = new ExtraFieldValue('course'); $courseFieldValue->saveFieldValues($params); } + + /** + * @return int + */ + public static function getCountOpenCourses() + { + $visibility = [ + COURSE_VISIBILITY_REGISTERED, + COURSE_VISIBILITY_OPEN_PLATFORM, + COURSE_VISIBILITY_OPEN_WORLD + ]; + + $table = Database::get_main_table(TABLE_MAIN_COURSE); + $sql = "SELECT count(id) count + FROM $table + WHERE visibility IN (".implode(',', $visibility).")"; + $result = Database::query($sql); + $row = Database::fetch_array($result); + + return $row['count']; + } + + /** + * @return int + */ + public static function getCountExercisesFromOpenCourse() + { + $visibility = [ + COURSE_VISIBILITY_REGISTERED, + COURSE_VISIBILITY_OPEN_PLATFORM, + COURSE_VISIBILITY_OPEN_WORLD + ]; + + $table = Database::get_main_table(TABLE_MAIN_COURSE); + $tableExercise = Database::get_course_table(TABLE_QUIZ_TEST); + $sql = "SELECT count(e.iid) count + FROM $table c INNER JOIN $tableExercise e + ON (c.id = e.c_id) + WHERE e.active <> -1 AND visibility IN (".implode(',', $visibility).")"; + $result = Database::query($sql); + $row = Database::fetch_array($result); + + return $row['count']; + } } diff --git a/main/inc/lib/extra_field.lib.php b/main/inc/lib/extra_field.lib.php index 44d6008763..dc320a2717 100755 --- a/main/inc/lib/extra_field.lib.php +++ b/main/inc/lib/extra_field.lib.php @@ -1196,13 +1196,27 @@ class ExtraField extends Model ); } } else { + // Ofaj + $attributes = array('multiple' => 'multiple', 'id' => 'extra_'.$field_details['variable']); + $chosenSelect = [ + 'ecouter', + 'lire', + 'participer_a_une_conversation', + 's_exprimer_oralement_en_continu', + 'ecrire' + ]; + + if (in_array($field_details['variable'], $chosenSelect)) { + $attributes['select_chosen'] = true; + } + // default behaviour $form->addElement( 'select', 'extra_'.$field_details['variable'], $field_details['display_text'], $options, - array('multiple' => 'multiple', 'id' => 'extra_'.$field_details['variable']) + $attributes ); } diff --git a/main/inc/lib/extra_field_value.lib.php b/main/inc/lib/extra_field_value.lib.php index 53d88c3fc6..b7c3c3e41e 100755 --- a/main/inc/lib/extra_field_value.lib.php +++ b/main/inc/lib/extra_field_value.lib.php @@ -77,10 +77,11 @@ class ExtraFieldValue extends Model * @param array $params array for the insertion into the *_field_values table * @param bool $forceSave * @param bool $showQuery + * @param array $saveOnlyThisFields * @return mixed false on empty params, void otherwise * @assert (array()) === false */ - public function saveFieldValues($params, $forceSave = false, $showQuery = false) + public function saveFieldValues($params, $forceSave = false, $showQuery = false, $saveOnlyThisFields = []) { foreach ($params as $key => $value) { $found = strpos($key, '__persist__'); @@ -113,6 +114,13 @@ class ExtraFieldValue extends Model } $field_variable = $fieldDetails['variable']; + + if (!empty($saveOnlyThisFields)) { + if (!in_array($field_variable, $saveOnlyThisFields)) { + continue; + } + } + if (isset($params['extra_'.$field_variable])) { $value = $params['extra_'.$field_variable]; } else { diff --git a/main/inc/lib/pear/HTML/QuickForm/select.php b/main/inc/lib/pear/HTML/QuickForm/select.php index 64e6965ea5..a8890ae889 100755 --- a/main/inc/lib/pear/HTML/QuickForm/select.php +++ b/main/inc/lib/pear/HTML/QuickForm/select.php @@ -78,8 +78,17 @@ class HTML_QuickForm_select extends HTML_QuickForm_element if (!empty($attributes['class'])) { $oldClass = $attributes['class']; } + $attributes['class'] = $oldClass . ' selectpicker show-tick form-control'; $attributes['data-live-search'] = 'true'; + // Ofaj + if (isset($attributes['disable_select_effect']) && $attributes['disable_select_effect']) { + $attributes['class'] = 'form-control'; + } + // Ofaj + if (isset($attributes['select_chosen']) && $attributes['select_chosen']) { + $attributes['class'] = 'chzn-select'; + } if (isset($attributes['placeholder'])) { $addBlank = $attributes['placeholder']; diff --git a/main/inc/lib/usermanager.lib.php b/main/inc/lib/usermanager.lib.php index 451184335f..4c1b6945fc 100755 --- a/main/inc/lib/usermanager.lib.php +++ b/main/inc/lib/usermanager.lib.php @@ -5557,4 +5557,17 @@ SQL; return Display::tabsOnlyLink($headers, $optionSelected); } } + + /** + * @return int + */ + public static function getCountActiveUsers() + { + $table = Database::get_main_table(TABLE_MAIN_USER); + $sql = "SELECT count(id) count FROM $table WHERE active = 1"; + $result = Database::query($sql); + $row = Database::fetch_array($result); + + return $row['count']; + } } diff --git a/main/inc/lib/userportal.lib.php b/main/inc/lib/userportal.lib.php index fd7146ae4e..6ba3c427c2 100755 --- a/main/inc/lib/userportal.lib.php +++ b/main/inc/lib/userportal.lib.php @@ -380,6 +380,22 @@ class IndexManager $searchItem = null; + $myCertificate = GradebookUtils::get_certificate_by_user_id( + 0, + $this->user_id + ); + + if ($myCertificate) { + $content .= Display::tag( + 'li', + Display::url( + Display::return_icon('skill-badges.png', get_lang('MyGeneralCertificate'), null, ICON_SIZE_SMALL).get_lang('MyGeneralCertificate'), + api_get_path(WEB_CODE_PATH).'social/my_skills_report.php?a=generate_custom_skill' + ) + ); + } + + if (api_get_setting('allow_public_certificates') == 'true') { $searchItem = Display::tag( 'li', diff --git a/main/inc/local.inc.php b/main/inc/local.inc.php index 9992fac505..26837fffe8 100755 --- a/main/inc/local.inc.php +++ b/main/inc/local.inc.php @@ -1101,6 +1101,7 @@ $is_courseCoach = false; //course coach $is_courseAdmin = false; $is_courseTutor = false; $is_courseMember = false; +$bossHasAccess = false; if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { if (isset($_cid) && $_cid) { @@ -1190,7 +1191,6 @@ if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { } if (isset($user_id) && $user_id && isset($_real_cid) && $_real_cid) { - //Check if user is subscribed in a course $course_user_table = Database::get_main_table(TABLE_MAIN_COURSE_USER); $sql = "SELECT * FROM $course_user_table @@ -1209,6 +1209,23 @@ if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { $is_courseMember = true; } + // Ofaj - student boss can access course if he follows the user + if (isset($_user) && isset($_user['status']) && $_user['status'] == STUDENT_BOSS) { + if (isset($_REQUEST['log_as_user'])) { + $isBoss = UserManager::userIsBossOfStudent($_user['user_id'], $_REQUEST['log_as_user']); + $isUserFollowedInCourse = CourseManager::is_user_subscribed_in_course( + $_REQUEST['log_as_user'], + $_course['code'], + false + ); + + if ($isBoss && $isUserFollowedInCourse) { + $is_courseMember = true; + $bossHasAccess = true; + } + } + } + // We are in a session course? Check session permissions if (!empty($session_id)) { // I'm not the teacher of the course @@ -1236,19 +1253,22 @@ if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { // Am I a session admin? if (isset($row) && isset($row[0]) && $row[0]['session_admin_id'] == $user_id) { - $is_courseMember = false; - $is_courseTutor = false; - $is_courseAdmin = false; - $is_courseCoach = false; - $is_sessionAdmin = true; + $is_courseMember = false; + $is_courseTutor = false; + $is_courseAdmin = false; + $is_courseCoach = false; + $is_sessionAdmin = true; } else { // Am I a session coach for this session? - $sql = "SELECT session.id, session.id_coach FROM $tbl_session session + $sql = "SELECT session.id, session.id_coach + FROM $tbl_session session INNER JOIN $tbl_session_course sc ON sc.session_id = session.id - WHERE session.id = $session_id - AND session.id_coach = $user_id - AND sc.c_id = '$_real_cid'"; + WHERE + session.id = $session_id AND + session.id_coach = $user_id AND + sc.c_id = '$_real_cid' + "; $result = Database::query($sql); if (Database::num_rows($result)) { @@ -1310,6 +1330,26 @@ if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { $is_sessionAdmin = false; $is_courseCoach = false; } + + // Boss validation + if (isset($_REQUEST['log_as_user'])) { + $isBoss = UserManager::userIsBossOfStudent($user_id, $_REQUEST['log_as_user']); + $isUserFollowedInCourse = CourseManager::is_user_subscribed_in_course( + $_REQUEST['log_as_user'], + $_course['code'], + true, + $session_id + ); + + if ($isBoss && $isUserFollowedInCourse) { + $is_courseMember = true; + $is_courseTutor = false; + $is_courseAdmin = false; + $is_courseCoach = false; + $is_sessionAdmin = false; + $bossHasAccess = true; + } + } } } @@ -1345,7 +1385,6 @@ if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { $is_allowed_in_course = false; if (isset($_course) && isset($_course['visibility'])) { - switch ($_course['visibility']) { case COURSE_VISIBILITY_OPEN_WORLD: //3 $is_allowed_in_course = true; @@ -1357,7 +1396,7 @@ if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { $courseCode, $session_id ); - if (isset($user_id) && ($is_platformAdmin || $isUserSubscribedInCourse === true) && !api_is_anonymous($user_id)) { + if (isset($user_id) && ($is_platformAdmin || $isUserSubscribedInCourse === true || $bossHasAccess) && !api_is_anonymous($user_id)) { $is_allowed_in_course = true; } break; diff --git a/main/mySpace/myStudents.php b/main/mySpace/myStudents.php index 984bc65276..54a49aca12 100755 --- a/main/mySpace/myStudents.php +++ b/main/mySpace/myStudents.php @@ -18,7 +18,7 @@ if (!api_is_allowed_to_create_course() && // Check if the user is tutor of the course $user_course_status = CourseManager::get_tutor_in_course_status( api_get_user_id(), - api_get_course_id() + api_get_course_int_id() ); if ($user_course_status != 1) { api_not_allowed(true); @@ -42,10 +42,6 @@ $student_id = intval($_GET['student']); // time spent on the course $courseInfo = api_get_course_info($course_code); -if (empty($sessionId)) { - $sessionId = api_get_session_id(); -} - if ($export) { ob_start(); } @@ -761,8 +757,13 @@ if (!empty($student_id)) { $scoretotal_display ); + $extraParam = ''; + if (api_is_student_boss()) { + $extraParam = '&log_as_user='.$student_id; + } + echo ' - '. + '. $courseInfoItem['title'].' '.$time_spent_on_course .' '.$progress.' @@ -1077,6 +1078,12 @@ if (!empty($student_id)) { $result_exercices = Database::query($sql); $i = 0; + + $extraParam = ''; + if (api_is_student_boss()) { + $extraParam = '&log_as_user='.$student_id; + } + if (Database :: num_rows($result_exercices) > 0) { while ($exercices = Database :: fetch_array($result_exercices)) { $exercise_id = intval($exercices['id']); @@ -1156,14 +1163,14 @@ if (!empty($student_id)) { if (Database :: num_rows($result_last_attempt) > 0) { $id_last_attempt = Database :: result($result_last_attempt, 0, 0); if ($count_attempts > 0) - echo ' + echo ' '.Display::return_icon('quiz.gif').' '; } echo ''; echo ''; - $all_attempt_url = "../exercise/exercise_report.php?exerciseId=$exercise_id&cidReq=$course_code&filter_by_user=$student_id&id_session=$sessionId"; + $all_attempt_url = "../exercise/exercise_report.php?exerciseId=".$exercise_id.$extraParam."&cidReq=$course_code&filter_by_user=$student_id&id_session=$sessionId"; echo Display::url(Display::return_icon('test_results.png', get_lang('AllAttempts'), array(), ICON_SIZE_SMALL), $all_attempt_url ); echo ''; diff --git a/main/template/rainbow/layout/layout_2_col.tpl b/main/template/rainbow/layout/layout_2_col.tpl index e8dce4c749..d2407e4720 100755 --- a/main/template/rainbow/layout/layout_2_col.tpl +++ b/main/template/rainbow/layout/layout_2_col.tpl @@ -42,7 +42,7 @@ @@ -51,7 +51,7 @@ @@ -60,7 +60,7 @@