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