| 1 | ################################################################################ |
1 | ################################################################################ |
| 2 | # WeBWorK Online Homework Delivery System |
2 | # WeBWorK Online Homework Delivery System |
| 3 | # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/ |
3 | # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/ |
| 4 | # $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm,v 1.42 2004/02/06 17:37:11 sh002i Exp $ |
4 | # $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/UserList.pm,v 1.43 2004/02/12 21:38:24 toenail Exp $ |
| 5 | # |
5 | # |
| 6 | # This program is free software; you can redistribute it and/or modify it under |
6 | # This program is free software; you can redistribute it and/or modify it under |
| 7 | # the terms of either: (a) the GNU General Public License as published by the |
7 | # the terms of either: (a) the GNU General Public License as published by the |
| 8 | # Free Software Foundation; either version 2, or (at your option) any later |
8 | # Free Software Foundation; either version 2, or (at your option) any later |
| 9 | # version, or (b) the "Artistic License" which comes with this package. |
9 | # version, or (b) the "Artistic License" which comes with this package. |
| … | |
… | |
| 143 | size => 2, |
143 | size => 2, |
| 144 | access => "readwrite", |
144 | access => "readwrite", |
| 145 | } |
145 | } |
| 146 | }; |
146 | }; |
| 147 | sub pre_header_initialize { |
147 | sub pre_header_initialize { |
| 148 | my $self = shift; |
148 | my $self = shift; |
| 149 | my $r = $self->{r}; |
149 | my $r = $self->r; |
| 150 | my $ce = $self->{ce}; |
150 | my $urlpath = $r->urlpath; |
| 151 | |
151 | my $ce = $r->ce; |
|
|
152 | my $courseName = $urlpath->arg("courseID"); |
| 152 | # Handle redirects, if any. |
153 | # Handle redirects, if any. |
| 153 | ############################## |
154 | ############################## |
| 154 | # Redirect to the addUser page |
155 | # Redirect to the addUser page |
| 155 | ################################## |
156 | ################################## |
| 156 | |
157 | |
| 157 | defined($r->param('action')) && $r->param('action') eq 'add' && do { |
158 | defined($r->param('action')) && $r->param('action') eq 'add' && do { |
| 158 | # fix url and redirect |
159 | # fix url and redirect |
| 159 | my $root = $ce->{webworkURLs}->{root}; |
160 | my $root = $ce->{webworkURLs}->{root}; |
| 160 | my $courseName = $ce->{courseName}; |
161 | |
| 161 | my $numberOfStudents = $r->param('number_of_students'); |
162 | my $numberOfStudents = $r->param('number_of_students'); |
| 162 | warn "number of students not defined " unless defined $numberOfStudents; |
163 | warn "number of students not defined " unless defined $numberOfStudents; |
| 163 | |
164 | |
| 164 | my $uri="$root/$courseName/instructor/add_users?number_of_students=$numberOfStudents&".$self->url_authen_args; |
165 | my $uri="$root/$courseName/instructor/add_users?number_of_students=$numberOfStudents&".$self->url_authen_args; |
| 165 | #FIXME does the display mode need to be defined? |
166 | #FIXME does the display mode need to be defined? |
| … | |
… | |
| 172 | } |
173 | } |
| 173 | # FIXME -- this should be moved up to instructor or contentgenerator |
174 | # FIXME -- this should be moved up to instructor or contentgenerator |
| 174 | sub header { |
175 | sub header { |
| 175 | my $self = shift; |
176 | my $self = shift; |
| 176 | return REDIRECT if $self->{noContent}; |
177 | return REDIRECT if $self->{noContent}; |
| 177 | my $r = $self->{r}; |
178 | my $r = $self->r; |
| 178 | $r->content_type('text/html'); |
179 | $r->content_type('text/html'); |
| 179 | $r->send_http_header(); |
180 | $r->send_http_header(); |
| 180 | return OK; |
181 | return OK; |
| 181 | } |
182 | } |
| 182 | |
183 | |
| … | |
… | |
| 188 | # $str is a complex number |
189 | # $str is a complex number |
| 189 | } |
190 | } |
| 190 | |
191 | |
| 191 | sub initialize { |
192 | sub initialize { |
| 192 | my ($self) = @_; |
193 | my ($self) = @_; |
| 193 | my $r = $self->{r}; |
194 | my $r = $self->r; |
| 194 | my $db = $self->{db}; |
195 | my $db = $r->db; |
| 195 | my $ce = $self->{ce}; |
196 | my $ce = $r->ce; |
| 196 | my $authz = $self->{authz}; |
197 | my $authz = $r->authz; |
| 197 | my $user = $r->param('user'); |
198 | my $user = $r->param('user'); |
| 198 | |
199 | |
| 199 | unless ($authz->hasPermissions($user, "modify_student_data")) { |
200 | unless ($authz->hasPermissions($user, "modify_student_data")) { |
| 200 | $self->{submitError} = "You are not authorized to modify student data"; |
201 | $self->{submitError} = "You are not authorized to modify student data"; |
| 201 | return; |
202 | return; |
| … | |
… | |
| 214 | # $db->addPermissionLevel($newPermissionLevel); |
215 | # $db->addPermissionLevel($newPermissionLevel); |
| 215 | # $db->addPassword($newPassword); |
216 | # $db->addPassword($newPassword); |
| 216 | #} |
217 | #} |
| 217 | } |
218 | } |
| 218 | |
219 | |
| 219 | sub title { |
|
|
| 220 | my $self = shift; |
|
|
| 221 | return "User List"; |
|
|
| 222 | } |
|
|
| 223 | |
220 | |
| 224 | sub path { |
221 | |
| 225 | my $self = shift; |
222 | sub body { |
| 226 | my $args = $_[-1]; |
223 | my ($self) = @_; |
| 227 | my $ce = $self->{ce}; |
224 | my $r = $self->r; |
|
|
225 | my $urlpath = $r->urlpath; |
|
|
226 | my $db = $r->db; |
|
|
227 | my $ce = $r->ce; |
|
|
228 | my $authz = $r->authz; |
|
|
229 | my $courseName = $urlpath->arg("courseID"); |
|
|
230 | my $setID = $urlpath->arg("setID"); |
|
|
231 | my $user = $r->param('user'); |
|
|
232 | |
| 228 | my $root = $ce->{webworkURLs}->{root}; |
233 | my $root = $ce->{webworkURLs}->{root}; |
| 229 | my $courseName = $ce->{courseName}; |
|
|
| 230 | |
|
|
| 231 | return $self->pathMacro($args, |
|
|
| 232 | "Home" => "$root", |
|
|
| 233 | $courseName => "$root/$courseName", |
|
|
| 234 | "Instructor Tools" => "$root/$courseName/instructor", |
|
|
| 235 | "Users" => "", # "$root/$courseName/instructor/users", |
|
|
| 236 | ); |
|
|
| 237 | } |
|
|
| 238 | |
234 | |
| 239 | sub body { |
|
|
| 240 | my ($self, $setID) = @_; |
|
|
| 241 | my $r = $self->{r}; |
|
|
| 242 | my $authz = $self->{authz}; |
|
|
| 243 | my $user = $r->param('user'); |
|
|
| 244 | my $db = $self->{db}; |
|
|
| 245 | my $ce = $self->{ce}; |
|
|
| 246 | my $root = $ce->{webworkURLs}->{root}; |
|
|
| 247 | my $courseName = $ce->{courseName}; |
|
|
| 248 | |
|
|
| 249 | # templates for getting field names |
235 | # templates for getting field names |
| 250 | my $userTemplate = $self->{userTemplate} = $db->newUser; |
236 | my $userTemplate = $self->{userTemplate} = $db->newUser; |
| 251 | my $permissionLevelTemplate = $self->{permissionLevelTemplate} = $db->newPermissionLevel; |
237 | my $permissionLevelTemplate = $self->{permissionLevelTemplate} = $db->newPermissionLevel; |
| 252 | |
238 | |
| 253 | return CGI::em("You are not authorized to access the Instructor tools.") |
239 | return CGI::em("You are not authorized to access the Instructor tools.") |
| … | |
… | |
| 642 | ); |
628 | ); |
| 643 | } |
629 | } |
| 644 | |
630 | |
| 645 | sub delete_handler { |
631 | sub delete_handler { |
| 646 | my ($self, $genericParams, $actionParams, $tableParams) = @_; |
632 | my ($self, $genericParams, $actionParams, $tableParams) = @_; |
| 647 | my $db = $self->{db}; |
633 | my $r = $self->r; |
|
|
634 | my $db = $r->db; |
| 648 | my $scope = $actionParams->{"action.delete.scope"}->[0]; |
635 | my $scope = $actionParams->{"action.delete.scope"}->[0]; |
| 649 | |
636 | |
| 650 | my @userIDsToDelete = (); |
637 | my @userIDsToDelete = (); |
| 651 | #if ($scope eq "visible") { |
638 | #if ($scope eq "visible") { |
| 652 | # @userIDsToDelete = @{ $self->{visibleUserIDs} }; |
639 | # @userIDsToDelete = @{ $self->{visibleUserIDs} }; |
| … | |
… | |
| 830 | return "Abandon changes"; |
817 | return "Abandon changes"; |
| 831 | } |
818 | } |
| 832 | |
819 | |
| 833 | sub cancelEdit_handler { |
820 | sub cancelEdit_handler { |
| 834 | my ($self, $genericParams, $actionParams, $tableParams) = @_; |
821 | my ($self, $genericParams, $actionParams, $tableParams) = @_; |
| 835 | my $r = $self->{r}; |
822 | my $r = $self->r; |
| 836 | |
823 | |
| 837 | #$self->{selectedUserIDs} = $self->{visibleUserIDs}; |
824 | #$self->{selectedUserIDs} = $self->{visibleUserIDs}; |
| 838 | # only do the above if we arrived here via "edit selected users" |
825 | # only do the above if we arrived here via "edit selected users" |
| 839 | if (defined $r->param("prev_visible_users")) { |
826 | if (defined $r->param("prev_visible_users")) { |
| 840 | $self->{visibleUserIDs} = [ $r->param("prev_visible_users") ]; |
827 | $self->{visibleUserIDs} = [ $r->param("prev_visible_users") ]; |
| … | |
… | |
| 853 | return "Save changes"; |
840 | return "Save changes"; |
| 854 | } |
841 | } |
| 855 | |
842 | |
| 856 | sub saveEdit_handler { |
843 | sub saveEdit_handler { |
| 857 | my ($self, $genericParams, $actionParams, $tableParams) = @_; |
844 | my ($self, $genericParams, $actionParams, $tableParams) = @_; |
| 858 | my $r = $self->{r}; |
845 | my $r = $self->r; |
| 859 | my $db = $self->{db}; |
846 | my $db = $r->db; |
| 860 | |
847 | |
| 861 | my @visibleUserIDs = @{ $self->{visibleUserIDs} }; |
848 | my @visibleUserIDs = @{ $self->{visibleUserIDs} }; |
| 862 | foreach my $userID (@visibleUserIDs) { |
849 | foreach my $userID (@visibleUserIDs) { |
| 863 | my $User = $db->getUser($userID); # checked |
850 | my $User = $db->getUser($userID); # checked |
| 864 | die "record for visible user $userID not found" unless $User; |
851 | die "record for visible user $userID not found" unless $User; |
| … | |
… | |
| 929 | return %result; |
916 | return %result; |
| 930 | } |
917 | } |
| 931 | |
918 | |
| 932 | sub importUsersFromCSV { |
919 | sub importUsersFromCSV { |
| 933 | my ($self, $fileName, $createNew, $replaceExisting, @replaceList) = @_; |
920 | my ($self, $fileName, $createNew, $replaceExisting, @replaceList) = @_; |
|
|
921 | my $r = $self->r; |
| 934 | my $ce = $self->{ce}; |
922 | my $ce = $r->ce; |
| 935 | my $db = $self->{db}; |
923 | my $db = $r->db; |
| 936 | my $dir = $ce->{courseDirs}->{templates}; |
924 | my $dir = $ce->{courseDirs}->{templates}; |
| 937 | |
925 | |
| 938 | die "illegal character in input: \"/\"" if $fileName =~ m|/|; |
926 | die "illegal character in input: \"/\"" if $fileName =~ m|/|; |
| 939 | die "won't be able to read from file $dir/$fileName: does it exist? is it readable?" |
927 | die "won't be able to read from file $dir/$fileName: does it exist? is it readable?" |
| 940 | unless -r "$dir/$fileName"; |
928 | unless -r "$dir/$fileName"; |
| 941 | |
929 | |
| … | |
… | |
| 1005 | return \@replaced, \@added, \@skipped; |
993 | return \@replaced, \@added, \@skipped; |
| 1006 | } |
994 | } |
| 1007 | |
995 | |
| 1008 | sub exportUsersToCSV { |
996 | sub exportUsersToCSV { |
| 1009 | my ($self, $fileName, @userIDsToExport) = @_; |
997 | my ($self, $fileName, @userIDsToExport) = @_; |
| 1010 | my $ce = $self->{ce}; |
998 | my $r = $self->r; |
| 1011 | my $db = $self->{db}; |
999 | my $ce = $r->ce; |
|
|
1000 | my $db = $r->db; |
| 1012 | my $dir = $ce->{courseDirs}->{templates}; |
1001 | my $dir = $ce->{courseDirs}->{templates}; |
| 1013 | |
1002 | |
| 1014 | die "illegal character in input: \"/\"" if $fileName =~ m|/|; |
1003 | die "illegal character in input: \"/\"" if $fileName =~ m|/|; |
| 1015 | |
1004 | |
| 1016 | open my $fh, ">", "$dir/$fileName" |
1005 | open my $fh, ">", "$dir/$fileName" |
| 1017 | or die "failed to open file $dir/$fileName for writing: $!\n"; |
1006 | or die "failed to open file $dir/$fileName for writing: $!\n"; |
| … | |
… | |
| 1081 | } |
1070 | } |
| 1082 | } |
1071 | } |
| 1083 | |
1072 | |
| 1084 | sub recordEditHTML { |
1073 | sub recordEditHTML { |
| 1085 | my ($self, $User, $PermissionLevel, %options) = @_; |
1074 | my ($self, $User, $PermissionLevel, %options) = @_; |
| 1086 | my $r = $self->{r}; |
1075 | my $r = $self->r; |
| 1087 | my $ce = $self->{ce}; |
1076 | my $urlpath = $r->urlpath; |
|
|
1077 | my $ce = $r->ce; |
| 1088 | my $root = $ce->{webworkURLs}->{root}; |
1078 | my $root = $ce->{webworkURLs}->{root}; |
| 1089 | my $courseName = $ce->{courseName}; |
1079 | my $courseName = $urlpath->arg("courseID"); |
| 1090 | |
1080 | |
| 1091 | my $editMode = $options{editMode}; |
1081 | my $editMode = $options{editMode}; |
| 1092 | my $userSelected = $options{userSelected}; |
1082 | my $userSelected = $options{userSelected}; |
| 1093 | |
1083 | |
| 1094 | my $changeEUserURL = "$root/$courseName?" |
1084 | my $changeEUserURL = "$root/$courseName?" |
| … | |
… | |
| 1157 | return CGI::Tr({}, CGI::td({}, \@tableCells)); |
1147 | return CGI::Tr({}, CGI::td({}, \@tableCells)); |
| 1158 | } |
1148 | } |
| 1159 | |
1149 | |
| 1160 | sub printTableHTML { |
1150 | sub printTableHTML { |
| 1161 | my ($self, $UsersRef, $PermissionLevelsRef, $fieldNamesRef, %options) = @_; |
1151 | my ($self, $UsersRef, $PermissionLevelsRef, $fieldNamesRef, %options) = @_; |
| 1162 | my $r = $self->{r}; |
1152 | my $r = $self->r; |
| 1163 | my $userTemplate = $self->{userTemplate}; |
1153 | my $userTemplate = $self->{userTemplate}; |
| 1164 | my $permissionLevelTemplate = $self->{permissionLevelTemplate}; |
1154 | my $permissionLevelTemplate = $self->{permissionLevelTemplate}; |
| 1165 | my @Users = @$UsersRef; |
1155 | my @Users = @$UsersRef; |
| 1166 | my @PermissionLevels = @$PermissionLevelsRef; |
1156 | my @PermissionLevels = @$PermissionLevelsRef; |
| 1167 | my %fieldNames = %$fieldNamesRef; |
1157 | my %fieldNames = %$fieldNamesRef; |
| 1168 | |
1158 | |
| 1169 | my $editMode = $options{editMode}; |
1159 | my $editMode = $options{editMode}; |
| 1170 | my %selectedUserIDs = map { $_ => 1 } @{ $options{selectedUserIDs} }; |
1160 | my %selectedUserIDs = map { $_ => 1 } @{ $options{selectedUserIDs} }; |
| 1171 | my $currentSort = $options{currentSort}; |
1161 | my $currentSort = $options{currentSort}; |
| 1172 | |
1162 | |
| 1173 | # names of headings: |
1163 | # names of headings: |
| 1174 | my @realFieldNames = ( |
1164 | my @realFieldNames = ( |
| 1175 | $userTemplate->KEYFIELDS, |
1165 | $userTemplate->KEYFIELDS, |
| 1176 | $userTemplate->NONKEYFIELDS, |
1166 | $userTemplate->NONKEYFIELDS, |