ATutor 2.0
[atutor.git] / mods / _standard / gradebook / edit_marks.php
1 <?php
2 /****************************************************************/
3 /* ATutor                                                                                                               */
4 /****************************************************************/
5 /* Copyright (c) 2002-2010                                      */
6 /* Inclusive Design Institute                                   */
7 /* http://atutor.ca                                                                                             */
8 /*                                                              */
9 /* This program is free software. You can redistribute it and/or*/
10 /* modify it under the terms of the GNU General Public License  */
11 /* as published by the Free Software Foundation.                                */
12 /****************************************************************/
13 // $Id: users.php 7208 2008-01-09 16:07:24Z greg $
14 $page = "gradebook";
15
16 define('AT_INCLUDE_PATH', '../../../include/');
17 require(AT_INCLUDE_PATH.'vitals.inc.php');
18 authenticate(AT_PRIV_GRADEBOOK);
19
20 require_once("lib/gradebook.inc.php");
21
22 if (isset($_GET['cancel'])) 
23 {
24         $msg->addFeedback('CANCELLED');
25         header('Location: gradebook_tests.php');
26         exit;
27
28 else if (isset($_GET['save'])) 
29 {
30         foreach($_GET as $key => $value)
31         {
32                 $value = $addslashes($value);
33                 if (preg_match('/^grade_(.*)_(.*)$/', $key, $matches) > 0)
34                 {
35                         $sql = "SELECT grade_scale_id FROM ".TABLE_PREFIX."gradebook_tests WHERE gradebook_test_id = ". $matches[1];
36                         $result = mysql_query($sql, $db) or die(mysql_error());
37                         $row = mysql_fetch_assoc($result);
38
39                         $sql = "REPLACE ".TABLE_PREFIX."gradebook_detail SET gradebook_test_id = ". $matches[1].", member_id=". $matches[2].", grade='".get_mark_by_grade($row["grade_scale_id"], $value)."'";
40                         $result = mysql_query($sql, $db) or die(mysql_error());
41                 }
42         }
43 }
44
45 $orders = array('asc' => 'desc', 'desc' => 'asc');
46
47 if (isset($_GET['asc'])) 
48 {
49         $order = 'asc';
50         $order_col = $_GET['asc'];
51
52 else if (isset($_GET['desc'])) {
53         $order = 'desc';
54         $order_col = $_GET['desc'];
55 } else {
56         // no order set
57         $order = 'asc';
58         $order_col   = 'name';
59 }
60
61 if ($_GET['reset_filter']) {
62         unset($_GET);
63 }
64
65 // Initialize all applicable tests array and all enrolled students array
66 $all_tests = array();
67 $all_students = array();
68
69 // generate test array
70 $sql = "(SELECT g.gradebook_test_id, g.id, g.type, t.title".
71                                 " FROM ".TABLE_PREFIX."gradebook_tests g, ".TABLE_PREFIX."tests t".
72                                 " WHERE g.type='ATutor Test'".
73                                 " AND g.id = t.test_id".
74                                 " AND t.course_id=".$_SESSION["course_id"]." ORDER BY title)".
75                                 " UNION (SELECT g.gradebook_test_id, g.id, g.type, a.title".
76                                 " FROM ".TABLE_PREFIX."gradebook_tests g, ".TABLE_PREFIX."assignments a".
77                                 " WHERE g.type='ATutor Assignment'".
78                                 " AND g.id = a.assignment_id".
79                                 " AND a.course_id=".$_SESSION["course_id"]." ORDER BY title)".
80                                 " UNION (SELECT gradebook_test_id, id, type, title".
81                                 " FROM ".TABLE_PREFIX."gradebook_tests".
82                                 " WHERE course_id=".$_SESSION["course_id"]." ORDER BY title)";
83 $result = mysql_query($sql, $db) or die(mysql_error());
84
85 while ($row = mysql_fetch_assoc($result))
86 {
87         $no_error = true;
88         
89         if($row["type"]=="ATutor Test")
90         {
91                 $studs_take_num = get_studs_take_more_than_once($_SESSION["course_id"], $row["id"]);
92                 
93                 foreach ($studs_take_num as $member_id => $num)
94                 {
95                         if ($no_error) $no_error = false;
96                         $error_msg .= get_display_name($member_id) . ": " . $num . " times<br>";
97                 }
98                                 
99                 if (!$no_error)
100                 {
101                         $f = array('ADD_TEST_INTO_GRADEBOOK',
102                                                         $row['title'], 
103                                                         $error_msg);
104                         $msg->addFeedback($f);
105                 }
106         }
107         
108         if ($no_error) array_push($all_tests, $row);
109 }
110
111 // generate students array
112 $sql_students = "SELECT m.first_name, m.last_name, e.member_id FROM ".TABLE_PREFIX."members m, ".TABLE_PREFIX."course_enrollment e WHERE m.member_id = e.member_id AND e.course_id=".$_SESSION["course_id"]." AND e.approved='y' AND e.role!='Instructor'";
113 if ($order_col == "name")
114 {
115         $sql_students .= " ORDER BY m.first_name ".$order.",m.last_name ".$order;
116 }
117 $result = mysql_query($sql_students, $db) or die(mysql_error());
118
119 while ($row = mysql_fetch_assoc($result))
120         array_push($all_students, $row);
121 // end of initialization
122
123 // Creates arrays for filtered test/student
124 $selected_tests = array();
125 //$csv_content .= $selected_students[$i]["first_name"]." " . $selected_students[$i]["last_name"];
126
127 $selected_students = array();
128 $grades = array();
129
130 // generate test array
131 if (($_GET["filter"] || $_GET["download"]) && $_GET["gradebook_test_id"]<>0)
132 {
133         foreach ($all_tests as $test)
134         {
135                 if ($test["gradebook_test_id"] == $_GET["gradebook_test_id"])
136                 {
137                         $selected_tests[0]["gradebook_test_id"] = $test["gradebook_test_id"];
138                         $selected_tests[0]["title"] = $test["title"];
139                         $selected_tests[0]["type"] = $test["type"];
140                 }
141         }
142 }
143 else
144         $selected_tests = $all_tests;
145
146 // generate students array
147 if (($_GET["filter"] || $_GET["download"]) && $_GET["member_id"]<>0)
148 {
149         foreach ($all_students as $student)
150         {
151                 if ($student["member_id"] == $_GET["member_id"])
152                 {
153                         $selected_students[0]["member_id"] = $student["member_id"];
154                         $selected_students[0]["first_name"] = $student["first_name"];
155                         $selected_students[0]["last_name"] = $student["last_name"];
156                 }
157         }
158         
159         $sql_students = "SELECT first_name, last_name, member_id FROM ".TABLE_PREFIX."members WHERE member_id=" . $_GET["member_id"];
160 }
161 else
162         $selected_students = $all_students;
163
164 // generate grade 2-dimentional array
165 foreach ($selected_tests as $selected_test)
166         foreach($selected_students as $selected_student)
167         {
168                 $sql = "SELECT grade FROM ".TABLE_PREFIX."gradebook_detail WHERE gradebook_test_id=".$selected_test["gradebook_test_id"]." AND member_id=".$selected_student["member_id"];
169                 $result = mysql_query($sql, $db) or die(mysql_error());
170                 $row = mysql_fetch_assoc($result);
171                 
172                 $grades[$selected_test["gradebook_test_id"]][$selected_student["member_id"]] = $row["grade"];
173         }
174
175 // sort grade
176 if ((isset($_GET["asc"]) || isset($_GET["desc"])) && $order_col <> "name")
177 {
178         $sort = '$grades['.$order_col.'], SORT_'.strtoupper($order).', $selected_students, SORT_'.strtoupper($order);
179         
180         foreach($selected_tests as $test)
181         {
182                 if ($test["gradebook_test_id"] <> $order_col)
183                         $sort .= ', $grades['.$test["gradebook_test_id"].'], SORT_'.strtoupper($order);
184         }
185         $sort='array_multisort('.$sort.');';
186         eval($sort);
187 }
188 // end of initialization
189
190 $num_students = count($selected_students);
191 $results_per_page = 50;
192 $num_pages = max(ceil($num_students / $results_per_page), 1);
193
194 $page = intval($_GET['p']);
195 if (!$page) {
196         $page = 1;
197 }       
198 $count  = (($page-1) * $results_per_page) + 1;
199 $offset = ($page-1)*$results_per_page;
200
201 // generate table & csv head
202 $table_head = "<thead>\n\r";
203 $table_head .= "<tr>\n\r";
204
205 if ($_GET[filter] <> "")
206         $query_str = '&amp;filter='.$_GET[filter];
207
208 if ($_GET[member_id] <> "")
209         $query_str .= '&amp;member_id='.$_GET[member_id];
210
211 if ($_GET[gradebook_test_id] <> "")
212         $query_str .= '&amp;gradebook_test_id='.$_GET[gradebook_test_id];
213
214 $table_head .= "        <th scope='col'><a href='". $_SERVER['PHP_SELF'] .'?'.$orders[$order].'=name'.$query_str."'>". _AT('name')."</a></th>\n\r";
215
216 $csv_content = _AT('name');
217
218 foreach ($selected_tests as $selected_test)
219 {
220         $table_head .= "        <th scope='col'><a href='". $_SERVER['PHP_SELF'] ."?".$orders[$order]."=".$selected_test[gradebook_test_id].$query_str."'>". $selected_test[title]."</a></th>\n\r";
221         $csv_content .= ",".$selected_test[title];
222 }
223 $table_head .= "        <th scope='col'></th>\n\r";
224 $table_head .= "</tr>\n\r";
225
226 $csv_content .= "\n";
227
228 $table_head .= "<tr>\n\r";
229 $table_head .= "        <td></td>\n\r";
230
231 $has_edit_button = false;
232 foreach ($selected_tests as $selected_test)
233 {
234         if ($selected_test["type"] == "External" || $selected_test["type"] == "ATutor Assignment")
235         {
236                 $has_edit_button = true;
237                 $table_head .= "        <td style='text-align:center'><a href='". $_SERVER['PHP_SELF']. '?edit=c_'.$selected_test['gradebook_test_id'].$query_str."'>". _AT("edit")."</a></td>\n\r";
238         }
239         else
240         {
241                 $table_head .= "        <td></td>\n\r";
242         }
243 }
244 if ($has_edit_button) $table_head .= "  <td></td>";
245 $table_head .= "</tr>\n\r";
246 $table_head .= "</thead>\n\r";
247
248 // generate table & csv content
249 if ($num_students > 0)
250 {
251         $table_content = "      <tbody>\n\r";
252         if ($offset + $results_per_page > $num_students) $end_pos = $num_students;
253         else $end_pos = $offset + $results_per_page;
254         
255         $tabindex_input = 1;
256         $tabindex_edit = 2;
257         
258         for ($i=$offset; $i < $end_pos; $i++)
259         {
260                 $table_content .= "             <tr>\n\r";
261                 $table_content .= "                     <td>".$selected_students[$i]["first_name"]." " . $selected_students[$i]["last_name"]."</td>\n\r";
262
263                 $csv_content .= $selected_students[$i]["first_name"]." " . $selected_students[$i]["last_name"];
264
265                 foreach ($selected_tests as $selected_test)
266                 {
267                         $sql = "SELECT grade FROM ".TABLE_PREFIX."gradebook_detail WHERE gradebook_test_id=".$selected_test["gradebook_test_id"]." AND member_id=".$selected_students[$i]["member_id"];
268                         $result = mysql_query($sql, $db) or die(mysql_error());
269                         $row = mysql_fetch_assoc($result);
270                         
271                         $row["grade"] = htmlspecialchars($row["grade"]);   // handle html special chars
272                         
273                         if ($_GET["edit"]=="c_".$selected_test["gradebook_test_id"] || $_GET["edit"]=="r_".$selected_students[$i]["member_id"] && ($selected_test["type"]=="External" || $selected_test["type"]=="ATutor Assignment"))
274                         {
275                                 $table_content .= "                     <td><input type='text' name='grade_".$selected_test["gradebook_test_id"]."_".$selected_students[$i]["member_id"]."' value=\"".$row["grade"]."\" tabindex='".$tabindex_input."' /></td>\n\r";
276                                 $csv_content .= ",".$row["grade"];
277                         }
278                         else
279                         {
280                                 if ($row["grade"]=="")
281                                 {
282                                         $table_content .= "                     <td style='text-align:center'>"._AT("na")."</td>\n\r";
283                                         $csv_content .= ",". _AT("na");
284                                 }
285                                 else
286                                 {
287                                         $table_content .= "                     <td style='text-align:center'>".$row["grade"]."</td>\n\r";
288                                         $csv_content .= ",".$row["grade"];
289                                 }
290                         }
291                 }
292                 
293                 if ($has_edit_button)
294                         $table_content .= "                     <td style='text-align:center'><a href=\"". $_SERVER['PHP_SELF']. "?edit=r_".$selected_students[$i]['member_id'].$query_str."\" tabindex='".$tabindex_edit."'>". _AT("edit") ."</a></td>\n\r";
295
296                 $table_content .= "             </tr>\n\r";
297                 $csv_content .= "\n";
298         }
299         
300         $table_content .= "     </tbody>\n\r";
301 }
302
303 // download csv file
304 if ($_GET['download'])
305 {
306         if ($num_students == 0)
307         {
308                 require (AT_INCLUDE_PATH.'header.inc.php');
309                 $msg->printErrors('ITEM_NOT_FOUND');
310                 require (AT_INCLUDE_PATH.'footer.inc.php');
311                 exit;
312         }
313
314         header('Content-Type: application/x-excel');
315         header('Content-Disposition: inline; filename="grades.csv"');
316         header('Expires: 0');
317         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
318         header('Pragma: public');
319         
320         echo $csv_content;
321         exit;
322 }
323
324 require(AT_INCLUDE_PATH.'header.inc.php');
325
326 $msg->printFeedbacks();
327
328 if (count($selected_tests)==0)
329 {
330         echo '<div class="toolcontainer">'._AT('empty_gradebook').'</div>';
331         require(AT_INCLUDE_PATH.'footer.inc.php');
332         exit;
333 }
334 ?>
335 <form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
336         <div class="input-form" id="jump-area">
337         
338         <fieldset class="group_form"><legend class="group_form"><?php echo _AT('search'); ?></legend>
339                 <div class="row">
340                 <label for="select_gid"><?php echo _AT("name") ?></label><br />
341                         <select name="gradebook_test_id" id="select_gid">
342                                 <option value="0"><?php echo _AT('all') ?></option>
343 <?php
344         foreach($all_tests as $test)
345         {
346                 echo '                  <option value="'.$test[gradebook_test_id]. '"';
347                 
348                 if ($test[gradebook_test_id]==$_GET["gradebook_test_id"])
349                         echo ' SELECTED ';
350                 echo '>'.$test["title"].'</option>'."\n\r";
351         }
352 ?>
353                         </select>
354                 </div>
355
356                 <div class="row">
357                         <label for="select_mid"><?php echo _AT("students") ?></label><br />
358                         <select name="member_id" id="select_mid">
359                                 <option value="0"><?php echo _AT('all') ?></option>
360 <?php
361         foreach($all_students as $student)
362         {
363                 echo '                  <option value="'.$student[member_id].'"';
364                 if ($student[member_id]==$_GET["member_id"])
365                         echo ' SELECTED ';
366                 echo '>'.$student[first_name].' '.$student[last_name].'</option>'."\n\r";
367         }
368 ?>
369                         </select>
370                 </div>
371
372                 <div class="row buttons">
373                         <input type="submit" name="filter" value="<?php echo _AT('filter'); ?>" />
374                         <input type="submit" name="reset_filter" value="<?php echo _AT('reset_filter'); ?>" />
375                         <input type="submit" name="download" value="<?php echo _AT('download_test_csv'); ?>" />
376                 </div>
377         </fieldset>
378         </div>
379
380 </form>
381
382 <form name="form" method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
383 <input type="hidden" name="filter" value="<?php echo $_GET[filter]?>" />
384 <input type="hidden" name="gradebook_test_id" value="<?php echo $_GET[gradebook_test_id]?>" />
385 <input type="hidden" name="member_id" value="<?php echo $_GET[member_id]?>" />
386 <input type="hidden" name="p" value="<?php echo $page; ?>" />
387
388 <?php print_paginator($page, $num_students, $sql_students, $results_per_page); ?>
389
390 <table summary="" class="data" rules="all">
391
392 <?php 
393 echo $table_head;
394 ?>
395 <tfoot>
396 <tr>
397         <td colspan="<?php echo count($selected_tests)+2; ?>">
398                 <div class="row buttons">
399                 <input type="submit" name="save" value="<?php echo _AT('save'); ?>" />
400                 </div>
401         </td>
402 </tr>
403 </tfoot>
404
405 <?php 
406 if ($num_students == 0)
407 {
408 ?>
409         <tr>
410                 <td colspan="<?php echo count($selected_tests)+1; ?>"><?php echo _AT('none_found'); ?></td>
411         </tr>
412 <?php 
413 }
414 else
415 {
416         echo $table_content;
417 }
418 ?>
419 </table>
420
421 </form>
422
423 <?php require(AT_INCLUDE_PATH.'footer.inc.php'); ?>