Merge pull request #4187 from christianbeeznest/majorel-19732

Course - Add relatio type EXLEARNER when user extrafield value is changed - refs BT#19732
pull/4198/head
Nicolas Ducoulombier 4 years ago committed by GitHub
commit 98909c821b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      main/admin/user_edit.php
  2. 1
      main/inc/lib/api.lib.php
  3. 6
      main/inc/lib/course.lib.php
  4. 147
      main/inc/lib/usermanager.lib.php
  5. 3
      main/install/configuration.dist.php
  6. 38
      main/tracking/courseLog.php
  7. 90
      tests/scripts/set_course_user_as_exlearner.php

@ -514,6 +514,15 @@ if ($form->validate()) {
}
}
// It updates course relation type as EX-LEARNER if project name (extra field from user_edition_extra_field_to_check) is changed
if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) {
$extraToCheck = api_get_configuration_value('user_edition_extra_field_to_check');
if (isset($user['extra_'.$extraToCheck])) {
$extraValueToCheck = $user['extra_'.$extraToCheck];
UserManager::updateCourseRelationTypeExLearner($user_id, $extraValueToCheck);
}
}
$extraFieldValue = new ExtraFieldValue('user');
$extraFieldValue->saveFieldValues($user);
$userInfo = api_get_user_info($user_id);

@ -47,6 +47,7 @@ define('COURSE_TUTOR', 16); // student is tutor of a course (NOT in session)
define('STUDENT_BOSS', 17); // student is boss
define('INVITEE', 20);
define('HRM_REQUEST', 21); //HRM has request for vinculation with user
define('COURSE_EXLEARNER', 22);
// Table of status
$_status_list[COURSEMANAGER] = 'teacher'; // 1

@ -4055,6 +4055,11 @@ class CourseManager
}
}
$exlearnerCondition = "";
if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) {
$exlearnerCondition = " AND course_rel_user.relation_type NOT IN(".COURSE_EXLEARNER.")";
}
$sql = "SELECT DISTINCT
course.id,
course_rel_user.status status,
@ -4071,6 +4076,7 @@ class CourseManager
$userCategoryCondition
$without_special_courses
$languageCondition
$exlearnerCondition
";
// If multiple URL access mode is enabled, only fetch courses
// corresponding to the current URL.

