Course - Add relatio type EXLEARNER when user extrafield value is changed - refs BT#19732

pull/4187/head
Christian 4 years ago
parent 9128008e26
commit ba8480eff0
  1. 9
      main/admin/user_edit.php
  2. 1
      main/inc/lib/api.lib.php
  3. 6
      main/inc/lib/course.lib.php
  4. 89
      main/inc/lib/usermanager.lib.php
  5. 3
      main/install/configuration.dist.php
  6. 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.

@ -3988,6 +3988,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 */
@ -4008,6 +4013,7 @@ class UserManager
scu.user_id = $user_id AND
scu.session_id = $session_id
$where_access_url
$exlearnerCondition
ORDER BY sc.position ASC";
$myCourseList = [];
@ -4051,6 +4057,7 @@ class UserManager
s.id_coach = $user_id
)
$where_access_url
$exlearnerCondition
ORDER BY sc.position ASC";
$result = Database::query($sql);
@ -6058,6 +6065,88 @@ 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);
}
}
}
}
// @todo To check users inside a class
}
}
}
/**
* Subscribe boss to students, if $bossList is empty then the boss list will be empty too.
*

@ -2133,6 +2133,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

@ -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