Parent Directory
|
Revision Log
Added button to link to scoring of sets. Removed some debugging warning messages. --Mike
1 ################################################################################ 2 # WeBWorK mod_perl (c) 2000-2002 WeBWorK Project 3 # $Id$ 4 ################################################################################ 5 6 package WeBWorK::ContentGenerator::Instructor::Index; 7 use base qw(WeBWorK::ContentGenerator::Instructor); 8 9 =head1 NAME 10 11 WeBWorK::ContentGenerator::Instructor::Index - Menu interface to the Instructor pages 12 13 =cut 14 15 use strict; 16 use warnings; 17 use Apache::Constants qw(:common REDIRECT DONE); 18 use CGI qw(); 19 sub pre_header_initialize { 20 my ($self, $setName, $problemNumber) = @_; 21 my $r = $self->{r}; 22 my $ce = $self->{ce}; 23 my $db = $self->{db}; 24 my $authz = $self->{authz}; 25 my $userName = $r->param('user'); 26 my $effectiveUserName = $r->param('effectiveUser'); 27 my $key = $r->param('key'); 28 my $user = $db->getUser($userName); 29 my $effectiveUser = $db->getUser($effectiveUserName); 30 my $permissionLevel = $db->getPermissionLevel($userName)->permission(); 31 unless ($authz->hasPermissions($userName, "modify_student_data")) { 32 $self->{submitError} = "You are not authorized to modify student data"; 33 return; 34 } 35 my @submit_actions = qw(student-dates act-as-student edit-set-dates reset-password assign-passwords 36 set-stats drop-students edit-students-sets edit-sets student-stats edit-class-data 37 add-students send-email score-sets); 38 foreach my $act (@submit_actions) { 39 $self->{current_action } .= "The action <$act> "". $r->param($act) . "" was requested" 40 if defined($r->param($act)); 41 } 42 $self->{selected_sets} = "Set(s) chosen: " . join(" ", $r->param("setList")); 43 $self->{selected_users} = "Student(s) chosen: " .join(" ", $r->param("classList")) ; 44 # Redirect actions 45 defined($r->param('student-dates')) && do { 46 #FIXME will only do one student and one set at a time 47 # it would be good to be able to do many sets for many student 48 # this would require a separate module 49 my $root = $ce->{webworkURLs}->{root}; 50 my $courseName = $ce->{courseName}; 51 my @userList = $r->param("classList"); 52 # can only become the first user listed. 53 my $student = shift @userList; 54 my @setList = $r->param("setList"); 55 # can only become the first user listed. 56 my $setName = shift @setList; 57 my $uri="$root/$courseName/instructor/sets/$setName/?editForUser=$student&".$self->url_authen_args; 58 $r->header_out(Location => $uri); 59 $self->{noContent} = 1; # forces redirect 60 return; 61 }; 62 defined($r->param('act-as-student')) && do { 63 # fix url and redirect 64 my @userList = $r->param("classList"); 65 # can only become the first user listed. 66 my $effectiveUser = shift @userList; 67 my @setList = $r->param("setList"); 68 my $setName = shift @setList; 69 my $root = $ce->{webworkURLs}->{root}; 70 my $courseName = $ce->{courseName}; 71 72 my $uri="$root/$courseName/$setName/?effectiveUser=$effectiveUser&".$self->url_authen_args; 73 #FIXME does the display mode need to be defined? 74 #FIXME url_authen_args also includes an effective user, so the new one must come first. 75 # even that might not work with every browser since there are two effective User assignments. 76 $r->header_out(Location => $uri); 77 $self->{noContent} = 1; # forces redirect 78 return; 79 }; 80 defined($r->param('edit-set-dates')) && do { 81 #FIXME this should be replaced by redirecting to a module where you can edit 82 # dates for several sets at once 83 my $root = $ce->{webworkURLs}->{root}; 84 my $courseName = $ce->{courseName}; 85 my @setList = $r->param("setList"); 86 # can only become the first user listed. 87 my $setName = shift @setList; 88 my $uri="$root/$courseName/instructor/sets/$setName/?".$self->url_authen_args; 89 $r->header_out(Location => $uri); 90 $self->{noContent} = 1; # forces redirect 91 return; 92 }; 93 defined($r->param('reset-password')) && do { 94 # FIXME this should allow me to assign studentID to a number of students 95 # requires a new module 96 my @userList = $r->param("classList"); 97 # can only become the first user listed. 98 my $effectiveUser = shift @userList; 99 my @setList = $r->param("setList"); 100 my $setName = shift @setList; 101 my $root = $ce->{webworkURLs}->{root}; 102 my $courseName = $ce->{courseName}; 103 104 my $uri="$root/$courseName/options/?effectiveUser=$effectiveUser&".$self->url_authen_args; 105 #FIXME does the display mode need to be defined? 106 #FIXME url_authen_args also includes an effective user, so the new one must come first. 107 # even that might not work with every browser since there are two effective User assignments. 108 $r->header_out(Location => $uri); 109 $self->{noContent} = 1; # forces redirect 110 return; 111 }; 112 defined($r->param('assign-passwords')) && do { 113 my @userList = $r->param("classList"); 114 # can only become the first user listed. 115 my $effectiveUser = shift @userList; 116 my @setList = $r->param("setList"); 117 my $setName = shift @setList; 118 my $root = $ce->{webworkURLs}->{root}; 119 my $courseName = $ce->{courseName}; 120 121 my $uri="$root/$courseName/options/?effectiveUser=$effectiveUser&".$self->url_authen_args; 122 #FIXME does the display mode need to be defined? 123 #FIXME url_authen_args also includes an effective user, so the new one must come first. 124 # even that might not work with every browser since there are two effective User assignments. 125 $r->header_out(Location => $uri); 126 $self->{noContent} = 1; # forces redirect 127 return; 128 }; 129 defined($r->param('set-stats')) && do { 130 my $root = $ce->{webworkURLs}->{root}; 131 my $courseName = $ce->{courseName}; 132 my @setList = $r->param("setList"); 133 # can only become the first user listed. 134 my $setName = shift @setList; 135 my $uri="$root/$courseName/instructor/stats/set/$setName?".$self->url_authen_args; 136 $r->header_out(Location => $uri); 137 $self->{noContent} = 1; # forces redirect 138 return; 139 }; 140 defined($r->param('drop-students')) && do { 141 #FIXME this operation should be made faster 142 my $root = $ce->{webworkURLs}->{root}; 143 my $courseName = $ce->{courseName}; 144 my @setList = $r->param("setList"); 145 # can only become the first user listed. 146 my $setName = shift @setList; 147 my $uri="$root/$courseName/instructor/users/?".$self->url_authen_args; 148 $r->header_out(Location => $uri); 149 $self->{noContent} = 1; # forces redirect 150 return; 151 }; 152 defined($r->param('edit-students-sets')) && do { 153 my $root = $ce->{webworkURLs}->{root}; 154 my $courseName = $ce->{courseName}; 155 my @userList = $r->param("classList"); 156 # can only become the first user listed. 157 my $student = shift @userList; 158 my @setList = $r->param("setList"); 159 # can only become the first user listed. 160 my $setName = shift @setList; 161 my $uri="$root/$courseName/instructor/sets/$setName/?editForUser=$student&".$self->url_authen_args; 162 $r->header_out(Location => $uri); 163 $self->{noContent} = 1; # forces redirect 164 return; 165 }; 166 defined($r->param('edit-sets')) && do { 167 my $root = $ce->{webworkURLs}->{root}; 168 my $courseName = $ce->{courseName}; 169 my @setList = $r->param("setList"); 170 # can only become the first user listed. 171 my $setName = shift @setList; 172 my $uri="$root/$courseName/instructor/sets/$setName/?".$self->url_authen_args; 173 $r->header_out(Location => $uri); 174 $self->{noContent} = 1; # forces redirect 175 return; 176 }; 177 defined($r->param('student-stats')) && do { 178 my $root = $ce->{webworkURLs}->{root}; 179 my $courseName = $ce->{courseName}; 180 my @userList = $r->param("classList"); 181 # can only become the first user listed. 182 my $studentName = shift @userList; 183 my $uri="$root/$courseName/instructor/stats/student/$studentName?".$self->url_authen_args; 184 $r->header_out(Location => $uri); 185 $self->{noContent} = 1; # forces redirect 186 return; 187 }; 188 defined($r->param('edit-class-data')) && do { 189 my $root = $ce->{webworkURLs}->{root}; 190 my $courseName = $ce->{courseName}; 191 my @setList = $r->param("setList"); 192 # can only become the first user listed. 193 my $setName = shift @setList; 194 my $uri="$root/$courseName/instructor/users/?".$self->url_authen_args; 195 $r->header_out(Location => $uri); 196 $self->{noContent} = 1; # forces redirect 197 return; 198 }; 199 defined($r->param('add-students')) && do { 200 my $root = $ce->{webworkURLs}->{root}; 201 my $courseName = $ce->{courseName}; 202 203 my $uri="$root/$courseName/instructor/add_users/?".$self->url_authen_args; 204 $r->header_out(Location => $uri); 205 $self->{noContent} = 1; # forces redirect 206 return; 207 }; 208 defined($r->param('send-email')) && do { 209 my $root = $ce->{webworkURLs}->{root}; 210 my $courseName = $ce->{courseName}; 211 212 my $uri="$root/$courseName/instructor/send_mail/?".$self->url_authen_args; 213 $r->header_out(Location => $uri); 214 $self->{noContent} = 1; # forces redirect 215 return; 216 }; 217 defined($r->param('score-sets')) && do { 218 my $root = $ce->{webworkURLs}->{root}; 219 my $courseName = $ce->{courseName}; 220 221 my $uri="$root/$courseName/instructor/scoring/?scoreSelected=Score%20Selected&".$self->url_authen_args; 222 my @selectedSets = $r->param('setList'); 223 $uri .= "&selectedSet=$_" foreach (@selectedSets); 224 $r->header_out(Location => $uri); 225 $self->{noContent} = 1; # forces redirect 226 return; 227 }; 228 229 } 230 # override contentGenerator header routine for now 231 # FIXME 232 sub header { 233 my $self = shift; 234 return REDIRECT if $self->{noContent}; 235 my $r = $self->{r}; 236 $r->content_type('text/html'); 237 $r->send_http_header(); 238 return OK; 239 } 240 sub initialize { 241 my ($self) = @_; 242 my $r = $self->{r}; 243 my $db = $self->{db}; 244 my $ce = $self->{ce}; 245 my $authz = $self->{authz}; 246 my $user = $r->param('user'); 247 248 unless ($authz->hasPermissions($user, "modify_student_data")) { 249 $self->{submitError} = "You are not authorized to modify student data"; 250 return; 251 } 252 253 ############################################################################################# 254 # gather database data 255 ############################################################################################# 256 # FIXME this might be better done in body? We don't always need all of this data. or do we? 257 # Obtaining the list of users 258 my @userNames = $db->listUsers; 259 my @user_records = $db->getUsers(@userNames); 260 261 # store data 262 $self->{ra_users} = \@userNames; 263 $self->{ra_user_records} = \@user_records; 264 265 # Obtaining list of sets: 266 my @setNames = $db->listGlobalSets(); 267 my @set_records = (); 268 @set_records = $db->getMergedSets(map {[$user,$_]} @setNames); 269 # foreach my $name (@setNames) { 270 # my $set_record; 271 # $set_record = $db->getMergedSet($user,$name,) ; 272 # 273 # #warn "Adding set $name", ref($set_record); 274 # push @set_records, $set_record; 275 # } 276 277 278 # store data 279 $self->{ra_sets} = \@setNames; 280 $self->{ra_set_records} = \@set_records; 281 282 } 283 sub path { 284 my $self = shift; 285 my $args = $_[-1]; 286 287 my $ce = $self->{ce}; 288 my $root = $ce->{webworkURLs}->{root}; 289 my $courseName = $ce->{courseName}; 290 return $self->pathMacro($args, 291 "Home" => "$root", 292 $courseName => "$root/$courseName", 293 'instructor' => '', 294 ); 295 } 296 297 sub title { 298 my $self = shift; 299 return "Instructor tools for ".$self->{ce}->{courseName}; 300 } 301 302 sub body { 303 my $self = shift; 304 my $r = $self->{r}; 305 my $ce = $self->{ce}; 306 my $db = $self->{db}; 307 my $authz = $self->{authz}; 308 my $courseName = $ce->{courseName}; 309 my $authen_args = $self->url_authen_args(); 310 my $user = $r->param('user'); 311 my $prof_url = $ce->{webworkURLs}->{oldProf}; 312 my $full_url = "$prof_url?course=$courseName&$authen_args"; 313 my $userEditorURL = "users/?" . $self->url_args; 314 my $problemSetEditorURL = "sets/?" . $self->url_args; 315 my $statsURL = "stats/?" . $self->url_args; 316 my $emailURL = "send_mail/?" . $self->url_args; 317 ################### debug code 318 # my $permissonLevel = $self->{db}->getPermissionLevel($user)->permission(); 319 # 320 # my $courseEnvironmentLevels = $self->{ce}->{permissionLevels}; 321 # return CGI::em(" user $permissonLevel permlevels ".join("<>",%$courseEnvironmentLevels)); 322 ################### debug code 323 return CGI::em('You are not authorized to access the Instructor tools.') unless $authz->hasPermissions($user, 'access_instructor_tools'); 324 my $actionURL= $r->uri; 325 return join("", 326 #defined($self->{current_action}) ? CGI::h4($self->{current_action}) :'' , 327 #defined($self->{selected_users}) ? CGI::p($self->{selected_users}) : '', 328 #defined($self->{selected_sets}) ? CGI::p($self->{selected_sets}) : '', 329 CGI::a({href=>$full_url},"Link to WeBWorK 1.9 Instructor tools"), 330 CGI::start_form(-method=>"POST", -action=>$actionURL),"\n", 331 $self->hidden_authen_fields,"\n", 332 CGI::start_table({-border=>2,-cellpadding=>5}), 333 CGI::Tr({ -align=>'center'}, 334 CGI::td({colspan=>2},[ 335 CGI::input({type=>'submit',value=>'Add students...',name=>'add-students'}), 336 CGI::input({type=>'submit',value=>'Send email...',name=>'send-email'}), 337 ] 338 ), 339 340 341 ), 342 CGI::Tr({ -align=>'center'}, 343 CGI::td({colspan=>1},[ 344 345 CGI::input({type=>'submit',value=>'Reset password',name=>'reset-password'}), 346 CGI::input({type=>'submit',value=>'Assign passwords...',name=>'assign-passwords'}), 347 CGI::input({type=>'submit',value=>'View set statistics...',name=>'set-stats'}), 348 CGI::input({type=>'submit',value=>'Edit set(s) dates...',name=>'edit-set-dates'}) 349 ] 350 ) 351 352 ), 353 CGI::Tr({ -align=>'center'}, 354 CGI::td({colspan=>1},[ 355 CGI::input({type=>'submit',value=>'View student statistics...',name=>'student-stats'}), 356 CGI::input({type=>'submit',value=>'Edit class data for students...',name=>'edit-class-data'}), 357 CGI::input({type=>'submit',value=>'Edit set(s) data...',name=>'edit-sets'}), 358 CGI::input({type=>'submit',value=>'Score selected set(s)...',name=>'score-sets'}), 359 ] 360 ), 361 ), 362 363 364 CGI::Tr({ -align=>'center'}, 365 CGI::td({colspan=>2},[ 366 $self->popup_user_form, 367 $self->popup_set_form, 368 ] 369 ) 370 371 ), 372 CGI::Tr({ -align=>'center'}, 373 CGI::td({colspan=>1},[ 374 375 CGI::input({type=>'submit',value=>'Edit student(s)/set(s) dates',name=>'student-dates'}), 376 CGI::input({type=>'submit',value=>'Act as student in set...',name=>'act-as-student'}), 377 ] 378 ), 379 CGI::td({colspan=>2}, 380 CGI::input({type=>'submit',value=>'Edit student(s) data for selected set(s)...',name=>'edit-students-sets'}), 381 382 383 ) 384 385 ), 386 387 CGI::Tr({ -align=>'center'}, 388 CGI::td({colspan=>2},[ 389 CGI::input({type=>'submit',value=>'Drop student(s)',name=>'drop-students'}), 390 ' ' 391 ] 392 ), 393 394 395 ), 396 397 CGI::end_table(), 398 CGI::end_form(), 399 # CGI::hr(), 400 # CGI::p( defined($self->{studentEntryReport}) ? $self->{studentEntryReport}:'' 401 # ), 402 # 403 # $self->addStudentForm, 404 ); 405 } 406 sub addStudentForm { 407 my $self = shift; 408 my $r = $self->{r}; 409 410 # Add a student form 411 join( "", 412 CGI::p("Add new students"), 413 CGI::start_form({method=>"post", action=>$r->uri()}), 414 $self->hidden_authen_fields(), 415 CGI::start_table({border=>'1', cellpadding=>'2'}), 416 CGI::Tr({}, 417 CGI::th({}, 418 ['Last Name', 'First Name', 'Student ID', 'Login Name', 'Email Address', 'Section','Recitation', 'Comment'] 419 ) 420 ), 421 CGI::Tr({}, 422 CGI::td({}, 423 [ CGI::input({name=>'last_name'}), 424 CGI::input({name=>'first_name'}), 425 CGI::input({name=>'student_id',size=>'16'}), 426 CGI::input({name=>'new_user_id',size=>'10'}), 427 CGI::input({name=>'email_address'}), 428 CGI::input({name=>'section',size=>'10'}), 429 CGI::input({name=>'recitation',size=>'10'}), 430 CGI::input({name=>'comment'}), 431 432 433 ] 434 ) 435 ), 436 CGI::end_table(), 437 CGI::submit({name=>"addStudent", value=>"Add Student"}), 438 CGI::end_form(), 439 ); 440 441 442 443 444 445 446 } 447 sub popup_user_form { 448 my $self = shift; 449 my $r = $self->{r}; 450 my $authz = $self->{authz}; 451 my $user = $r->param('user'); 452 my $db = $self->{db}; 453 my $ce = $self->{ce}; 454 my $root = $ce->{webworkURLs}->{root}; 455 my $courseName = $ce->{courseName}; 456 457 # return CGI::em("You are not authorized to access the Instructor tools.") unless $authz->hasPermissions($user, "access_instructor_tools"); 458 459 # This code will require changing if the permission and user tables ever have different keys. 460 my @users = (); 461 my $ra_user_records = $self->{ra_user_records}; 462 my %classlistLabels = ();# %$hr_classlistLabels; 463 my @user_records = sort { ( lc($a->section) cmp lc($b->section) ) || 464 ( lc($a->last_name) cmp lc($b->last_name )) } @{$ra_user_records}; 465 foreach my $ur (@{user_records}) { 466 $classlistLabels{$ur->user_id} = $ur->last_name. ', '. $ur->first_name.' - '.$ur->section.' '.$ur->user_id; 467 push(@users, $ur->user_id); 468 } 469 return CGI::popup_menu(-name=>'classList', 470 -values=>\@users, 471 -labels=>\%classlistLabels, 472 -size => 10, 473 -multiple => 1, 474 -default=>$user 475 ), 476 477 478 } 479 sub popup_set_form { 480 my $self = shift; 481 my $r = $self->{r}; 482 my $authz = $self->{authz}; 483 my $user = $r->param('user'); 484 my $db = $self->{db}; 485 my $ce = $self->{ce}; 486 my $root = $ce->{webworkURLs}->{root}; 487 my $courseName = $ce->{courseName}; 488 489 # return CGI::em("You are not authorized to access the Instructor tools.") unless $authz->hasPermissions($user, "access_instructor_tools"); 490 491 # This code will require changing if the permission and user tables ever have different keys. 492 my @setNames = (); 493 my $ra_set_records = $self->{ra_set_records}; 494 my %setLabels = ();# %$hr_classlistLabels; 495 my @set_records = sort {$a->set_id cmp $b->set_id } @{$ra_set_records}; 496 foreach my $sr (@set_records) { 497 $setLabels{$sr->set_id} = $sr->set_id; 498 push(@setNames, $sr->set_id); # reorder sets 499 } 500 return CGI::popup_menu(-name=>'setList', 501 -values=>\@setNames, 502 -labels=>\%setLabels, 503 -size => 10, 504 -multiple => 1, 505 #-default=>$user 506 ), 507 508 509 } 510 1; 511 512 __END__ 513 514 =head1 AUTHOR 515 516 Written by Dennis Lambe Jr., malsyned (at) math.rochester.edu 517 518 =cut
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |