(no commit message)
[atutor.git] / mods / _core / users / users.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 define('AT_INCLUDE_PATH', '../../../include/');
15 require(AT_INCLUDE_PATH.'vitals.inc.php');
16 admin_authenticate(AT_ADMIN_PRIV_USERS);
17
18 if ( (isset($_GET['edit']) || isset($_GET['password']) || isset($_GET['enrollment'])) && (isset($_GET['id']) && count($_GET['id']) > 1) ) {
19         $msg->addError('SELECT_ONE_ITEM');
20 } else if (isset($_GET['edit'], $_GET['id'])) {
21         header('Location: edit_user.php?id='.$_GET['id'][0]);
22         exit;
23 } else if (isset($_GET['password'], $_GET['id'])) {
24         header('Location: password_user.php?id='.$_GET['id'][0]);
25         exit;
26 } else if (isset($_GET['enrollment'], $_GET['id'])) {
27         header('Location: user_enrollment.php?id='.$_GET['id'][0]);
28         exit;
29 } else if ( isset($_GET['apply']) && isset($_GET['id']) && $_GET['change_status'] >= -1) {
30         $ids = implode(',', $_GET['id']);
31         $status = intval($_GET['change_status']);
32         if ($status == -1) {
33                 header('Location: admin_delete.php?id='.$ids);
34                 exit;
35         } else {
36                 header('Location: user_status.php?ids='.$ids.'&status='.$status);
37                 exit;
38         }
39 } else if ( (isset($_GET['apply']) || isset($_GET['apply_all'])) && $_GET['change_status'] < -1) {
40         $msg->addError('NO_ACTION_SELECTED');
41 } else if (isset($_GET['apply']) || isset($_GET['edit']) || isset($_GET['delete']) || isset($_GET['password'])) {
42         $msg->addError('NO_ITEM_SELECTED');
43 }
44
45 if ($_GET['reset_filter']) {
46         unset($_GET);
47 }
48
49 $page_string = '';
50 $orders = array('asc' => 'desc', 'desc' => 'asc');
51 $cols   = array('login' => 1, 'public_field' => 1, 'first_name' => 1, 'second_name' => 1, 'last_name' => 1, 'email' => 1, 'status' => 1, 'last_login' => 1, 'creation_date' => 1);
52
53 if (isset($_GET['asc'])) {
54         $order = 'asc';
55         $col   = isset($cols[$_GET['asc']]) ? $_GET['asc'] : 'login';
56 } else if (isset($_GET['desc'])) {
57         $order = 'desc';
58         $col   = isset($cols[$_GET['desc']]) ? $_GET['desc'] : 'login';
59 } else {
60         // no order set
61         $order = 'asc';
62         $col   = 'login';
63 }
64 if (isset($_GET['status']) && ($_GET['status'] != '')) {
65         $_GET['status'] = intval($_GET['status']);
66         $status = '=' . intval($_GET['status']);
67         $page_string .= SEP.'status'.$status;
68 } else {
69         $status = '<>-1';
70         $_GET['status'] = '';
71 }
72
73 if (isset($_GET['last_login_days'], $_GET['last_login_have']) && ($_GET['last_login_have'] >= 0) && $_GET['last_login_days']) {
74         $have = intval($_GET['last_login_have']);
75         $days = intval($_GET['last_login_days']);
76         $page_string .= SEP.'last_login_have='.$have;
77         $page_string .= SEP.'last_login_days='.$days;
78
79         if ($have) {
80                 $ll =  " >= TO_DAYS(NOW())-$days)";
81         } else {
82                 $ll =  " < TO_DAYS(NOW())-$days OR last_login+0=0)";
83         }
84         $last_login_days = '(TO_DAYS(last_login)'.$ll;
85 } else {
86         $last_login_days = '1';
87 }
88
89 if (isset($_GET['include']) && $_GET['include'] == 'one') {
90         $checked_include_one = ' checked="checked"';
91         $page_string .= SEP.'include=one';
92 } else {
93         $_GET['include'] = 'all';
94         $checked_include_all = ' checked="checked"';
95         $page_string .= SEP.'include=all';
96 }
97
98 if ($_GET['search']) {
99         $page_string .= SEP.'search='.urlencode($stripslashes($_GET['search']));
100         $search = $addslashes($_GET['search']);
101         $search = explode(' ', $search);
102
103         if ($_GET['include'] == 'all') {
104                 $predicate = 'AND ';
105         } else {
106                 $predicate = 'OR ';
107         }
108
109         $sql = '';
110         foreach ($search as $term) {
111                 $term = trim($term);
112                 $term = str_replace(array('%','_'), array('\%', '\_'), $term);
113                 if ($term) {
114                         $term = '%'.$term.'%';
115                         $sql .= "((M.first_name LIKE '$term') OR (M.second_name LIKE '$term') OR (M.last_name LIKE '$term') OR (M.email LIKE '$term') OR (M.login LIKE '$term')) $predicate";
116                 }
117         }
118         $sql = '('.substr($sql, 0, -strlen($predicate)).')';
119         $search = $sql;
120 } else {
121         $search = '1';
122 }
123
124 if ($_GET['searchid']) {
125         $_GET['searchid'] = trim($_GET['searchid']);
126         $page_string .= SEP.'searchid='.urlencode($_GET['searchid']);
127         $searchid = $addslashes($_GET['searchid']);
128
129         $searchid = explode(',', $searchid);
130
131         $sql = '';
132         foreach ($searchid as $term) {
133                 $term = trim($term);
134                 $term = str_replace(array('%','_'), array('\%', '\_'), $term);
135                 if ($term) {
136                         if (strpos($term, '-') === FALSE) {
137                                 $term = '%'.$term.'%';
138                                 $sql .= "(L.public_field LIKE '$term') OR ";
139                         } else {
140                                 // range search
141                                 $range = explode('-', $term, 2);
142                                 $range[0] = trim($range[0]);
143                                 $range[1] = trim($range[1]);
144                                 if (is_numeric($range[0]) && is_numeric($range[1])) {
145                                         $sql .= "(L.public_field >= $range[0] AND L.public_field <= $range[1]) OR ";
146                                 } else {
147                                         $sql .= "(L.public_field >= '$range[0]' AND L.public_field <= '$range[1]') OR ";
148                                 }
149                         }
150                 }
151         }
152         $sql = '('.substr($sql, 0, -3).')';
153         $searchid = $sql;
154 } else {
155         $searchid = '1';
156 }
157
158 if (defined('AT_MASTER_LIST') && AT_MASTER_LIST) {
159         $sql    = "SELECT COUNT(M.member_id) AS cnt FROM ".TABLE_PREFIX."members M LEFT JOIN (SELECT * FROM ".TABLE_PREFIX."master_list WHERE member_id <> 0) L USING (member_id) WHERE M.status $status AND $search AND $searchid AND $last_login_days";
160 } else {
161         $sql    = "SELECT COUNT(member_id) AS cnt FROM ".TABLE_PREFIX."members M WHERE status $status AND $search AND $last_login_days";
162 }
163
164 $result = mysql_query($sql, $db);
165 if ($result){
166         $row = mysql_fetch_assoc($result);
167         $num_results = $row['cnt'];
168 } else {
169         $num_results = 0;
170 }
171
172 $results_per_page = 50;
173 $num_pages = max(ceil($num_results / $results_per_page), 1);
174 $page = intval($_GET['p']);
175 if (!$page) {
176         $page = 1;
177 }       
178 $count  = (($page-1) * $results_per_page) + 1;
179 $offset = ($page-1)*$results_per_page;
180
181 if ( isset($_GET['apply_all']) && $_GET['change_status'] >= -1) {
182         $offset = 0;
183         $results_per_page = 999999;
184 }
185
186 if (defined('AT_MASTER_LIST') && AT_MASTER_LIST) {
187         $sql    = "SELECT M.member_id, M.login, M.first_name, M.second_name, M.last_name, M.email, M.status, M.last_login+0 AS last_login, M.creation_date, L.public_field FROM ".TABLE_PREFIX."members M LEFT JOIN (SELECT * FROM ".TABLE_PREFIX."master_list WHERE member_id <> 0) L USING (member_id) WHERE M.status $status AND $search AND $searchid AND $last_login_days ORDER BY $col $order LIMIT $offset, $results_per_page";
188 } else {
189         $sql    = "SELECT M.member_id, M.login, M.first_name, M.second_name, M.last_name, M.email, M.status, M.last_login+0 AS last_login, M.creation_date FROM ".TABLE_PREFIX."members M WHERE M.status $status AND $search AND $last_login_days ORDER BY $col $order LIMIT $offset, $results_per_page";
190 }
191
192 $result = mysql_query($sql, $db);
193
194 if ( isset($_GET['apply_all']) && $_GET['change_status'] >= -1) {
195         $ids = '';
196         while ($row = mysql_fetch_assoc($result)) {
197                 $ids .= $row['member_id'].','; 
198         }
199         $ids = substr($ids,0,-1);
200         $status = intval($_GET['change_status']);
201
202         if ($status==-1) {
203                 header('Location: admin_delete.php?id='.$ids);
204                 exit;
205         } else {
206                 header('Location: user_status.php?ids='.$ids.'&status='.$status);
207                 exit;
208         }
209 }
210 require(AT_INCLUDE_PATH.'header.inc.php');
211
212 ?>
213 <form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
214         <div class="input-form">
215                 <div class="row">
216                         <h3><?php echo _AT('results_found', $num_results); ?></h3>
217                 </div>
218
219                 <div class="row">
220                         <?php echo _AT('account_status'); ?><br />
221                         <input type="radio" name="status" value="0" id="s0" <?php if ($_GET['status'] == 0) { echo 'checked="checked"'; } ?> /><label for="s0"><?php echo _AT('disabled'); ?></label> 
222
223                         <input type="radio" name="status" value="1" id="s1" <?php if ($_GET['status'] == 1) { echo 'checked="checked"'; } ?> /><label for="s1"><?php echo _AT('unconfirmed'); ?></label> 
224
225                         <input type="radio" name="status" value="2" id="s2" <?php if ($_GET['status'] == 2) { echo 'checked="checked"'; } ?> /><label for="s2"><?php echo _AT('student'); ?></label>
226
227                         <input type="radio" name="status" value="3" id="s3" <?php if ($_GET['status'] == 3) { echo 'checked="checked"'; } ?> /><label for="s3"><?php echo _AT('instructor'); ?></label>
228
229                         <input type="radio" name="status" value="" id="s" <?php if ($_GET['status'] === '') { echo 'checked="checked"'; } ?> /><label for="s"><?php echo _AT('all'); ?></label>
230                 </div>
231
232                 <div class="row">
233                         <label for="search"><?php echo _AT('search'); ?> (<?php echo _AT('login_name').', '._AT('first_name').', '._AT('second_name').', '._AT('last_name') .', '._AT('email'); ?>)</label><br />
234
235                         <input type="text" name="search" id="search" size="40" value="<?php echo htmlspecialchars($_GET['search']); ?>" />
236                         <br/>
237                         <?php echo _AT('search_match'); ?>:
238                         <input type="radio" name="include" value="all" id="match_all" <?php echo $checked_include_all; ?> /><label for="match_all"><?php echo _AT('search_all_words'); ?></label> 
239                         <input type="radio" name="include" value="one" id="match_one" <?php echo $checked_include_one; ?> /><label for="match_one"><?php echo _AT('search_any_word'); ?></label>
240                 </div>
241
242                 <?php if (defined('AT_MASTER_LIST') && AT_MASTER_LIST): ?>
243                         <div class="row">
244                                 <label for="searchid"><?php echo _AT('search'); ?> (<?php echo _AT('student_id'); ?>)</label><br />
245                                 <input type="text" name="searchid" id="searchid" size="20" value="<?php echo htmlspecialchars($_GET['searchid']); ?>" />
246                         </div>
247                 <?php endif; ?>
248
249                 <div class="row">
250                         <label for="last_login_have"><?php echo _AT('last_login'); ?></label><br />                                     
251                         <select name="last_login_have" id="last_login_have">
252                                 <option value="-1">- <?php echo _AT('select'); ?> -</option>
253                                 <option value="1" <?php if($_GET['last_login_have']=='1') { echo 'selected="selected"';}?>><?php echo _AT('have'); ?></option>
254                                 <option value="0" <?php if(isset($_GET['last_login_have']) && $_GET['last_login_have']=='0') { echo 'selected="selected"';}?>><?php echo _AT('have_not'); ?></option>
255                         </select> <?php echo _AT('logged_in_within'); ?>: <input type="text" name="last_login_days" size="3" value="<?php echo htmlspecialchars($_GET['last_login_days']); ?>" /> <?php echo _AT('days'); ?> <br />
256                         
257                 </div>
258
259                 <div class="row buttons">
260                         <input type="submit" name="filter" value="<?php echo _AT('filter'); ?>" />
261                         <input type="submit" name="reset_filter" value="<?php echo _AT('reset_filter'); ?>" />
262                 </div>
263         </div>
264 </form>
265
266 <?php print_paginator($page, $num_results, $page_string . SEP . $order .'='. $col, $results_per_page); ?>
267
268 <form name="form" method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
269 <input type="hidden" name="status" value="<?php echo $_GET['status']; ?>" />
270 <input type="hidden" name="search" value="<?php echo htmlspecialchars($_GET['search']); ?>" />
271 <input type="hidden" name="include" value="<?php echo htmlspecialchars($_GET['include']); ?>" />
272
273 <?php if (defined('AT_MASTER_LIST') && AT_MASTER_LIST) {  $col_counts = 1; } else { $col_counts = 0; } ?>
274 <table summary="" class="data" rules="rows">
275 <colgroup>
276         <?php if ($col == 'login'): ?>
277                 <col />
278                 <col class="sort" />
279                 <col span="<?php echo 5 + $col_counts; ?>" />
280         <?php elseif($col == 'public_field'): ?>
281                 <col span="<?php echo 1 + $col_counts; ?>" />
282                 <col class="sort" />
283                 <col span="6" />
284         <?php elseif($col == 'first_name'): ?>
285                 <col span="<?php echo 2 + $col_counts; ?>" />
286                 <col class="sort" />
287                 <col span="5" />
288         <?php elseif($col == 'second_name'): ?>
289                 <col span="<?php echo 3 + $col_counts; ?>" />
290                 <col class="sort" />
291                 <col span="4" />
292         <?php elseif($col == 'last_name'): ?>
293                 <col span="<?php echo 4 + $col_counts; ?>" />
294                 <col class="sort" />
295                 <col span="3" />
296         <?php elseif($col == 'email'): ?>
297                 <col span="<?php echo 5 + $col_counts; ?>" />
298                 <col class="sort" />
299                 <col span="2" />
300         <?php elseif($col == 'status'): ?>
301                 <col span="<?php echo 6 + $col_counts; ?>" />
302                 <col class="sort" />
303                 <col />
304         <?php elseif($col == 'last_login'): ?>
305                 <col span="<?php echo 7 + $col_counts; ?>" />
306                 <col class="sort" />
307         <?php elseif($col == 'creation_date'): ?>
308                 <col span="<?php echo 8 + $col_counts; ?>" />
309                 <col class="sort" />
310         <?php endif; ?>
311 </colgroup>
312 <thead>
313 <tr>
314         <th scope="col" align="left"><input type="checkbox" value="<?php echo _AT('select_all'); ?>" id="all" title="<?php echo _AT('select_all'); ?>" name="selectall" onclick="CheckAll();" /></th>
315
316         <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=login<?php echo $page_string; ?>"><?php echo _AT('login_name');      ?></a></th>
317         <?php if (defined('AT_MASTER_LIST') && AT_MASTER_LIST): ?>
318                 <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=public_field<?php echo $page_string; ?>"><?php echo _AT('student_id'); ?></a></th>
319         <?php endif; ?>
320         <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=first_name<?php echo $page_string; ?>"><?php echo _AT('first_name'); ?></a></th>
321         <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=second_name<?php echo $page_string; ?>"><?php echo _AT('second_name'); ?></a></th>
322         <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=last_name<?php echo $page_string; ?>"><?php echo _AT('last_name');   ?></a></th>
323         <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=email<?php echo $page_string; ?>"><?php echo _AT('email');           ?></a></th>
324         <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=status<?php echo $page_string; ?>"><?php echo _AT('account_status'); ?></a></th>
325         <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=last_login<?php echo $page_string; ?>"><?php echo _AT('last_login'); ?></a></th>
326         <th scope="col"><a href="mods/_core/users/users.php?<?php echo $orders[$order]; ?>=creation_date<?php echo $page_string; ?>"><?php echo _AT('creation_date'); ?></a></th>
327 </tr>
328
329 </thead>
330 <?php if ($num_results > 0): ?>
331         <tfoot>
332         <tr>
333                 <td colspan="<?php echo 9 + $col_counts; ?>">
334                         <input type="submit" name="edit" value="<?php echo _AT('edit'); ?>" /> 
335                         <input type="submit" name="password" value="<?php echo _AT('password'); ?>" />
336                         <?php if (admin_authenticate(AT_ADMIN_PRIV_ENROLLMENT, true)): ?>
337                                 <input type="submit" name="enrollment" value="<?php echo _AT('enrollment'); ?>" />
338                         <?php endif; ?>
339                         <span style="padding:0px 10px">|</span> 
340                         
341                         <select name="change_status">
342                                 <option value="-2"><?php echo _AT('more_options'); ?></option>
343                                 <optgroup label="<?php echo _AT('status'); ?>">
344                                         <option value="<?php echo AT_STATUS_STUDENT; ?>"><?php echo _AT('student'); ?></option>
345                                         <option value="<?php echo AT_STATUS_INSTRUCTOR; ?>"><?php echo _AT('instructor'); ?></option>   
346                                         <?php if ($_config['email_confirmation']): ?>
347                                                 <option value="<?php echo AT_STATUS_UNCONFIRMED; ?>"><?php echo _AT('unconfirmed'); ?></option>
348                                         <?php endif; ?>
349                                         <option value="<?php echo AT_STATUS_DISABLED; ?>"><?php echo _AT('disable'); ?></option>                                
350                                 </optgroup>
351                                 <option value="-2" disabled="disabled">- - - - - - - - -</option>       
352                                 <option value="-1"><?php echo _AT('delete'); ?></option>                                
353                         </select>
354                         <input type="submit" name="apply" value="<?php echo _AT('apply'); ?>" />
355                         <input type="submit" name="apply_all" value="<?php echo _AT('apply_to_all_results'); ?>" />
356                 </td>
357         </tr>
358         </tfoot>
359         <tbody>
360                 <?php while($row = mysql_fetch_assoc($result)): ?>
361                         <tr onmousedown="document.form['m<?php echo $row['member_id']; ?>'].checked = !document.form['m<?php echo $row['member_id']; ?>'].checked; togglerowhighlight(this, 'm<?php echo $row['member_id']; ?>');" id="rm<?php echo $row['member_id']; ?>">
362                                 <td><input type="checkbox" name="id[]" value="<?php echo $row['member_id']; ?>" id="m<?php echo $row['member_id']; ?>" onmouseup="this.checked=!this.checked" /></td>
363                                 <td><?php echo $row['login']; ?></td>
364                                 <?php if (defined('AT_MASTER_LIST') && AT_MASTER_LIST): ?>
365                                         <td><?php echo $row['public_field']; ?></td>
366                                 <?php endif; ?>
367                                 <?php $startend_date_longs_format=_AT('startend_date_longs_format'); ?>
368                                 <td><?php echo AT_print($row['first_name'], 'members.first_name'); ?></td>
369                                 <td><?php echo AT_print($row['second_name'], 'members.second_name'); ?></td>
370                                 <td><?php echo AT_print($row['last_name'], 'members.last_name'); ?></td>
371                                 <td><?php echo AT_print($row['email'], 'members.email'); ?></td>
372                                 <td><?php echo get_status_name($row['status']); ?></td>
373                                 <td nowrap="nowrap">
374                                         <?php if ($row['last_login'] == 0): ?>
375                                                 <?php echo _AT('never'); ?>
376                                         <?php else: ?>
377                                                 <?php 
378                                                 //echo AT_date('%d/%m/%y - %H:%i', $row['last_login'], AT_DATE_MYSQL_TIMESTAMP_14);
379                                                 echo AT_date($startend_date_longs_format, $row['last_login'], AT_DATE_MYSQL_TIMESTAMP_14); 
380                                         ?>
381                                         <?php endif; ?>
382                                 </td>
383                                 <td><?php echo AT_date($startend_date_longs_format, $row['creation_date'], AT_DATE_MYSQL_DATETIME); ?></td>
384                         </tr>
385                 <?php endwhile; ?>
386         </tbody>
387 <?php else: ?>
388         <tr>
389                 <td colspan="<?php echo 9 + $col_counts; ?>"><?php echo _AT('none_found'); ?></td>
390         </tr>
391 <?php endif; ?>
392 </table>
393 </form>
394 <script language="JavaScript" type="text/javascript">
395 //<!--
396 function CheckAll() {
397         for (var i=0;i<document.form.elements.length;i++)       {
398                 var e = document.form.elements[i];
399                 if ((e.name == 'id[]') && (e.type=='checkbox')) {
400                         e.checked = document.form.selectall.checked;
401                         togglerowhighlight(document.getElementById("r" + e.id), e.id);
402                 }
403         }
404 }
405
406 function togglerowhighlight(obj, boxid) {
407         if (document.getElementById(boxid).checked) {
408                 obj.className = 'selected';
409         } else {
410                 obj.className = '';
411         }
412 }
413 //-->
414 </script>
415 <?php require(AT_INCLUDE_PATH.'footer.inc.php'); ?>