You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.5 KiB
154 lines
5.5 KiB
<?php
|
|
/* For licensing terms, see /license.txt */
|
|
/**
|
|
* Script to move users from one course to another if they haven't taken the
|
|
* test in the first course.
|
|
* This script includes logic and side-effects, which is contrary to PSR-1, but
|
|
* it is not considered as a "finished" script to be included in Chamilo.
|
|
* Refs BT#8845
|
|
*/
|
|
/**
|
|
* Init
|
|
*/
|
|
die('Remove the "die()" line to execute this script'.PHP_EOL);
|
|
require __DIR__.'/../../main/inc/global.inc.php';
|
|
// Define origin and destination courses' code
|
|
$originCourse = 'XYZ2014';
|
|
$destinationCourse = 'XYZ2014C2';
|
|
// Set to true to only show what it would do
|
|
$debug = true;
|
|
|
|
/**
|
|
* Check and move users
|
|
*/
|
|
$output = moveUserFromCourseToCourse($originCourse, $destinationCourse, $debug);
|
|
if (empty($output)) {
|
|
$output = 'No output';
|
|
}
|
|
/**
|
|
* Output on screen (use in HTTP only for now)
|
|
*/
|
|
echo '<!DOCTYPE html><html lang="en">'.
|
|
'<head>'.
|
|
'<meta charset="utf-8">'.
|
|
'<link href="'.api_get_path(WEB_CODE_PATH).'css/base.css" media="all" rel="stylesheet" type="text/css" />'.
|
|
'</head>'.
|
|
'<body>'.
|
|
$output.
|
|
'</body></html>';
|
|
|
|
/**
|
|
* Moves a user from course A to course B "the hard way", by only changing
|
|
* the course_rel_user table. This does not remove any data registered in
|
|
* course A, as per requirements.
|
|
* @param string $originCourse Origin course's code
|
|
* @param string $destinationCourse Destination course's code
|
|
* @param bool $debug Whether to only show potential action, or to execute them
|
|
* @return string Output string
|
|
*/
|
|
function moveUserFromCourseToCourse($originCourse, $destinationCourse, $debug = true)
|
|
{
|
|
$eol = PHP_EOL;
|
|
$output = '';
|
|
if (PHP_SAPI != 'cli') {
|
|
$eol = "<br />".$eol;
|
|
}
|
|
|
|
if (empty($originCourse)) {
|
|
return $output;
|
|
} else {
|
|
$originCourse = Database::escape_string($originCourse);
|
|
}
|
|
if (empty($destinationCourse)) {
|
|
return $output;
|
|
} else {
|
|
$destinationCourse = Database::escape_string($destinationCourse);
|
|
}
|
|
$output .= 'Moving students who have no exe results from course '.$originCourse.' to course '.$destinationCourse.$eol;
|
|
$tableCRU = Database::get_main_table(TABLE_MAIN_COURSE_USER);
|
|
$tableTEE = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES);
|
|
$courseId = api_get_course_int_id($originCourse);
|
|
// Get the users who have passed an exam in the course of origin
|
|
$sql = "SELECT distinct(exe_user_id) FROM $tableTEE
|
|
WHERE c_id = $courseId";
|
|
//AND status != 'incomplete'";
|
|
$output .= "$sql".$eol;
|
|
$res = Database::query($sql);
|
|
$users = array(); // users list in array format
|
|
while ($row = Database::fetch_row($res)) {
|
|
$users[] = $row[0];
|
|
}
|
|
// Now get the list of users subscribed to the course of origin
|
|
$sql = "SELECT user_id
|
|
FROM $tableCRU
|
|
WHERE status = ".STUDENT."
|
|
AND course_code = '$originCourse'";
|
|
$output .= "$sql".$eol;
|
|
$res = Database::query($sql);
|
|
$numUsers = Database::num_rows($res);
|
|
if ($numUsers < 1) {
|
|
return $output; //no user registered in first course
|
|
}
|
|
// Now get the list of users subscribed to the course of origin
|
|
$sqlDestination = "SELECT user_id
|
|
FROM $tableCRU
|
|
WHERE status = ".STUDENT."
|
|
AND course_code = '$destinationCourse'";
|
|
$output .= "$sqlDestination".$eol;
|
|
$resDestination = Database::query($sqlDestination);
|
|
$destinationUsers = array();
|
|
while ($row = Database::fetch_assoc($resDestination)) {
|
|
$destinationUsers[] = $row['user_id'];
|
|
}
|
|
|
|
// List of users with no attempt
|
|
$noAttemptUsers = array();
|
|
// List of users with an attempt
|
|
$attemptUsers = array();
|
|
$i = 0;
|
|
$output .= '<ul>';
|
|
while ($row = Database::fetch_assoc($res)) {
|
|
$i++;
|
|
// If there are results from
|
|
if (in_array($row['user_id'], $users)) {
|
|
// This user has already attempted
|
|
$u = api_get_user_info($row['user_id']);
|
|
$attemptUsers[$row['user_id']] = $u;
|
|
$output .= '<li class="muted">';
|
|
$output .= $i.' - User '.$u['lastname'].' '.$u['firstname'].' <'.$u['email'].'> has results.';
|
|
$output .= '</li>'.PHP_EOL;
|
|
} else {
|
|
// This user hasn't attempted anything
|
|
$u = api_get_user_info($row['user_id']);
|
|
if (in_array($row['user_id'], $destinationUsers)) {
|
|
$output .= '<li class="muted">';
|
|
$output .= $i.' - User '.$u['lastname'].' '.$u['firstname'].' <'.$u['email'].'> has no results but is already in the destination course.'.$eol;
|
|
$output .= '</li>'.PHP_EOL;
|
|
} else {
|
|
$output .= '<li class="">';
|
|
$output .= $i.' - User '.$u['lastname'].' '.$u['firstname'].' <'.$u['email'].'> has no results and will be moved.'.$eol;
|
|
$noAttemptUsers[$row['user_id']] = $u;
|
|
$output .= '</li>'.PHP_EOL;
|
|
}
|
|
}
|
|
}
|
|
$output .= '</ul>';
|
|
if ($debug) {
|
|
return $output;
|
|
}
|
|
// If not debug mode, execute the move!
|
|
$j = 0;
|
|
foreach ($noAttemptUsers as $userId => $userInfo) {
|
|
// unsubscribe
|
|
$sql = "DELETE FROM $tableCRU WHERE course_code = '$originCourse' AND user_id = $userId";
|
|
$output .= $sql.$eol;
|
|
Database::query($sql);
|
|
$sql = "INSERT INTO $tableCRU (course_code, user_id, status)
|
|
VALUES ('$destinationCourse', $userId, ".STUDENT.")";
|
|
$output .= $sql.$eol;
|
|
Database::query($sql);
|
|
$j++;
|
|
}
|
|
$output .= "$j users have been moved".$eol;
|
|
return $output;
|
|
}
|
|
|