@ -3992,6 +3992,11 @@ class UserManager
}
}
$exlearnerCondition = "";
if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) {
$exlearnerCondition = " AND scu.status NOT IN(".COURSE_EXLEARNER.")";
}
/* This query is very similar to the query below, but it will check the
session_rel_course_user table if there are courses registered
to our user or not */
@ -4012,6 +4017,7 @@ class UserManager
scu.user_id = $user_id AND
scu.session_id = $session_id
$where_access_url
$exlearnerCondition
ORDER BY sc.position ASC";
$myCourseList = [];
@ -4055,6 +4061,7 @@ class UserManager
s.id_coach = $user_id
)
$where_access_url
$exlearnerCondition
ORDER BY sc.position ASC";
$result = Database::query($sql);
@ -6062,6 +6069,146 @@ class UserManager
return true;
}
/**
* It updates course relation type as EX-LEARNER if project name (extra field from user_edition_extra_field_to_check) is changed.
*
* @param $userId
* @param $extraValue
*
* @throws \Doctrine\DBAL\Exception
*/
public static function updateCourseRelationTypeExLearner($userId, $extraValue)
{
if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) {
$extraToCheck = api_get_configuration_value('user_edition_extra_field_to_check');
// Get the old user extra value to check
$userExtra = UserManager::get_extra_user_data_by_field($userId, $extraToCheck);
if (isset($userExtra[$extraToCheck]) && $userExtra[$extraToCheck] != $extraValue) {
// it searchs the courses with the user old extravalue
$extraFieldValues = new ExtraFieldValue('course');
$extraItems = $extraFieldValues->get_item_id_from_field_variable_and_field_value($extraToCheck, $userExtra[$extraToCheck], false, false, true);
$coursesTocheck = [];
if (!empty($extraItems)) {
foreach ($extraItems as $items) {
$coursesTocheck[] = $items['item_id'];
}
}
// To check in main course
if (!empty($coursesTocheck)) {
$tblCourseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
foreach ($coursesTocheck as $courseId) {
$sql = "SELECT id FROM $tblCourseUser
WHERE user_id = $userId AND c_id = $courseId";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
$id = Database::result($rs, 0, 0);
$sql = "UPDATE $tblCourseUser SET relation_type = ".COURSE_EXLEARNER."
WHERE id = $id";
Database::query($sql);
}
}
}
// To check in sessions
if (!empty($coursesTocheck)) {
$tblSessionCourseUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$tblSessionUser = Database::get_main_table(TABLE_MAIN_SESSION_USER);
$sessionsToCheck = [];
foreach ($coursesTocheck as $courseId) {
$sql = "SELECT id, session_id FROM $tblSessionCourseUser
WHERE user_id = $userId AND c_id = $courseId";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
$row = Database::fetch_array($rs);
$id = $row['id'];
$sessionId = $row['session_id'];
$sql = "UPDATE $tblSessionCourseUser SET status = ".COURSE_EXLEARNER."
WHERE id = $id";
Database::query($sql);
$sessionsToCheck[] = $sessionId;
}
}
// It checks if user is ex-learner in all courses in the session to update the session relation type
if (!empty($sessionsToCheck)) {
$sessionsToCheck = array_unique($sessionsToCheck);
foreach ($sessionsToCheck as $sessionId) {
$checkAll = Database::query("SELECT count(id) FROM $tblSessionCourseUser WHERE user_id = $userId AND session_id = $sessionId");
$countAll = Database::result($checkAll, 0, 0);
$checkExLearner = Database::query("SELECT count(id) FROM $tblSessionCourseUser WHERE status = ".COURSE_EXLEARNER." AND user_id = $userId AND session_id = $sessionId");
$countExLearner = Database::result($checkExLearner, 0, 0);
if ($countAll > 0 && $countAll == $countExLearner) {
$sql = "UPDATE $tblSessionUser SET relation_type = ".COURSE_EXLEARNER."
WHERE user_id = $userId AND session_id = $sessionId";
Database::query($sql);
}
}
}
}
// To check users inside a class
$tblUserGroupRelUser = Database::get_main_table(TABLE_USERGROUP_REL_USER);
$tblUserGroupRelCourse = Database::get_main_table(TABLE_USERGROUP_REL_COURSE);
$tblUserGroupRelSession = Database::get_main_table(TABLE_USERGROUP_REL_SESSION);
$rsUser = Database::query("SELECT usergroup_id FROM $tblUserGroupRelUser WHERE user_id = $userId");
if (Database::num_rows($rsUser) > 0) {
while ($rowUser = Database::fetch_array($rsUser)) {
$usergroupId = $rowUser['usergroup_id'];
// Count courses with exlearners
$sqlC1 = "SELECT count(id) FROM $tblUserGroupRelCourse WHERE usergroup_id = $usergroupId";
$rsCourses = Database::query($sqlC1);
$countGroupCourses = Database::result($rsCourses, 0, 0);
$sqlC2 = "SELECT count(cu.id)
FROM $tblCourseUser cu
INNER JOIN $tblUserGroupRelCourse gc
ON gc.course_id = cu.c_id
WHERE
cu.user_id = $userId AND
usergroup_id = $usergroupId AND
relation_type = ".COURSE_EXLEARNER;
$rsExCourses = Database::query($sqlC2);
$countExCourses = Database::result($rsExCourses, 0, 0);
$checkedExCourses = $countGroupCourses > 0 && ($countExCourses == $countGroupCourses);
// Count sessions with exlearners
$sqlS1 = "SELECT count(id) FROM $tblUserGroupRelSession WHERE usergroup_id = $usergroupId";
$rsSessions = Database::query($sqlS1);
$countGroupSessions = Database::result($rsSessions, 0, 0);
$sqlS2 = "SELECT count(su.id)
FROM $tblSessionUser su
INNER JOIN $tblUserGroupRelSession gs
ON gs.session_id = su.session_id
WHERE
su.user_id = $userId AND
usergroup_id = $usergroupId AND
relation_type = ".COURSE_EXLEARNER;
$rsExSessions = Database::query($sqlS2);
$countExSessions = Database::result($rsExSessions, 0, 0);
$checkedExSessions = $countGroupSessions > 0 && ($countExSessions == $countGroupSessions);
// it checks if usergroup user should be set to EXLEARNER
$checkedExClassLearner = false;
if ($countGroupCourses > 0 && $countGroupSessions == 0) {
$checkedExClassLearner = $checkedExCourses;
} elseif ($countGroupCourses == 0 && $countGroupSessions > 0) {
$checkedExClassLearner = $checkedExSessions;
} elseif ($countGroupCourses > 0 && $countGroupSessions > 0) {
$checkedExClassLearner = ($checkedExCourses && $checkedExSessions);
}
if ($checkedExClassLearner) {
Database::query("UPDATE $tblUserGroupRelUser SET relation_type = ".COURSE_EXLEARNER." WHERE user_id = $userId AND usergroup_id = $usergroupId");
}
}
}
}
}
}
/**
* Subscribe boss to students, if $bossList is empty then the boss list will be empty too.
*

@ -2147,6 +2147,9 @@ INSERT INTO `extra_field` (`extra_field_type`, `field_type`, `variable`, `displa
// Hides the icon of percentage in "Average of tests in Learning Paths" indication on a student tracking
// $_configuration['student_follow_page_hide_lp_tests_average'] = false;
// User extra fields to be check on user edition to generate a specific process if it was modified
//$_configuration['user_edition_extra_field_to_check'] = 'ExtrafieldLabel';
// KEEP THIS AT THE END
// -------- Custom DB changes
// Add user activation by confirmation email

@ -404,6 +404,22 @@ if ($nbStudents > 0) {
$select->addOptGroup($groupIdList, get_lang('Group'));
$formClass->addButtonSearch(get_lang('Search'));
// Filter by ex learners
if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) {
$formExLearners = new FormValidator(
'form_exlearners',
'get',
api_get_self().'?'.api_get_cidreq().'&'.$additionalParams
);
$group = [];
$group[] = $formExLearners->createElement('radio', 'opt_exlearner', 'id="opt_exlearner1"', get_lang('Yes'), 1);
$group[] = $formExLearners->createElement('radio', 'opt_exlearner', 'id="opt_exlearner0"', get_lang('No'), 0);
$formExLearners->addGroup($group, 'exlearner', get_lang('ToHideExlearners'));
$formExLearners->addHidden('cidReq', $courseCode);
$formExLearners->addHidden('id_session', $sessionId);
$formExLearners->addButtonSearch(get_lang('Search'));
}
// Groups
/*$formGroup = new FormValidator(
'groups',
@ -499,6 +515,25 @@ if ($nbStudents > 0) {
$conditions = ['where' => $whereCondition, 'inject_joins' => $joins];
}
}
if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) {
if ($formExLearners->validate()) {
$formValue = $formExLearners->getSubmitValue('exlearner');
if (isset($formValue['opt_exlearner']) && 1 == $formValue['opt_exlearner']) {
$sessionId = api_get_session_id();
if (!empty($sessionId)) {
$tableSessionCourseUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$joins = " INNER JOIN $tableSessionCourseUser scu ON scu.user_id = user.id ";
$whereCondition = " AND scu.status != ".COURSE_EXLEARNER." AND scu.c_id = '".api_get_course_int_id()."' AND scu.session_id = $sessionId";
$conditions = ['where' => $whereCondition, 'inject_joins' => $joins];
} else {
$tableCourseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$joins = " INNER JOIN $tableCourseUser cu ON cu.user_id = user.id ";
$whereCondition = " AND cu.relation_type != ".COURSE_EXLEARNER." AND cu.c_id = '".api_get_course_int_id()."'";
$conditions = ['where' => $whereCondition, 'inject_joins' => $joins];
}
}
}
}
if ($formActiveUsers->validate()) {
$formValue = $formActiveUsers->getSubmitValue('active');
@ -611,6 +646,9 @@ if ($nbStudents > 0) {
$mainForm->addHtml('<div id="advanced_search_options" style="display:none;">');
$mainForm->addHtml($formClass->returnForm());
$mainForm->addHtml($formExtraField->returnForm());
if (false !== api_get_configuration_value('user_edition_extra_field_to_check')) {
$mainForm->addHtml($formExLearners->returnForm());
}
$mainForm->addHtml($formActiveUsers->returnForm());
$mainForm->addHtml('</div>');
$html .= $mainForm->returnForm();

@ -0,0 +1,90 @@
<?php
/* For license terms, see /license.txt */
/**
* Change to ex-learner the users subscribed in courses with different project value (user_edition_extra_field_to_check)
*
*/
exit;
if (PHP_SAPI != 'cli') {
die('This script can only be launched from the command line');
}
require_once __DIR__.'/../../main/inc/global.inc.php';
if (false === api_get_configuration_value('user_edition_extra_field_to_check')) {
die('You should to set the extra variable to check from setting user_edition_extra_field_to_check in configuration.php');
}
$extraToCheck = api_get_configuration_value('user_edition_extra_field_to_check');
$tblUser = Database::get_main_table(TABLE_MAIN_USER);
$sql = "SELECT id FROM $tblUser
WHERE status NOT IN(".ANONYMOUS.")";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
while ($row = Database::fetch_array($rs, 'ASSOC')) {
$userId = $row['id'];
$userExtra = UserManager::get_extra_user_data_by_field($userId, $extraToCheck);
if (isset($userExtra[$extraToCheck])) {
echo "<br>Checking user_id : $userId the extrafield $extraToCheck with value {$userExtra[$extraToCheck]}:<br>" . PHP_EOL;
// It gets the courses with the same extra value
$extraFieldValues = new ExtraFieldValue('course');
$extraItems = $extraFieldValues->get_item_id_from_field_variable_and_field_value($extraToCheck, $userExtra[$extraToCheck], false, false, true);
$coursesTocheck = [];
if (!empty($extraItems)) {
foreach ($extraItems as $items) {
$coursesTocheck[] = $items['item_id'];
}
}
// To check in main course
if (!empty($coursesTocheck)) {
$tblCourseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$sql1 = "SELECT id FROM $tblCourseUser
WHERE user_id = $userId AND c_id NOT IN(".implode(',', $coursesTocheck).")";
$rs1 = Database::query($sql1);
if (Database::num_rows($rs1) > 0) {
while ($row1 = Database::fetch_array($rs1, 'ASSOC')) {
$id = $row1['id'];
$upd1 = "UPDATE $tblCourseUser SET relation_type = ".COURSE_EXLEARNER."
WHERE id = $id";
Database::query($upd1);
}
}
}
// To check in sessions
if (!empty($coursesTocheck)) {
$tblSessionCourseUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$tblSessionUser = Database::get_main_table(TABLE_MAIN_SESSION_USER);
$sessionsToCheck = [];
$sql2 = "SELECT id, session_id FROM $tblSessionCourseUser
WHERE user_id = $userId AND c_id NOT IN(".implode(',', $coursesTocheck).")";
$rs2 = Database::query($sql2);
if (Database::num_rows($rs2) > 0) {
while ($row2 = Database::fetch_array($rs2, 'ASSOC')) {
$id = $row2['id'];
$sessionId = $row2['session_id'];
$upd2 = "UPDATE $tblSessionCourseUser SET status = ".COURSE_EXLEARNER."
WHERE id = $id";
Database::query($upd2);
$sessionsToCheck[] = $sessionId;
}
}
// It checks if user is ex-learner in all courses in the session to update the session relation type
if (!empty($sessionsToCheck)) {
$sessionsToCheck = array_unique($sessionsToCheck);
foreach ($sessionsToCheck as $sessionId) {
$checkAll = Database::query("SELECT count(id) FROM $tblSessionCourseUser WHERE user_id = $userId AND session_id = $sessionId");
$countAll = Database::result($checkAll, 0, 0);
$checkExLearner = Database::query("SELECT count(id) FROM $tblSessionCourseUser WHERE status = ".COURSE_EXLEARNER." AND user_id = $userId AND session_id = $sessionId");
$countExLearner = Database::result($checkExLearner, 0, 0);
if ($countAll > 0 && $countAll == $countExLearner) {
$upd3 = "UPDATE $tblSessionUser SET relation_type = ".COURSE_EXLEARNER."
WHERE user_id = $userId AND session_id = $sessionId";
Database::query($upd3);
}
}
}
// @todo To check users inside a class
}
}
}
}
Loading…
Cancel
Save