00001 <?php
00002 if(!defined('__PRAGYAN_CMS'))
00003 {
00004 header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
00005 echo "<h1>403 Forbidden<h1><h4>You are not authorized to access the page.</h4>";
00006 echo '<hr/>'.$_SERVER['SERVER_SIGNATURE'];
00007 exit(1);
00008 }
00009
00010
00011
00012
00013 function isQuizEvaluated($quizId) {
00014 $countQuery = "SELECT COUNT(*) FROM `quiz_userattempts` WHERE `quiz_marksallotted` IS NULL AND `page_modulecomponentid` = $quizId";
00015 $countResult = mysql_query($countQuery);
00016 $countRow = mysql_fetch_row($countResult);
00017 return $countRow[0] == 0;
00018 }
00019
00024 function evaluateQuiz($quizId) {
00025 $updateQuery = <<<UPDATEQUERY
00026 UPDATE `quiz_answersubmissions` SET `quiz_marksallotted` = (
00027 SELECT
00028 IF(`quiz_submittedanswer` IS NULL OR `quiz_submittedanswer` = '', 0,
00029 IF(`ques`.`quiz_questiontype` = 'subjective', `quiz_answersubmissions`.`quiz_marksallotted`,
00030 IF(`quiz_submittedanswer` = `quiz_rightanswer`, `question_positivemarks`, -`question_negativemarks`)
00031 )
00032 ) AS `mark`
00033 FROM `quiz_questions` AS `ques`, (SELECT * FROM `quiz_answersubmissions`) AS `ans`, `quiz_weightmarks` AS `weights`
00034 WHERE
00035 `ques`.`page_modulecomponentid` = $quizId AND
00036 `ans`.`page_modulecomponentid` = $quizId AND
00037 `weights`.`page_modulecomponentid` = $quizId AND
00038 `weights`.`question_weight` = `ques`.`quiz_questionweight` AND
00039 `ques`.`quiz_sectionid` = `ans`.`quiz_sectionid` AND
00040 `ques`.`quiz_questionid` = `ans`.`quiz_questionid` AND
00041 `ques`.`quiz_questiontype` IN ('sso', 'mso') AND
00042 `ques`.`quiz_sectionid` = `quiz_answersubmissions`.`quiz_sectionid` AND
00043 `ques`.`quiz_questionid` = `quiz_answersubmissions`.`quiz_questionid` AND
00044 `ans`.`user_id` = `quiz_answersubmissions`.`user_id`
00045 )
00046 WHERE `page_modulecomponentid` = $quizId
00047 UPDATEQUERY;
00048
00049
00050 $updateResult = mysql_query($updateQuery);
00051 if (!$updateResult) {
00052 displayerror('Database Error. Could not correct questions.');
00053 return false;
00054 }
00055
00056 return true;
00057 }
00062 function updateSectionMarks($quizId) {
00063 $updateQuery = "UPDATE `quiz_userattempts` SET `quiz_marksallotted` = (" .
00064 "SELECT SUM(`quiz_marksallotted`) FROM `quiz_answersubmissions` WHERE " .
00065 "`quiz_answersubmissions`.`user_id` = `quiz_userattempts`.`user_id` AND " .
00066 "`quiz_answersubmissions`.`quiz_sectionid` = `quiz_userattempts`.`quiz_sectionid` AND " .
00067 "`quiz_answersubmissions`.`page_modulecomponentid` = $quizId" .
00068 ") WHERE `page_modulecomponentid` = $quizId";
00069 $updateResult = mysql_query($updateQuery);
00070
00071 if (!$updateResult) {
00072 displayerror('Database Error. Could not update section marks. ' . $updateQuery . ' ' . mysql_error());
00073 return false;
00074 }
00075
00076 return true;
00077 }
00078
00079 function getWeights($quizId) {
00080 $weighs = array();
00081 $result = mysql_query("SELECT `quiz_questionweight` FROM `quiz_questions` WHERE `page_modulecomponentid` = $quizId AND `quiz_questionweight` NOT IN (SELECT `question_weight` FROM `quiz_weightmarks` WHERE `page_modulecomponentid` = $quizId)");
00082 while($row = mysql_fetch_assoc($result))
00083 $weighs[] = $row['quiz_questionweight'];
00084 return $weighs;
00085 }
00086
00087 function getQuizUserListHtml($quizId) {
00088
00089
00090 $quizRow = getQuizRow($quizId);
00091 $weights = getWeights($quizId);
00092
00093 if(count($weights) > 0) {
00094 displayerror("Marks for questions with weight " . join(", ", $weights) . " is not set. Correct the quiz after setting marks for all weigh. You can set that in <a href='./+edit#quizWeightMarks'>Edit</a>.");
00095 return '';
00096 }
00097
00098 if (!isQuizEvaluated($quizId)||isset($_POST['btnRecalculateMarks']))
00099 evaluateQuiz($quizId);
00100 updateSectionMarks($quizId);
00101 $tableJqueryStuff="";
00102 $numSecColumns=0;
00103 $userTable = MYSQL_DATABASE_PREFIX . 'users';
00104 $markQuery = "SELECT `$userTable`.`user_email` AS `email`, `$userTable`.`user_id` AS `user_id`, SUM(`quiz_marksallotted`) AS `total`, MIN(`quiz_attemptstarttime`) AS `starttime`, MAX(`quiz_submissiontime`) AS `finishtime`, TIMEDIFF(MAX(`quiz_submissiontime`), MIN(`quiz_attemptstarttime`)) AS `timetaken` FROM `$userTable`, `quiz_userattempts` WHERE " .
00105 "`$userTable`.`user_id` = `quiz_userattempts`.`user_id` AND " .
00106 "`quiz_userattempts`.`page_modulecomponentid` = $quizId " .
00107 "GROUP BY `quiz_userattempts`.`user_id` ORDER BY `total` DESC, `timetaken`, `starttime`, `finishtime`, `email`";
00108 $markResult = mysql_query($markQuery);
00109 if (!$markResult) {
00110 displayerror($markQuery . ' ' . mysql_error());
00111 }
00112 $query = mysql_fetch_array(mysql_query("SELECT `quiz_title` FROM `quiz_descriptions` WHERE `page_modulecomponentid` = $quizId"));
00113 $result = mysql_query("SELECT `quiz_sectiontitle` FROM `quiz_sections` WHERE `page_modulecomponentid` = '$quizId' ORDER BY `quiz_sectionid`");
00114 $sectionHead = "";
00115 $secCols="";
00116 $toggleColumns="<tr><td><input type='checkbox' onclick='fnShowHide(0);' checked />User Full Name<br/></td>";
00117 $toggleColumns.="<td><input type='checkbox' onclick='fnShowHide(1);' />User Email<br/></td>";
00118 $toggleColumns.="<td><input type='checkbox' onclick='fnShowHide(2);' checked />Marks<br/></td>";
00119 $toggleColumns.="<td><input type='checkbox' onclick='fnShowHide(3);' checked />Time Taken<br/></td>";
00120 $toggleColumns.="<td><input type='checkbox' onclick='fnShowHide(4);' />Started<br/></td>";
00121 $toggleColumns.="<td><input type='checkbox' onclick='fnShowHide(5);' />Finished<br/></td>";
00122
00123 $c=6;
00124 while($row = mysql_fetch_array($result))
00125 {
00126 $sectionHead .= "<th>Section : {$row['quiz_sectiontitle']}</th>";
00127 $tableJqueryStuff.="null,";
00128 if($c%6==0) $secCols.="</tr><tr>";
00129 $secCols.="<td><input type='checkbox' onclick='fnShowHide($c);' checked />Section : {$row['quiz_sectiontitle']}<br/></td>";
00130 $numSecColumns++;
00131 $c++;
00132 }
00133 $secCols.="</tr>";
00134 $toggleColumns.=$secCols;
00135 global $urlRequestRoot, $cmsFolder, $STARTSCRIPTS;
00136
00137 $tableJqueryStuff=<<<STUFF
00138 null,
00139 { "bVisible": false },
00140 null,
00141 null,
00142 { "bVisible": false },
00143 { "bVisible": false },
00144 $tableJqueryStuff
00145 null
00146 STUFF;
00147
00148 $smarttable = smarttable::render(array('userstable'),array('userstable'=>array('aoColumns'=>"$tableJqueryStuff")));
00149
00150 $STARTSCRIPTS.="initSmartTable();";
00151
00152
00153 $userListHtml = <<<HEAD
00154 $smarttable
00155 <script type="text/javascript" charset="utf-8">
00156 function fnShowHide( iCol )
00157 {
00158 var bVis = oTable.fnSettings().aoColumns[iCol].bVisible;
00159 oTable.fnSetColumnVis( iCol, bVis ? false : true );
00160 }
00161
00162 </script>
00163
00164 HEAD;
00165
00166 global $ICONS_SRC,$ICONS;
00167 $userListHtml .= "<h3>User Submissions for Quiz: {$query[0]}</h3>
00168 <fieldset><legend>Select Columns</legend><table>$toggleColumns</table></fieldset>" .
00169 "<form action='./+correct' method=POST><input type='submit' value='Recalculate Marks' name='btnRecalculateMarks' /></form>
00170 <table class=\"userlisttable display\" border=\"1\" id='userstable'>" .
00171 "<thead><tr><th>User Full Name</th><th>User Email</th><th>Total Marks</th><th>Time Taken</th><th>Started</th><th>Finished</th>$sectionHead<th>Action</th></tr></thead><tbody>";
00172 while ($markRow = mysql_fetch_assoc($markResult)) {
00173 $userMarks = "";
00174 $marksResult = mysql_query("SELECT `quiz_marksallotted`,`quiz_sectionid` FROM `quiz_userattempts` WHERE `user_id` = {$markRow['user_id']} AND `page_modulecomponentid` = $quizId ORDER BY `quiz_sectionid`");
00175 $cc=1;
00176
00177 while($row = mysql_fetch_array($marksResult))
00178 {
00179
00180 if($row['quiz_sectionid']!=$cc)
00181 {
00182 while($row['quiz_sectionid']>$cc) { $userMarks .= "<td>-0</td>"; $cc++; }
00183 }
00184 $userMarks .= "<td>{$row['quiz_marksallotted']}</td>";
00185 $cc++;
00186
00187 }
00188
00189 while($cc<=$numSecColumns) { $userMarks .= "<td>-0</td>"; $cc++;}
00190 if (is_null($markRow['finishtime'])) {
00191 $markRow['finished'] = 0;
00192 $markRow['finishtime'] = 'NULL';
00193 }
00194 $userfullname=getUserFullNameFromEmail($markRow['email']);
00195 if($userfullname=="") $userfullname="Anonymous";
00196 $userListHtml .= "<tr><td>$userfullname</td><td>{$markRow['email']}</td><td>{$markRow['total']}</td><td>{$markRow['timetaken']}</td><td>{$markRow['starttime']}</td><td>{$markRow['finishtime']}</td>$userMarks";
00197 $userListHtml .= '<td><form name="userclearform" method="POST" action=""><input type="hidden" name="hdnUserId" id="hdnUserId" value="' . $markRow['user_id'] . "\" /><a href=\"./+correct&useremail={$markRow['email']}\">".$ICONS['Correct']['small'].'</a><input type="image" src="'.$ICONS_SRC["Delete"]["small"].'" name="btnDeleteUser" id="btnDeleteUser" value="Reject Submission" title="Reject Submission"/></form></td>';
00198 $userListHtml .= "</tr>\n";
00199 }
00200 $userListHtml .= "</tbody></table>\n";
00201
00202 return $userListHtml;
00203 }
00204
00205 function getQuizCorrectForm($quizId, $userId) {
00206 $marks = mysql_fetch_array(mysql_query("SELECT SUM(`quiz_marksallotted`) AS `total`, MIN(`quiz_attemptstarttime`) AS `starttime`, MAX(`quiz_submissiontime`) AS `finishtime`, TIMEDIFF(MAX(`quiz_submissiontime`), MIN(`quiz_attemptstarttime`)) AS `timetaken` FROM `quiz_userattempts` WHERE `user_id` = {$userId} AND `page_modulecomponentid` = $quizId"));
00207 $title = mysql_fetch_array(mysql_query("SELECT `quiz_title` FROM `quiz_descriptions` WHERE `page_modulecomponentid` = '$quizId'"));
00208
00209 $correctFormHtml = "";
00210 $sectionHead="";
00211
00212 $sections = mysql_query("SELECT `quiz_sections`.`quiz_sectiontitle` AS `quiz_sectiontitle`, `quiz_sections`.`quiz_sectionid` AS `quiz_sectionid`, `quiz_marksallotted` FROM `quiz_userattempts` JOIN `quiz_sections` ON `quiz_userattempts`.`quiz_sectionid` = `quiz_sections`.`quiz_sectionid` WHERE `user_id` = $userId AND `quiz_userattempts`.`page_modulecomponentid` = $quizId AND `quiz_sections`.`page_modulecomponentid` = $quizId");
00213
00214 while($sectionsRow = mysql_fetch_array($sections)) {
00215 $correctFormHtml .= "<h4>{$sectionsRow['quiz_sectiontitle']}(Marks: {$sectionsRow['quiz_marksallotted']})</h4>";
00216 $sectionHead .="<td><b>{$sectionsRow['quiz_sectiontitle']}</b> section marks: {$sectionsRow['quiz_marksallotted']}</td>";
00217
00218
00219 $questionQuery = "SELECT `quiz_questions`.`quiz_questionid` AS `quiz_questionid`, " .
00220 "`quiz_questions`.`quiz_question` AS `quiz_question`, `quiz_questiontype`, " .
00221 "`quiz_rightanswer`, `quiz_submittedanswer`, `quiz_marksallotted`,`quiz_questions`.`quiz_sectionid` " .
00222 "FROM `quiz_questions`, `quiz_answersubmissions` WHERE " .
00223 "`quiz_questions`.`page_modulecomponentid` = $quizId AND " .
00224 "`quiz_questions`.`page_modulecomponentid` = `quiz_answersubmissions`.`page_modulecomponentid` AND " .
00225 "`quiz_questions`.`quiz_sectionid` = `quiz_answersubmissions`.`quiz_sectionid` AND " .
00226 "`quiz_questions`.`quiz_questionid` = `quiz_answersubmissions`.`quiz_questionid` AND " .
00227 "`quiz_questions`.`quiz_sectionid` = {$sectionsRow['quiz_sectionid']} AND " .
00228 "`user_id` = $userId ORDER BY `quiz_answersubmissions`.`quiz_questionrank`";
00229
00230
00231 $questionResult = mysql_query($questionQuery);
00232
00233 if (!$questionResult)
00234 displayerror($questionQuery . '<br />' . mysql_error());
00235
00236 while ($questionRow = mysql_fetch_assoc($questionResult)) {
00237 $correctFormHtml .= '<table class="quiz_' . (is_null($questionRow['quiz_marksallotted']) || floatval($questionRow['quiz_marksallotted']) <= 0 ? 'wrong' : 'right') . "answer\"><tr><td colspan=\"2\">{$questionRow['quiz_question']}</td></tr>\n";
00238 if ($questionRow['quiz_questiontype'] == 'subjective') {
00239 $submittedAnswers = array();
00240 $submittedAnswers[] = $questionRow['quiz_submittedanswer'];
00241 $correctAnswers = array();
00242 $correctAnswers[] = $questionRow['quiz_rightanswer'];
00243 $correctFormHtml .= '<tr><td nowrap="nowrap" width="10%">Submitted Answer:</td><td>'.implode("<br />\n", $submittedAnswers) . "</td></tr>\n";
00244 $correctFormHtml .= '<tr><td nowrap="nowrap" width="10%">Correct Answer:</td><td>'.implode("<br />\n", $correctAnswers) . "</td></tr>\n";
00245 $correctFormHtml .= "<tr><td>Mark:</td><td><form method=POST action='./+correct&useremail=" . safe_html($_GET['useremail']) . "'><input type=hidden name=quizid value='{$quizId}'><input type=hidden name=sectionid value={$questionRow['quiz_sectionid']}><input type=hidden name=questionid value={$questionRow['quiz_questionid']}><input type=hidden name=userid value={$userId}><input type=text name=mark size=5 value='{$questionRow['quiz_marksallotted']}'><input type=submit value='Submit' name=btnSetMark></form></td></tr>";
00246 }
00247 elseif ($questionRow['quiz_questiontype'] == 'sso' || $questionRow['quiz_questiontype'] == 'mso') {
00248 $optionList = getQuestionOptionList($quizId, $sectionsRow['quiz_sectionid'], $questionRow['quiz_questionid']);
00249 $options = array();
00250 for ($i = 0; $i < count($optionList); ++$i)
00251 $options[$optionList[$i]['quiz_optionid']] = $optionList[$i];
00252
00253 $correctAnswers = array();
00254 $rightAnswerIds = explode('|', $questionRow['quiz_rightanswer']);
00255 for ($i = 0; $i < count($rightAnswerIds); ++$i)
00256 $correctAnswers[] = $options[$rightAnswerIds[$i]]['quiz_optiontext'];
00257
00258 $submittedAnswers = array();
00259 $submittedAnswerIds = explode('|', $questionRow['quiz_submittedanswer']);
00260 for ($i = 0; $i < count($submittedAnswerIds); ++$i)
00261 $submittedAnswers[] = $options[$submittedAnswerIds[$i]]['quiz_optiontext'];
00262 $correctFormHtml .= '<tr><td nowrap="nowrap" width="10%">Submitted Answer:</td><td>' . implode("<br />\n", $submittedAnswers) . "</td></tr>\n";
00263 $correctFormHtml .= "<tr><td nowrap=\"nowrap\" width=\"10%\">Correct Answer:</td><td>" . implode("<br />\n", $correctAnswers) . "</td></tr>\n";
00264 $correctFormHtml .= "<tr><td>Mark:</td><td>{$questionRow['quiz_marksallotted']}</td></tr>";
00265 }
00266 $correctFormHtml .= "</table>\n";
00267 }
00268 }
00269 $quizcorrectinfo="<h3>{$title['quiz_title']} - Quiz Answers Correct form for user: " . safe_html($_GET['useremail']) . "</h3><form name='userclearform' method='POST' action='./+correct'><a href='./+correct'><<Back</a> <input type='hidden' name='hdnUserId' id='hdnUserId' value='{$userId}' /><input type='submit' name='btnDeleteUser' id='btnDeleteUser' value='Reject Submission' /></form><table width=100%><tr><td>Total marks: {$marks['total']}</td>$sectionHead<td>Start time: {$marks['starttime']}</td><td>Finish time: {$marks['finishtime']}</td><td>Time taken: {$marks['timetaken']}</td></tr></table>";
00270 $correctFormHtml .= "<a href='./+correct'><<Back</a>";
00271 return $quizcorrectinfo.$correctFormHtml;
00272 }