changed git call from https to git readonly
[atutor.git] / mods / gradebook / edit_marks.php
1 <?php
2 /****************************************************************/
3 /* ATutor                                                                                                               */
4 /****************************************************************/
5 /* Copyright (c) 2002-2008 by Greg Gay & Joel Kronenberg        */
6 /* Adaptive Technology Resource Centre / University of Toronto  */
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 $student => $num)
94                 {
95                         if ($no_error) $no_error = false;
96                         $error_msg .= $student . ": " . $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 $selected_students = array();
126 $grades = array();
127
128 // generate test array
129 if (($_GET["filter"] || $_GET["download"]) && $_GET["gradebook_test_id"]<>0)
130 {
131         foreach ($all_tests as $test)
132         {
133                 if ($test["gradebook_test_id"] == $_GET["gradebook_test_id"])
134                 {
135                         $selected_tests[0]["gradebook_test_id"] = $test["gradebook_test_id"];
136                         $selected_tests[0]["title"] = $test["title"];
137                         $selected_tests[0]["type"] = $test["type"];
138                 }
139         }
140 }
141 else
142         $selected_tests = $all_tests;
143
144 // generate students array
145 if (($_GET["filter"] || $_GET["download"]) && $_GET["member_id"]<>0)
146 {
147         foreach ($all_students as $student)
148         {
149                 if ($student["member_id"] == $_GET["member_id"])
150                 {
151                         $selected_students[0]["member_id"] = $student["member_id"];
152                         $selected_students[0]["first_name"] = $student["first_name"];
153                         $selected_students[0]["last_name"] = $student["last_name"];
154                 }
155         }
156         
157         $sql_students = "SELECT first_name, last_name, member_id FROM ".TABLE_PREFIX."members WHERE member_id=" . $_GET["member_id"];
158 }
159 else
160         $selected_students = $all_students;
161
162 // generate grade 2-dimentional array
163 foreach ($selected_tests as $selected_test)
164         foreach($selected_students as $selected_student)
165         {
166                 $sql = "SELECT grade FROM ".TABLE_PREFIX."gradebook_detail WHERE gradebook_test_id=".$selected_test["gradebook_test_id"]." AND member_id=".$selected_student["member_id"];
167                 $result = mysql_query($sql, $db) or die(mysql_error());
168                 $row = mysql_fetch_assoc($result);
169                 
170                 $grades[$selected_test["gradebook_test_id"]][$selected_student["member_id"]] = $row["grade"];
171         }
172
173 // sort grade
174 if ((isset($_GET["asc"]) || isset($_GET["desc"])) && $order_col <> "name")
175 {
176         $sort = '$grades['.$order_col.'], SORT_'.strtoupper($order).', $selected_students, SORT_'.strtoupper($order);
177         
178         foreach($selected_tests as $test)
179         {
180                 if ($test["gradebook_test_id"] <> $order_col)
181                         $sort .= ', $grades['.$test["gradebook_test_id"].'], SORT_'.strtoupper($order);
182         }
183         $sort='array_multisort('.$sort.');';
184         eval($sort);
185 }
186 // end of initialization
187
188 $num_students = count($selected_students);
189 $results_per_page = 50;
190 $num_pages = max(ceil($num_students / $results_per_page), 1);
191
192 $page = intval($_GET['p']);
193 if (!$page) {
194         $page = 1;
195 }       
196 $count  = (($page-1) * $results_per_page) + 1;
197 $offset = ($page-1)*$results_per_page;
198
199 // generate table & csv head
200 $table_head = "<thead>\n\r";
201 $table_head .= "<tr>\n\r";
202
203 if ($_GET[filter] <> "")
204         $query_str = '&amp;filter='.$_GET[filter];
205
206 if ($_GET[member_id] <> "")
207         $query_str .= '&amp;member_id='.$_GET[member_id];
208
209 if ($_GET[gradebook_test_id] <> "")
210         $query_str .= '&amp;gradebook_test_id='.$_GET[gradebook_test_id];
211
212 $table_head .= "        <th scope='col'><a href='". $_SERVER['PHP_SELF'] .'?'.$orders[$order].'=name'.$query_str."'>". _AT('name')."</a></th>\n\r";
213
214 $csv_content = _AT('name');
215
216 foreach ($selected_tests as $selected_test)
217 {
218         $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";
219         $csv_content .= ",".$selected_test[title];
220 }
221 $table_head .= "        <th scope='col'></th>\n\r";
222 $table_head .= "</tr>\n\r";
223
224 $csv_content .= "\n";
225
226 $table_head .= "<tr>\n\r";
227 $table_head .= "        <td></td>\n\r";
228
229 $has_edit_button = false;
230 foreach ($selected_tests as $selected_test)
231 {
232         if ($selected_test["type"] == "External" || $selected_test["type"] == "ATutor Assignment")
233         {
234                 $has_edit_button = true;
235                 $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";
236         }
237         else
238         {
239                 $table_head .= "        <td></td>\n\r";
240         }
241 }
242 if ($has_edit_button) $table_head .= "  <td></td>";
243 $table_head .= "</tr>\n\r";
244 $table_head .= "</thead>\n\r";
245
246 // generate table & csv content
247 if ($num_students > 0)
248 {
249         $table_content = "      <tbody>\n\r";
250         if ($offset + $results_per_page > $num_students) $end_pos = $num_students;
251         else $end_pos = $offset + $results_per_page;
252         
253         $tabindex_input = 1;
254         $tabindex_edit = 2;
255         
256         for ($i=$offset; $i < $end_pos; $i++)
257         {
258                 $table_content .= "             <tr>\n\r";
259                 $table_content .= "                     <td>".$selected_students[$i]["first_name"]." " . $selected_students[$i]["last_name"]."</td>\n\r";
260
261                 $csv_content .= $selected_students[$i]["first_name"]." " . $selected_students[$i]["last_name"];
262
263                 foreach ($selected_tests as $selected_test)
264                 {
265                         $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"];
266                         $result = mysql_query($sql, $db) or die(mysql_error());
267                         $row = mysql_fetch_assoc($result);
268                         
269                         $row["grade"] = htmlspecialchars($row["grade"]);   // handle html special chars
270                         
271                         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"))
272                         {
273                                 $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";
274                                 $csv_content .= ",".$row["grade"];
275                         }
276                         else
277                         {
278                                 if ($row["grade"]=="")
279                                 {
280                                         $table_content .= "                     <td style='text-align:center'>"._AT("na")."</td>\n\r";
281                                         $csv_content .= ",". _AT("na");
282                                 }
283                                 else
284                                 {
285                                         $table_content .= "                     <td style='text-align:center'>".$row["grade"]."</td>\n\r";
286                                         $csv_content .= ",".$row["grade"];
287                                 }
288                         }
289                 }
290                 
291                 if ($has_edit_button)
292                         $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";
293
294                 $table_content .= "             </tr>\n\r";
295                 $csv_content .= "\n";
296         }
297         
298         $table_content .= "     </tbody>\n\r";
299 }
300
301 // download csv file
302 if ($_GET['download'])
303 {
304         if ($num_students == 0)
305         {
306                 require (AT_INCLUDE_PATH.'header.inc.php');
307                 $msg->printErrors('ITEM_NOT_FOUND');
308                 require (AT_INCLUDE_PATH.'footer.inc.php');
309                 exit;
310         }
311
312         header('Content-Type: application/x-excel');
313         header('Content-Disposition: inline; filename="grades.csv"');
314         header('Expires: 0');
315         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
316         header('Pragma: public');
317         
318         echo $csv_content;
319         exit;
320 }
321
322 require(AT_INCLUDE_PATH.'header.inc.php');
323
324 $msg->printFeedbacks();
325
326 if (count($selected_tests)==0)
327 {
328         echo _AT('empty_gradebook');
329         require(AT_INCLUDE_PATH.'footer.inc.php');
330         exit;
331 }
332 ?>
333 <form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
334         <div class="input-form" id="jump-area">
335         
336         <fieldset class="group_form"><legend class="group_form"><?php echo _AT('search'); ?></legend>
337                 <div class="row">
338                 <label for="select_gid"><?php echo _AT("name") ?></label><br />
339                         <select name="gradebook_test_id" id="select_gid">
340                                 <option value="0"><?php echo _AT('all') ?></option>
341 <?php
342         foreach($all_tests as $test)
343         {
344                 echo '                  <option value="'.$test[gradebook_test_id]. '"';
345                 
346                 if ($test[gradebook_test_id]==$_GET["gradebook_test_id"])
347                         echo ' SELECTED ';
348                 echo '>'.$test["title"].'</option>'."\n\r";
349         }
350 ?>
351                         </select>
352                 </div>
353
354                 <div class="row">
355                         <label for="select_mid"><?php echo _AT("students") ?></label><br />
356                         <select name="member_id" id="select_mid">
357                                 <option value="0"><?php echo _AT('all') ?></option>
358 <?php
359         foreach($all_students as $student)
360         {
361                 echo '                  <option value="'.$student[member_id].'"';
362                 if ($student[member_id]==$_GET["member_id"])
363                         echo ' SELECTED ';
364                 echo '>'.$student[first_name].' '.$student[last_name].'</option>'."\n\r";
365         }
366 ?>
367                         </select>
368                 </div>
369
370                 <div class="row buttons">
371                         <input type="submit" name="filter" value="<?php echo _AT('filter'); ?>" />
372                         <input type="submit" name="reset_filter" value="<?php echo _AT('reset_filter'); ?>" />
373                         <input type="submit" name="download" value="<?php echo _AT('download_test_csv'); ?>" />
374                 </div>
375         </fieldset>
376         </div>
377
378 </form>
379
380 <form name="form" method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
381 <input type="hidden" name="filter" value="<?php echo $_GET[filter]?>" />
382 <input type="hidden" name="gradebook_test_id" value="<?php echo $_GET[gradebook_test_id]?>" />
383 <input type="hidden" name="member_id" value="<?php echo $_GET[member_id]?>" />
384
385
386 <?php print_paginator($page, $num_students, $sql_students, $results_per_page); ?>
387
388 <table summary="" class="data" rules="all">
389
390 <?php 
391 echo $table_head;
392 ?>
393 <tfoot>
394 <tr>
395         <td colspan="<?php echo count($selected_tests)+2; ?>">
396                 <div class="row buttons">
397                 <input type="submit" name="save" value="<?php echo _AT('save'); ?>" />
398                 </div>
399         </td>
400 </tr>
401 </tfoot>
402
403 <?php 
404 if ($num_students == 0)
405 {
406 ?>
407         <tr>
408                 <td colspan="<?php echo count($selected_tests)+1; ?>"><?php echo _AT('none_found'); ?></td>
409         </tr>
410 <?php 
411 }
412 else
413 {
414         echo $table_content;
415 }
416 ?>
417 </table>
418
419 </form>
420
421 <?php require(AT_INCLUDE_PATH.'footer.inc.php'); ?>