if ($paper_type == '0') { $result = $mysqli->prepare("(SELECT DISTINCT sid.student_id, username, log_metadata.userID, title, surname, first_names, grade, gender, year, started, log0.q_id, user_answer, q_type, screen, settings FROM (log0, log_metadata, questions, users) LEFT JOIN sid ON users.id = sid.userID WHERE log0.metadataID = log_metadata.id AND log0.q_id = questions.q_id AND log_metadata.userID IN ({$student_list}) AND paperID = ? AND users.id = log_metadata.userID AND (users.roles='Student' OR users.roles='graduate') AND grade LIKE ? AND started >= ? AND started <= ?) UNION ALL (SELECT DISTINCT sid.student_id, username, log_metadata.userID, title, surname, first_names, grade, gender, year, started, log1.q_id, user_answer, q_type, screen, settings FROM (log1, log_metadata, questions, users) LEFT JOIN sid ON users.id = sid.userID WHERE log1.metadataID = log_metadata.id AND log1.q_id = questions.q_id AND log_metadata.userID IN ({$student_list}) AND paperID = ? AND users.id = log_metadata.userID AND (users.roles='Student' OR users.roles='graduate') AND grade LIKE ? AND started >= ? AND started <= ?) ORDER BY surname, first_names, started, userID"); $result->bind_param('isssisss', $paperID, $_GET['repcourse'], $startdate, $enddate, $paperID, $_GET['repcourse'], $startdate, $enddate); } else { $result = $mysqli->prepare("SELECT DISTINCT sid.student_id, username, log_metadata.userID, title, surname, first_names, grade, gender, year, started, log{$paper_type}.q_id, user_answer, q_type, screen, settings FROM (log{$paper_type}, log_metadata, questions, users) LEFT JOIN sid ON users.id = sid.userID WHERE log{$paper_type}.metadataID = log_metadata.id AND log{$paper_type}.q_id = questions.q_id AND log_metadata.userID IN ({$student_list}) AND paperID = ? AND users.id = log_metadata.userID AND (users.roles='Student' OR users.roles='graduate') AND grade LIKE ? AND DATE_ADD(started, INTERVAL 2 MINUTE) >= ? AND started <= ? ORDER BY surname, first_names, started, userID"); $result->bind_param('isss', $paperID, $_GET['repcourse'], $startdate, $enddate); } $result->execute(); $result->bind_result($student_id, $username, $uID, $title, $surname, $first_names, $grade, $gender, $year, $started, $question_ID, $user_answer, $q_type, $screen, $settings); $old_username = ''; while ($result->fetch()) { if ($old_username != $username or $old_started != $started) { $rowID++; } $log_array[$rowID][$screen][$question_ID] = $user_answer; $log_array[$rowID]['student_id'] = demo_replace_number($student_id, $demo); $log_array[$rowID]['userID'] = $uID; $log_array[$rowID]['username'] = $username; $log_array[$rowID]['course'] = $grade; $log_array[$rowID]['year'] = $year; $log_array[$rowID]['started'] = $started; $log_array[$rowID]['title'] = $title; $log_array[$rowID]['surname'] = demo_replace($surname, $demo); $log_array[$rowID]['first_names'] = demo_replace($first_names, $demo); $log_array[$rowID]['name'] = str_replace("'", "", $surname) . ',' . $first_names; $log_array[$rowID]['gender'] = $gender; $log_array[$rowID]['$questionID'] = json_decode($settings, true); $user_no++; $old_username = $username; $old_started = $started; }
} $killer_questions = new Killer_question($paperID, $mysqli); $killer_questions->load(); $killed = false; // Get the module ID and calendar year of the OSCE station. $result = $mysqli->prepare("SELECT username, title, surname, first_names, grade, yearofstudy, student_id FROM (users, sid) WHERE users.id = ? AND users.id = sid.userID"); $result->bind_param('i', $userID); $result->execute(); $result->bind_result($username, $title, $surname, $first_names, $grade, $year, $student_id); $result->fetch(); $result->close(); $original_username = $username; if (isset($demo) and $demo == true) { $surname = demo_replace($surname, $demo); $first_names = demo_replace($first_names, $demo); $student_id = demo_replace_number($student_id, $demo); } $paper_title = $propertyObj->get_paper_title(); $bgcolor = $propertyObj->get_bgcolor(); $fgcolor = $propertyObj->get_fgcolor(); $labelcolor = $propertyObj->get_labelcolor(); $themecolor = $propertyObj->get_themecolor(); $marking = $propertyObj->get_marking(); ?> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="content-type" content="text/html;charset=<?php echo $configObject->get('cfg_page_charset'); ?> " />
<?php $user_details = UserUtils::get_user_details($userID, $mysqli); if ($user_details === false) { $msg = sprintf($string['furtherassistance'], $configObject->get('support_email'), $configObject->get('support_email')); $notice->display_notice_and_exit($mysqli, $string['pagenotfound'], $msg, $string['pagenotfound'], '../artwork/page_not_found.png', '#C00000', true, true); } require '../tools/colour_picker/colour_picker.inc'; require '../include/user_search_options.inc'; require '../include/toprightmenu.inc'; echo draw_toprightmenu(); if ($demo == true) { // Hide the personal details. $user_details['surname'] = demo_replace($user_details['surname'], $demo); $user_details['first_names'] = demo_replace($user_details['first_names'], $demo); $user_details['initials'] = demo_replace($user_details['initials'], $demo); $user_details['student_id'] = demo_replace_number($user_details['student_id'], $demo); $user_details['email'] = demo_replace_username($user_details['email'], $demo); } $course_details = CourseUtils::get_course_details_by_name($user_details['grade'], $mysqli); if ($user_details['user_deleted'] == '') { $bg_color = '#EEF4FF'; } else { $bg_color = '#FFC0C0'; } ?> <div id="content"> <table cellpadding="0" cellspacing="0" border="0" style="background-color:<?php echo $bg_color; ?> ; width:100%; line-height:175%; padding-bottom:10px"> <form name="myform" action="<?php
echo '<td></td>'; } if ($tmp_first_names == '') { $tmp_first_names = ' '; } if ($tmp_surname == '') { $tmp_surname = ' '; } echo '<td>' . demo_replace($tmp_surname, $demo, true, $tmp_surname[0]) . '</td>'; echo '<td>' . demo_replace($tmp_first_names, $demo, true, $tmp_first_names[0]) . '</td>'; echo '<td>' . demo_replace($tmp_username, $demo, false) . '</td>'; if (strpos($tmp_roles, 'Student') !== false) { if ($tmp_student_id == NULL) { echo '<td class="fn">' . $string['unknown'] . '</td>'; } else { echo '<td>' . demo_replace_number($tmp_student_id, $demo) . '</td>'; } } elseif (strpos($tmp_roles, 'Staff') !== false) { echo "<td>Staff</td>"; } else { echo "<td class=\"fn\">" . $string['na'] . "</td>"; } echo "<td>{$tmp_yearofstudy}</td>"; echo "<td>{$tmp_grade}</td></tr>\n"; $x++; } $user_data->close(); $mysqli->close(); ?> </tbody> </table>
/** * Load user data from the log tables and store. * Calls 'writeUserResults' to write into an array. */ private function load_results() { if ($this->studentsonly == 0) { $roles_sql = ''; } else { $roles_sql = " AND (users.roles = 'Student' OR users.roles = 'graduate')"; } $data_array = array(); $metadataids = array(); // Load started records from 'log_metadata'. if ($this->paper_type == '2') { $time_int = 2; } else { $time_int = 0; } $result = $this->db->prepare("SELECT\n log_metadata.id,\n users.id,\n username,\n roles,\n year,\n title,\n surname,\n initials,\n first_names,\n email,\n gender,\n ipaddress,\n lab_name,\n student_id,\n attempt,\n DATE_FORMAT(started, '{$this->config->get('cfg_long_date_time')}') AS display_started,\n started,\n student_grade\n FROM\n log_metadata,\n users\n LEFT JOIN\n sid\n ON\n users.id = sid.userID\n WHERE\n log_metadata.userID = users.id AND\n paperID = ? AND\n grade LIKE ? {$roles_sql} AND\n DATE_ADD(started, INTERVAL {$time_int} MINUTE) >= ?\n AND started <= ?"); $result->bind_param('isss', $this->paperID, $this->repcourse, $this->startdate, $this->enddate); $result->execute(); $result->bind_result($metadataID, $userID, $username, $roles, $year, $title, $surname, $initials, $first_names, $email, $gender, $ipaddress, $lab_name, $student_id, $attempt, $display_started, $started, $student_grade); while ($result->fetch()) { $tmp_name = trim(str_replace("'", "", $surname) . ',' . $first_names); if ($lab_name == '') { $room = '<span style="color:#808080"><unknown></span>'; } else { $room = $lab_name; } if ($this->demo) { $surname = demo_replace($surname, true, true, $surname[0]); $initials = demo_replace($initials, true, true, $initials[0]); $first_names = demo_replace($first_names, true, true, $first_names[0]); $email = demo_replace($email); $student_id = demo_replace_number($student_id); } $this->user_results[$metadataID] = array('metadataID' => $metadataID, 'userID' => $userID, 'username' => $username, 'roles' => $roles, 'year' => $year, 'title' => $title, 'surname' => $surname, 'initials' => $initials, 'first_names' => $first_names, 'name' => $tmp_name, 'email' => $email, 'gender' => $gender, 'ipaddress' => $ipaddress, 'room' => $room, 'student_id' => $student_id, 'attempt' => $attempt, 'visible' => true, 'display_started' => $display_started, 'started' => $started, 'student_grade' => $student_grade, 'mark' => 0, 'percent' => 0, 'questions' => 0, 'duration' => 0, 'marking_complete' => true, 'module' => '', 'paper_type' => $this->paper_type); $metadataids[] = $metadataID; } $result->close(); if (count($metadataids) == 0) { $this->user_results = array(); return false; } $i = 0; $old_screen = 0; $old_duration = 0; $old_metadataID = 0; $user_duration = 0; $marking_complete = 1; $tmp_mark = 0; $tmp_user_mark_array = array(); $log_data = array(); $tmp_array = array(); // Load 'logX' data. if ($this->paper_type == '0' or $this->paper_type == '1') { $result = $this->db->prepare("(SELECT log0.id, metadataID, 0 AS paper_type, questions.q_id, screen, duration, user_answer, q_type, mark FROM log0, questions WHERE log0.q_id = questions.q_id AND metadataID IN (" . implode(',', $metadataids) . ")) UNION ALL (SELECT log1.id, metadataID, 1 AS paper_type, questions.q_id, screen, duration, user_answer, q_type, mark FROM log1, questions WHERE log1.q_id = questions.q_id AND metadataID IN (" . implode(',', $metadataids) . ")) ORDER BY metadataID, screen"); } elseif ($this->paper_type == '5') { $result = $this->db->prepare("SELECT log{$this->paper_type}.id, metadataID, {$this->paper_type} AS paper_type, questions.q_id, 1 AS screen, 0 AS duration, NULL AS user_answer, q_type, mark FROM log{$this->paper_type}, questions WHERE log{$this->paper_type}.q_id = questions.q_id AND metadataID IN (" . implode(',', $metadataids) . ")"); } else { $result = $this->db->prepare("SELECT log{$this->paper_type}.id, metadataID, {$this->paper_type} AS paper_type, questions.q_id, screen, duration, user_answer, q_type, mark FROM log{$this->paper_type}, questions WHERE log{$this->paper_type}.q_id = questions.q_id AND metadataID IN (" . implode(',', $metadataids) . ") ORDER BY metadataID, screen"); } $result->execute(); $result->bind_result($log_id, $metadataID, $paper_type, $q_id, $screen, $duration, $user_answer, $q_type, $mark); while ($result->fetch()) { $userID = $this->user_results[$metadataID]['userID']; if ($this->repmodule != '' and !isset($this->user_modules[$userID]['idMod'])) { continue; // This user is not on the module set in repmodule so don't put them in the array. } // We have passed the check this students should be displayed. $this->user_results[$metadataID]['visible'] = true; if ($old_screen != $screen or $old_metadataID != $metadataID) { $user_duration += $old_duration; } if ($old_metadataID != $metadataID and $old_metadataID != 0) { if (isset($this->user_modules[$userID]['idMod'])) { $this->user_results[$metadataID]['module'] = $this->user_modules[$userID]['idMod']; } else { // No module details set for this user. Perhaps it is an unassigned guest user account. $this->user_results[$metadataID]['module'] = ''; } // Write the user results for the user that was iterated over previously using $old_metadataID $this->writeUserResults($old_metadataID, $tmp_mark, $tmp_user_mark_array, $user_duration, $marking_complete); $tmp_mark = 0; $tmp_user_mark_array = array(); $user_duration = 0; $marking_complete = 1; } else { if (!$old_metadataID) { // This is the first record being iterated over so $old_metadataID is set to 0. if (isset($this->user_modules[$userID]['idMod'])) { $this->user_results[$metadataID]['module'] = $this->user_modules[$userID]['idMod']; } else { // No module details set for this user. Perhaps it is an unassigned guest user account. $this->user_results[$metadataID]['module'] = ''; } } } $this->user_results[$metadataID]['questions']++; $this->user_results[$metadataID]['paper_type'] = $paper_type; $single_mark = $this->getUserMark($q_id, $userID, $user_answer, $mark, $tmp_user_mark_array); $tmp_mark += $single_mark; if ($q_type == 'textbox' and !is_numeric($mark)) { $this->unmarked_textbox = true; $marking_complete = 0; } if ($q_type == 'enhancedcalc' and !is_numeric($mark)) { $this->unmarked_enhancedcalc = true; $marking_complete = 0; } $old_duration = $duration; $old_screen = $screen; $old_metadataID = $metadataID; $log_data[$i]['paper_type'] = $paper_type; $log_data[$i]['adjmark'] = $single_mark; $log_data[$i]['id'] = $log_id; $i++; } $result->close(); if ($old_metadataID != 0) { if ($this->repmodule == '' or isset($this->user_modules[$userID]['idMod']) and $this->user_modules[$userID]['idMod'] == $this->repmodule) { $user_duration += $old_duration; $this->writeUserResults($old_metadataID, $tmp_mark, $tmp_user_mark_array, $user_duration, $marking_complete); } } // Re-index the array. $tmp_array = $this->user_results; unset($this->user_results); $i = 0; foreach ($tmp_array as $metID => $row) { $this->user_results[$i] = $row; $i++; } if ($this->recache and count($log_data) > 0) { $this->db->autocommit(false); $log_query = $this->db->prepare("UPDATE log{$paper_type} SET adjmark = ? WHERE id = ?"); foreach ($log_data as $individual_log_data) { $paper_type = $individual_log_data['paper_type']; $adjmark = $individual_log_data['adjmark']; $log_id = $individual_log_data['id']; $log_query->bind_param('di', $adjmark, $log_id); $log_query->execute(); } $log_query->close(); $this->db->commit(); $this->db->autocommit(true); } }