Add script to move users from one course to another depending on them having passed an exam or not - refs BT#8845
parent
78818df822
commit
f52df87bde
@ -0,0 +1,153 @@ |
||||
<?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_EXERCICES); |
||||
// Get the users who have passed an exam in the course of origin |
||||
$sql = "SELECT distinct(exe_user_id) FROM $tableTEE |
||||
WHERE exe_cours_id = '$originCourse'"; |
||||
//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; |
||||
} |
||||
Loading…
Reference in new issue