tagging as ATutor 1.5.4-release
[atutor.git] / tools / groups / members.php
1 <?php\r
2 /************************************************************************/\r
3 /* ATutor                                                                                                                               */\r
4 /************************************************************************/\r
5 /* Copyright (c) 2002-2006 by Greg Gay, Joel Kronenberg,                                */\r
6 /* Heidi Hazelton, and Jonathan Hung                                                                    */\r
7 /* Adaptive Technology Resource Centre / University of Toronto                  */\r
8 /* http://atutor.ca                                                                                                             */\r
9 /*                                                                                                                                              */\r
10 /* This program is free software. You can redistribute it and/or                */\r
11 /* modify it under the terms of the GNU General Public License                  */\r
12 /* as published by the Free Software Foundation.                                                */\r
13 /************************************************************************/\r
14 // $Id$\r
15 define('AT_INCLUDE_PATH', '../../include/');\r
16 require(AT_INCLUDE_PATH.'vitals.inc.php');\r
17 authenticate(AT_PRIV_GROUPS);\r
18 \r
19 /* Get type ID */\r
20 $id = intval($_REQUEST['id']);\r
21 \r
22 $sql = "SELECT * FROM ".TABLE_PREFIX."groups_types WHERE type_id=$id AND course_id=$_SESSION[course_id]";\r
23 $result = mysql_query($sql,$db);\r
24 if (!($type_row = mysql_fetch_assoc($result))) {\r
25         require (AT_INCLUDE_PATH.'header.inc.php');\r
26         $msg->printErrors('GROUP_TYPE_NOT_FOUND');\r
27         require (AT_INCLUDE_PATH.'footer.inc.php');\r
28         exit;\r
29 }\r
30 \r
31 $tmp_groups = array();\r
32 $sql = "SELECT group_id, title FROM ".TABLE_PREFIX."groups WHERE type_id=$id ORDER BY title";\r
33 $result = mysql_query($sql, $db);\r
34 while ($row = mysql_fetch_assoc($result)) {\r
35         $tmp_groups[$row['group_id']] = $row['title'];\r
36 }\r
37 $groups_keys = array_keys($tmp_groups);\r
38 $groups_keys = implode($groups_keys, ',');\r
39 \r
40 if (isset($_POST['cancel'])) {\r
41         $msg->addFeedback('CANCELLED');\r
42         header('Location: index.php');\r
43         exit;\r
44 } else if (isset($_POST['submit'])) {\r
45         $sql = "DELETE FROM ".TABLE_PREFIX."groups_members WHERE group_id IN ($groups_keys)";\r
46         mysql_query($sql, $db);\r
47 \r
48         $sql = '';\r
49         foreach ($_POST['groups'] as $mid => $gid) {\r
50                 $mid = abs($mid);\r
51                 $gid = abs($gid);\r
52                 if ($gid) {\r
53                         $sql .= "($gid, $mid),";\r
54                 }\r
55         }\r
56         if ($sql) {\r
57                 $sql = substr($sql, 0, -1);\r
58                 $sql = "INSERT INTO ".TABLE_PREFIX."groups_members VALUES $sql";\r
59                 mysql_query($sql, $db);\r
60         }\r
61 \r
62         $msg->addFeedback('GROUP_MEMBERS_SAVED');\r
63 \r
64         header('Location: index.php');\r
65         exit;\r
66 } else if (isset($_POST['assign'])) {\r
67 \r
68         $groups_counts = array();\r
69         $sql = "SELECT group_id, COUNT(*) AS cnt FROM ".TABLE_PREFIX."groups_members WHERE group_id IN ($groups_keys) GROUP BY group_id ORDER BY cnt ASC";\r
70         $result = mysql_query($sql, $db);\r
71         while ($row = mysql_fetch_assoc($result)) {\r
72                 $groups_counts[$row['group_id']] = $row['cnt'];\r
73         }\r
74         $total_assigned = array_sum($groups_counts);\r
75 \r
76         if (is_array($_POST['groups'])) {\r
77                 foreach ($_POST['groups'] as $mid => $gid) {\r
78                         if ($gid) {\r
79                                 unset($_POST['groups'][$mid]);\r
80                         }\r
81                 }\r
82                 $students = array_keys($_POST['groups']);\r
83 \r
84                 $total_unassigned = count($students);\r
85 \r
86                 shuffle($students);\r
87                 reset($students);\r
88         }\r
89 \r
90         $total_students = $total_unassigned + $total_assigned;\r
91 \r
92         $num_groups = count($tmp_groups);\r
93 \r
94         if ($total_students > 0) {\r
95                 // to uniformly distribute all the groups we place the remaining students\r
96                 // into the first n groups, where n is the number of remaining students.\r
97                 $remainder = $total_students % $num_groups;\r
98                 if ($remainder) {\r
99                         $num_students_per_group = floor($total_students / $num_groups);\r
100                 } else {\r
101                         $num_students_per_group = $total_students / $num_groups;\r
102                 }\r
103 \r
104                 $sql = '';\r
105                 foreach($tmp_groups as $group_id => $garbage) {\r
106 \r
107                         if (!isset($groups_counts[$group_id])) {\r
108                                 $groups_counts[$group_id] = 0;\r
109                         }\r
110                         while (($groups_counts[$group_id] < $num_students_per_group) && ($mid = current($students))) {\r
111                                 $sql .= "($group_id, $mid),";\r
112                                 $groups_counts[$group_id]++;\r
113                                 next($students);\r
114                         }\r
115 \r
116                         if ($remainder) {\r
117                                 $mid = current($students);\r
118                                 if ($mid) {\r
119                                         $sql .= "($group_id, $mid),";\r
120                                         $remainder--;\r
121                                         next($students);\r
122                                         $groups_counts[$group_id]++;\r
123                                 }\r
124                         }\r
125                 }\r
126                 if ($sql) {\r
127                         $sql = substr($sql, 0, -1);\r
128                         $sql = "INSERT INTO ".TABLE_PREFIX."groups_members VALUES " . $sql;\r
129                         mysql_query($sql, $db);\r
130                 }\r
131         }\r
132 \r
133         $msg->addFeedback('GROUP_MEMBERS_SAVED');\r
134         header('Location: index.php');\r
135         exit;\r
136 }\r
137 \r
138 require(AT_INCLUDE_PATH.'header.inc.php');\r
139 \r
140 \r
141 echo '<h2>'.$type_row['title'].'</h2>';\r
142 \r
143 \r
144 if (isset($_GET['gid'])) {\r
145         $_GET['gid'] = abs($_GET['gid']);\r
146 } else {\r
147         $_GET['gid'] = 0;\r
148 }\r
149 \r
150 $groups_members = array();\r
151 $sql = "SELECT member_id, group_id FROM ".TABLE_PREFIX."groups_members WHERE group_id IN ($groups_keys) ORDER BY member_id";\r
152 $result = mysql_query($sql, $db);\r
153 while ($row = mysql_fetch_assoc($result)) {\r
154         $groups_members[$row['member_id']] = $row['group_id'];\r
155 }\r
156 $groups_members_keys = array_keys($groups_members);\r
157 $groups_members_keys = implode($groups_members_keys, ',');\r
158 \r
159 $owner = $system_courses[$_SESSION['course_id']]['member_id'];\r
160 \r
161 $sql = "SELECT M.member_id, M.login, M.first_name, M.last_name FROM ".TABLE_PREFIX."members M INNER JOIN ".TABLE_PREFIX."course_enrollment E USING (member_id) WHERE E.course_id=$_SESSION[course_id] AND E.privileges&".AT_PRIV_GROUPS."=0 AND E.approved='y' AND E.member_id<>$owner ORDER BY M.login";\r
162 $result = mysql_query($sql, $db);\r
163 \r
164 $count = 0;\r
165 ?>\r
166 <form name="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">\r
167 <input type="hidden" name="id" value="<?php echo $id; ?>" />\r
168 <table class="data static" style="width: 60%" rules="rows">\r
169 <thead>\r
170         <tr>\r
171                 <th><?php echo _AT('login');      ?></th>\r
172                 <th><?php echo _AT('first_name'); ?></th>\r
173                 <th><?php echo _AT('last_name');  ?></th>\r
174                 <th><?php echo _AT('groups');     ?></th>\r
175         </tr>\r
176 </thead>\r
177 <tfoot>\r
178         <tr>\r
179                 <td colspan="4">\r
180                         <input type="submit" name="submit" value="<?php echo _AT('save'); ?>" />\r
181                         <input type="submit" name="assign" value="<?php echo _AT('assign_unassigned'); ?>" />\r
182                         <input type="submit" name="cancel" value="<?php echo _AT('cancel'); ?>" />\r
183                 </td>\r
184         </tr>\r
185 </tfoot>\r
186 <tbody>\r
187         <?php while ($row = mysql_fetch_assoc($result)): ?>\r
188                 <tr <?php if ($_GET['gid'] && $_GET['gid'] == $groups_members[$row['member_id']]) { echo 'style="background-color: #dfd; font-weight: bold;"';} ?> id="r<?php echo ++$count; ?>">\r
189                         <td><label for="m<?php echo $row['member_id']; ?>"><?php echo $row['login']; ?></label></td>\r
190                         <td><label for="m<?php echo $row['member_id']; ?>"><?php echo $row['first_name']; ?></label></td>\r
191                         <td><label for="m<?php echo $row['member_id']; ?>"><?php echo $row['last_name']; ?></label></td>\r
192                         <td>\r
193                                 <select name="groups[<?php echo $row['member_id']; ?>]" id="m<?php echo $row['member_id']; ?>" onchange="javascript:hirow(this, <?php echo $count; ?>);">\r
194                                         <option value="0"></option>\r
195                                         <?php foreach ($tmp_groups as $group => $title): ?>\r
196                                                 <option value="<?php echo $group; ?>" <?php if ($groups_members[$row['member_id']] == $group) { echo 'selected="selected"'; } ?>><?php echo htmlspecialchars($title); ?></option>\r
197                                         <?php endforeach; ?>\r
198                                 </select>\r
199                         </td>\r
200                 </tr>\r
201         <?php endwhile; ?>\r
202 </tbody>\r
203 </table>\r
204 </form>\r
205 \r
206 <script type="text/javascript" language="javascript">\r
207 // <!--\r
208 function hirow(obj, row) {\r
209         if (obj.value && obj.value == <?php echo $_GET['gid']; ?>) {\r
210                 e = document.getElementById("r" + row);\r
211                 e.style.backgroundColor = "#dfd";\r
212                 e.style.fontWeight = "bold";\r
213         } else {\r
214                 e = document.getElementById("r" + row);\r
215                 e.style.backgroundColor = "";\r
216                 e.style.fontWeight = "";\r
217         }\r
218 }\r
219 // -->\r
220 </script>\r
221 \r
222 <?php require(AT_INCLUDE_PATH.'footer.inc.php'); ?>