Parent Directory
|
Revision Log
nothing should change
1 #!/usr/local/bin/perl 2 3 ## $Id$ 4 5 #################################################################### 6 # Copyright @ 1995-1998 University of Rochester 7 # All Rights Reserved 8 #################################################################### 9 10 11 ## This file is profChangeDates.pl 12 ## It provides access to utilities for building, correcting and viewing problem sets 13 ## 14 15 16 use lib '.'; use webworkInit; # WeBWorKInitLine 17 require 5.001; 18 use strict; 19 20 21 use Global; 22 use Auth; 23 use TimeLocal; 24 use CGI qw(:standard); 25 26 27 # Timing code 28 use Benchmark; 29 my $beginTime = new Benchmark; 30 # end Timing code 31 32 # variables global to this file 33 my ($setNumber,$setHeaderFileName,$probHeaderFileName,$dueDate,$openDate,$answerDate,$problemListref,$problemValueListref,$problemAttemptLimitListref); 34 my (@problemList,@problemValueList,@problemAttemptLimitList); 35 36 &CGI::ReadParse; 37 my %inputs=%main::in; 38 39 my ($classID, $fileName); 40 41 # establish environment for this script 42 43 my $Course = $inputs{'course'}; 44 &Global::getCourseEnvironment($Course); 45 46 47 my $cgiURL = getWebworkCgiURL($Course); 48 my $courseScriptsDirectory = getCourseScriptsDirectory($Course); 49 my $databaseDirectory = getCourseDatabaseDirectory($Course); 50 my $htmlURL = getCourseHtmlURL($Course); 51 my $scriptDirectory = getWebworkScriptDirectory($Course); 52 my $templateDirectory = getCourseTemplateDirectory; 53 54 require "${scriptDirectory}$Global::DBglue_pl"; 55 require "${scriptDirectory}$Global::FILE_pl"; 56 require "${scriptDirectory}$Global::HTMLglue_pl"; 57 58 my $updateMethod =$inputs{'updateMethod'}; 59 60 # log access 61 &Global::log_info('', query_string); 62 63 &webDatePage; 64 65 # begin Timing code 66 my $endTime = new Benchmark; 67 &Global::logTimingInfo($beginTime,$endTime,"profChangeDates.pl",$inputs{'course'},$inputs{'course'}); 68 # end Timing code 69 exit; 70 71 #####################################END###################################### 72 73 sub webDatePage { 74 # verify the identity of the user. 75 my $keyFile = &Global::getCourseKeyFile($inputs{'course'}); 76 &verify_key($inputs{'user'}, $inputs{'key'}, "$keyFile", $inputs{'course'}); 77 my $permissionsFile = &Global::getCoursePermissionsFile($inputs{'course'}); 78 my $permissions = &get_permissions($inputs{'user'}, $permissionsFile); 79 if ($permissions != $Global::instructor_permissions ) { 80 print "permissions = $permissions instructor_permissions= $Global::instructor_permissions\n"; 81 print &html_NO_PERMISSION; 82 exit(0); 83 } 84 # if (!defined($inputs{'pCD'})) { 85 # print &htmlTOP("Change Open/Due/Answer Date"); 86 # # print navigation buttons 87 # print qq! 88 # <A HREF="${cgiURL}profLogin.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> 89 # <IMG SRC="${Global::upImgUrl}" align="right" BORDER=1 ALT="[Up]"></A><p> 90 # !; 91 # 92 # &printProbSetForm; 93 # print &htmlBOTTOM("profChangeDates.pl", \%inputs); 94 # exit; 95 # } 96 97 if ($inputs{'pCD'}==1) { 98 print &htmlTOP("Change Open/Due/Answer Date: Page 2"); 99 # print navigation buttons 100 print qq! 101 <A HREF="${cgiURL}profLogin.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> 102 <IMG SRC="${Global::upImgUrl}" align="right" BORDER=1 ALT="[Up]"></A><p> 103 !; 104 $setNumber=$inputs{'setNo'}; 105 &printForms($setNumber); 106 print &htmlBOTTOM("profChangeDates.pl", \%inputs); 107 } 108 109 else { 110 111 print &htmlTOP("Change Open/Due/Answer Date: Page 3"); 112 # print navigation buttons 113 print qq! 114 <A HREF="${cgiURL}profLogin.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> 115 <IMG SRC="${Global::upImgUrl}" align="right" BORDER=1 ALT="[Up]"></A><p> 116 !; 117 if ($inputs{'dateMode'} eq 'READWRITE') { 118 &changeDates(); 119 &sendBack; 120 } 121 else { 122 print '<H2>Read only mode, no changes made </H2>'; 123 print 'Go back and select Read/Write mode if you want to save changes.'; 124 &sendBack; 125 } 126 print &htmlBOTTOM("profChangeDates.pl", \%inputs); 127 } 128 } 129 130 131 132 133 134 #sub printProbSetForm { 135 # print "<form action=\"${Global::cgiURL}profChangeDates.pl\">\n"; 136 # 137 # my %setNumberHash=&getAllProbSetNumbersHash; 138 # &printProbSets("setNo",\%setNumberHash); 139 # 140 # print "<input type=\"hidden\" name=\"pCD\" value=1>\n"; 141 # print &sessionKeyInputs(\%inputs); 142 # print "<br><input type=\"submit\" value=\"Continue\"></form>"; 143 #} 144 145 sub printForms { 146 my ($setNumber) = @_; 147 print qq!<FORM method="post" action="profChangeDates.pl">\n!; 148 &printChangeOpenForm(&findOpenDateForSet($setNumber)); 149 &printChangeDueForm( &findDueDateForSet($setNumber)); 150 &printChangeAnswerForm(&findAnswerDateForSet($setNumber)); 151 152 &printChangeSetHeaderFileForm(&findSetHeaderFileForSet($setNumber)); 153 &printChangeProbHeaderFileForm(&findProbHeaderFileForSet($setNumber)); 154 155 156 print qq! 157 <TABLE><TR>\n<TD> 158 Read Only<INPUT TYPE="RADIO" NAME="dateMode" VALUE="READONLY" CHECKED>\n 159 </TD><TD> 160 Read/Write<INPUT TYPE="RADIO" NAME="dateMode" VALUE="READWRITE">\n 161 </TD><TD> 162 <input type=submit value="Save Above Changes">\n 163 </TD></TR></TABLE>\n 164 <input type=hidden name="pCD" value=2>\n 165 <input type=hidden name="setNo" value=$setNumber>\n 166 !; 167 print &sessionKeyInputs(\%inputs); 168 print "</FORM>\n"; 169 170 &printChangeProblemFileNamesForm(); 171 172 173 } 174 175 176 sub changeDates { 177 my $newOpenDate=$inputs{'openDate'}; 178 my $newDueDate=$inputs{'dueDate'}; 179 my $newAnswerDate=$inputs{'ansDate'}; 180 my $newSetHeaderFile = stripWhiteSpace($inputs{'setHeaderFile'}); 181 my $newProbHeaderFile = stripWhiteSpace($inputs{'probHeaderFile'}); 182 183 my $time1 = &unformatDateAndTime($newOpenDate); 184 my $time2 = &unformatDateAndTime($newDueDate); 185 my $time3 = &unformatDateAndTime($newAnswerDate); 186 if ($time2 < $time1 or $time3 < $time2) { 187 &Global::error('Dates not in chronological order', "The open date: $newOpenDate, 188 due date: $newDueDate, and answer date: $newAnswerDate must be in chronologicasl order."); 189 } 190 191 my $setNumber=$inputs{'setNo'}; 192 193 changeDatesAndHeaderFiles($setNumber,$newOpenDate,$newDueDate,$newAnswerDate,$newSetHeaderFile,$newProbHeaderFile); 194 195 # &changeOpenDate($newOpenDate,$setNumber); 196 # print "<BR><BR>\n"; 197 # &changeDueDate($newDueDate,$setNumber); 198 # print "<BR><BR>\n"; 199 # &changeAnswerDate($newAnswerDate,$setNumber); 200 # print "<BR><BR>\n"; 201 # &changeSetHeaderFile($newSetHeaderFile,$setNumber); 202 # print "<BR><BR>\n"; 203 # &changeProbHeaderFile($newProbHeaderFile,$setNumber); 204 # print "<BR><BR>\n"; 205 206 } 207 208 sub findOpenDateForSet { 209 my ($setNumber) = @_; 210 my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); 211 &attachProbSetRecord($probSetKeys[0]); 212 &detachProbSetRecord($probSetKeys[0]); 213 &formatDateAndTime( &getOpenDate($probSetKeys[0])); 214 } 215 216 sub printChangeOpenForm { 217 my ( $prettyOldOpenDate) = @_; 218 print <<EOF; 219 <H3 ALIGN ="CENTER">Class Identification: $inputs{'course'}</H3> 220 Use this form to makes changes for an entire set. To make changes 221 for an individual student go back and use "Examine or change individual problem set for:" 222 223 <HR SIZE =2> 224 <H3> Change opening and closing dates for set number $setNumber</H3> 225 Please enter the new dates in the following format:<BR>6/28/96 at 226 9:59 AM (June 28, 1996 at 9:59 AM)<p> 227 228 Select the method you want to use. If e.g. you have given a few students an extension and 229 do not want to override those changes, select the second method. <p> 230 <INPUT TYPE=RADIO NAME='updateMethod' VALUE='all' > Change dates for all students.<BR> 231 <INPUT TYPE=RADIO NAME='updateMethod' VALUE='some' CHECKED> 232 Change dates only if the new date is later than an individual student\'s current date.<P> 233 234 The current openDate is 235 $prettyOldOpenDate 236 237 <input type="text" size=20 maxlength=20 name="openDate" 238 value="$prettyOldOpenDate"> New openDate<p> 239 240 EOF 241 } 242 243 sub findDueDateForSet { 244 my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); 245 &attachProbSetRecord($probSetKeys[0]); 246 &detachProbSetRecord($probSetKeys[0]); 247 &formatDateAndTime( &getDueDate($probSetKeys[0])); 248 } 249 250 sub printChangeDueForm { 251 my ( $prettyOldDueDate) = @_; 252 print <<EOF; 253 254 255 <p> The current DueDate is $prettyOldDueDate 256 257 <input type="text" size=20 maxlength=20 name="dueDate" 258 value="$prettyOldDueDate"> New DueDate<p> 259 260 EOF 261 } 262 263 sub findAnswerDateForSet { 264 my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); 265 &attachProbSetRecord($probSetKeys[0]); 266 &detachProbSetRecord($probSetKeys[0]); 267 &formatDateAndTime( &getAnswerDate($probSetKeys[0])); 268 } 269 270 sub printChangeAnswerForm { 271 my ( $prettyOldAnswerDate) = @_; 272 print <<EOF; 273 274 275 <p> The current AnswerDate is $prettyOldAnswerDate 276 277 <input type="text" size=20 maxlength=20 name="ansDate" 278 value="$prettyOldAnswerDate"> New AnswerDate<p> 279 280 EOF 281 } 282 283 sub changeDatesAndHeaderFiles { 284 my ($setNumber,$newOpenDate,$newDueDate,$newAnswerDate,$newSetHeaderFileName,$newProbHeaderFileName) = @_; 285 286 my $newOpenDateTime = &unformatDateAndTime($newOpenDate); 287 my $newDueDateTime = &unformatDateAndTime($newDueDate); 288 my $newAnswerDateTime = &unformatDateAndTime($newAnswerDate); 289 290 my $oldOpenDateTime; 291 my $oldDueDateTime; 292 my $oldAnswerDateTime; 293 294 my @probSetKeys=&getAllProbSetKeysForSet($setNumber); 295 my $probSetKey; 296 297 foreach $probSetKey (@probSetKeys) { 298 &attachProbSetRecord($probSetKey); 299 300 if ($updateMethod eq 'all') { 301 &putOpenDate($newOpenDateTime,$probSetKey); 302 &putDueDate($newDueDateTime,$probSetKey); 303 &putAnswerDate($newAnswerDateTime,$probSetKey); 304 } 305 else { 306 $oldOpenDateTime = &getOpenDate($probSetKey); 307 &putOpenDate($newOpenDateTime,$probSetKey) unless ($oldOpenDateTime > $newOpenDateTime); 308 309 $oldDueDateTime = &getDueDate($probSetKey); 310 &putDueDate($newDueDateTime,$probSetKey) unless ($oldDueDateTime > $newDueDateTime); 311 312 $oldAnswerDateTime = &getAnswerDate($probSetKey); 313 &putAnswerDate($newAnswerDateTime,$probSetKey) unless ($oldAnswerDateTime > $newAnswerDateTime); 314 } 315 &putSetHeaderFileName( $newSetHeaderFileName,$probSetKey); 316 &putProbHeaderFileName( $newProbHeaderFileName,$probSetKey); 317 318 &detachProbSetRecord($probSetKey); 319 } 320 321 print "<BR><BR>The new open date is now set to: $newOpenDate for all students\n"; 322 print "except if their original open date was later than $newOpenDate\n" unless ($updateMethod eq 'all'); 323 print "<HR><BR>\n"; 324 325 print "The new due date is now set to: $newDueDate for all students\n"; 326 print "except if their original due date was later than $newDueDate\n" unless ($updateMethod eq 'all'); 327 print "<HR><BR>\n"; 328 329 print "The new answer date is now set to: $newAnswerDate for all students\n"; 330 print "except if their original answer date was later than $newAnswerDate\n" unless ($updateMethod eq 'all'); 331 print "<HR><BR>\n"; 332 333 print "The new Paper HeaderFile is: $newSetHeaderFileName \n"; 334 print "<HR><BR>\n"; 335 336 print "The new Screen HeaderFile is: $newProbHeaderFileName \n"; 337 print "<HR><BR>\n"; 338 339 } 340 341 #sub changeOpenDate { 342 # my ($newOpenDate,$setNumber) = @_; 343 # my $newOpenDateTime = &unformatDateAndTime($newOpenDate); 344 # my @probSetKeys=&getAllProbSetKeysForSet($setNumber); 345 # my $probSetKey; 346 # my $oldOpenDateTime; 347 # foreach $probSetKey (@probSetKeys) { 348 # &attachProbSetRecord($probSetKey); 349 # if ($updateMethod eq 'all') {&putOpenDate($newOpenDateTime,$probSetKey);} 350 # else { 351 # $oldOpenDateTime = &getOpenDate($probSetKey); 352 # &putOpenDate($newOpenDateTime,$probSetKey) unless ($oldOpenDateTime > $newOpenDateTime); 353 # } 354 # &detachProbSetRecord($probSetKey); 355 # } 356 # 357 # print "The new open date is now set to: $newOpenDate for all students\n"; 358 # print "except if their original open date was later than $newOpenDate\n" unless ($updateMethod eq 'all'); 359 # print "_"x80 . "\n"; 360 #} 361 # 362 #sub changeDueDate { 363 # my ($newDueDate,$setNumber) = @_; 364 # my $newDueDateTime = &unformatDateAndTime($newDueDate); 365 # my @probSetKeys=&getAllProbSetKeysForSet($setNumber); 366 # my $probSetKey; 367 # my $oldDueDateTime; 368 # foreach $probSetKey (@probSetKeys) { 369 # &attachProbSetRecord($probSetKey); 370 # if ($updateMethod eq 'all') {&putDueDate($newDueDateTime,$probSetKey);} 371 # else { 372 # $oldDueDateTime = &getDueDate($probSetKey); 373 # &putDueDate($newDueDateTime,$probSetKey) unless ($oldDueDateTime > $newDueDateTime); 374 # } &detachProbSetRecord($probSetKey); 375 # } 376 # 377 # print "The new due date is now set to: $newDueDate for all students\n"; 378 # print "except if their original due date was later than $newDueDate\n" unless ($updateMethod eq 'all'); 379 # print "_"x80 . "\n"; 380 # 381 #} 382 # 383 #sub changeAnswerDate { 384 # my ($newAnswerDate,$setNumber) = @_; 385 # my $newAnswerDateTime = &unformatDateAndTime($newAnswerDate); 386 # my @probSetKeys=&getAllProbSetKeysForSet($setNumber); 387 # my $probSetKey; 388 # my $oldAnswerDateTime; 389 # foreach $probSetKey (@probSetKeys){ 390 # &attachProbSetRecord($probSetKey); 391 # if ($updateMethod eq 'all') {&putAnswerDate($newAnswerDateTime,$probSetKey);} 392 # else { 393 # $oldAnswerDateTime = &getAnswerDate($probSetKey); 394 # &putAnswerDate($newAnswerDateTime,$probSetKey) unless ($oldAnswerDateTime > $newAnswerDateTime); 395 # } &detachProbSetRecord($probSetKey); 396 # } 397 # 398 # print "The new answer date is now set to: $newAnswerDate for all students\n"; 399 # print "except if their original answer date was later than $newAnswerDate\n" unless ($updateMethod eq 'all'); 400 # print "_"x80 . "\n"; 401 # } 402 403 404 sub findSetHeaderFileForSet { 405 my ($setNumber) = @_; 406 my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); 407 &attachProbSetRecord($probSetKeys[0]); 408 my $setHeaderFileName = &getSetHeaderFileName($probSetKeys[0]); 409 $setHeaderFileName; 410 } 411 sub findProbHeaderFileForSet { 412 my ($setNumber) = @_; 413 my (@probSetKeys)=&getAllProbSetKeysForSet($setNumber); 414 &attachProbSetRecord($probSetKeys[0]); 415 my $probHeaderFileName = &getProbHeaderFileName($probSetKeys[0]); 416 $probHeaderFileName; 417 } 418 sub printChangeSetHeaderFileForm { 419 my ( $oldSetHeaderFileName) = @_; 420 $oldSetHeaderFileName = "" unless defined($oldSetHeaderFileName); 421 print <<EOF; 422 423 <H3> Change the Paper and Screen HeaderFiles for set number $setNumber</H3> 424 The current Paper HeaderFile is $oldSetHeaderFileName 425 426 <input type="text" size=30 maxlength=50 name="setHeaderFile" 427 value="$oldSetHeaderFileName"> New SetHeaderFile<p> 428 429 EOF 430 } 431 432 sub printChangeProbHeaderFileForm { 433 my ( $oldProbHeaderFileName) = @_; 434 $oldProbHeaderFileName = "" unless defined $oldProbHeaderFileName; 435 print <<EOF; 436 437 The current Screen HeaderFile is $oldProbHeaderFileName 438 439 <input type="text" size=30 maxlength=50 name="probHeaderFile" 440 value="$oldProbHeaderFileName"> New ProbHeaderFile<p> 441 442 EOF 443 } 444 445 sub changeSetHeaderFile { 446 my ($newSetHeaderFileName,$setNumber) = @_; 447 my @probSetKeys=&getAllProbSetKeysForSet($setNumber); 448 my $probSetKey; 449 foreach $probSetKey (@probSetKeys){ 450 &attachProbSetRecord($probSetKey); 451 &deleteSetHeaderFileName($probSetKey); 452 &putSetHeaderFileName( $newSetHeaderFileName,$probSetKey); 453 &detachProbSetRecord($probSetKey); 454 } 455 &attachProbSetRecord($probSetKeys[0]); 456 $newSetHeaderFileName = &getSetHeaderFileName($probSetKeys[0]); 457 print "The new Paper HeaderFile is: $newSetHeaderFileName \n"; 458 print "_"x80 . "\n"; 459 &detachProbSetRecord($probSetKeys[0]); 460 } 461 sub changeProbHeaderFile { 462 my ($newProbHeaderFileName,$setNumber) = @_; 463 my @probSetKeys=&getAllProbSetKeysForSet($setNumber); 464 my $probSetKey; 465 foreach $probSetKey (@probSetKeys){ 466 &attachProbSetRecord($probSetKey); 467 &deleteProbHeaderFileName($probSetKey); 468 &putProbHeaderFileName( $newProbHeaderFileName,$probSetKey); 469 &detachProbSetRecord($probSetKey); 470 } 471 &attachProbSetRecord($probSetKeys[0]); 472 $newProbHeaderFileName = &getProbHeaderFileName($probSetKeys[0]); 473 print "The new Screen HeaderFile is: $newProbHeaderFileName \n"; 474 print "_"x80 . "\n"; 475 &detachProbSetRecord($probSetKeys[0]); 476 } 477 478 479 480 sub sendBack { 481 print <<EOF; 482 <p> 483 <A HREF="${cgiURL}profLogin.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> 484 <IMG SRC="$Global::upImgUrl" BORDER=1></A> 485 EOF 486 } 487 488 489 490 sub printChangeProblemFileNamesForm { 491 492 my $delete_cached_l2h_images = 0; ## if problems are deleted or reseeded, this will mess up 493 ## the chached latex2html image. We keep track of this so 494 ## we can delete them. 495 496 # Update the database if needed 497 if ( ( defined( $inputs{'FileNameEditMode'}) && $inputs{'FileNameEditMode'} eq "ReadWrite" ) 498 || 499 ( defined( $inputs{'AddNewProblem'}) && $inputs{'AddNewProblem'} eq "Add" ) ) 500 { 501 502 # get list of changed problems submitted by the form 503 my $i; 504 my @changedProblems; 505 foreach $i ( grep(/ProblemFileName/, keys %inputs) ) { 506 507 if ( $i =~ /^ProblemFileName(.+)$/ ) { 508 push(@changedProblems, $1); 509 } 510 if ($inputs{'AddNewProblem'} eq "Add" ) { 511 if ( $i =~ /^NewProblemFileName(.+)$/ ) { 512 my $label = $1; 513 # file name cannot be blank and cannot contain a question mark. 514 if ($inputs{"NewProblemFileName$label"} =~/\w+/ && not $inputs{"NewProblemFileName$label"} =~/\?/) { 515 push(@changedProblems, $label) ; 516 $inputs{"ProblemFileName$label"}=$inputs{"NewProblemFileName$label"}; 517 $inputs{"ProblemValue$label"}=$inputs{"NewProblemValue$label"}; 518 } 519 } 520 } 521 } 522 523 ############################## 524 ### Later this program assumes that the problem numbers in @changedProblems are in ascending order, 525 ### but the validity of this assumption depends on whether the hash %inputs 526 ### preserves the order of the form variables; in particular, do the keys 527 ### ProblemFileName1, ProblemFileName2, ..., ProblemFileName(N), NewProblemFileName(N+1), etc., 528 ### occur in that order in the array keys %inputs . 529 ### On harper.ucs.indiana.edu, which is a Sun running Sun OS 5.7, 530 ### the keys do not necessarily occur in increasing order of the problem number. 531 ### For short hashes, they do. But for long hashes, they usually do not, and that causes 532 ### this program to fail. So we must have the line below to insure 533 ### that @changedProblems is ordered in ascending order. 534 ############################# 535 @changedProblems = sort {$a <=> $b} @changedProblems; 536 ############################### 537 538 539 my $psvn; 540 my @psvn = &getAllProbSetKeysForSet($setNumber); 541 foreach $psvn (@psvn) { 542 &attachProbSetRecord($psvn); 543 my $num =1; 544 srand(time); 545 foreach $i (@changedProblems) { 546 547 ## chech if we should delete cached l2h images 548 if ( defined( $inputs{"problem{$i}EditMode"}) and 549 (($inputs{"problem{$i}EditMode"} eq "ReSeed") or ($inputs{"problem{$i}EditMode"} eq "Delete"))) { 550 $delete_cached_l2h_images = 1; 551 } 552 553 #ReadWrite 554 #save seed (or define it) 555 my $seed = &getProblemSeed($i,$psvn); 556 unless (defined($seed) ){ 557 print STDERR "profChangeDates.pl: Seed for problem $i is not defined<BR>"; 558 $seed = int( rand(5000) ); 559 } 560 561 #save 562 my ($filename, $status, $attempted, $pvalue, $maxNumOfIncorrectAttempts); 563 $filename = &getProblemFileName( $i,$psvn); 564 $attempted = &getProblemAttempted( $i,$psvn); 565 $status = &getProblemStatus( $i,$psvn); 566 $pvalue = &getProblemValue( $i,$psvn); 567 $maxNumOfIncorrectAttempts = &getProblemMaxNumOfIncorrectAttemps( $i,$psvn); 568 569 # delete problem names and values 570 &deleteProblemFileName( $i,$psvn); 571 &deleteProblemAttempted( $i,$psvn); 572 &deleteProblemStatus( $i,$psvn); 573 &deleteProblemValue( $i,$psvn); 574 &deleteProblemMaxNumOfIncorrectAttemps( $i,$psvn); 575 &deleteProblemSeed( $i,$psvn); 576 # recreate problem using saved seed 577 unless (defined( $inputs{"problem{$i}EditMode"}) && $inputs{"problem{$i}EditMode"} eq "Delete" ) { 578 579 if ($inputs{"ProblemFileName$i"} =~ /\w+/) {$filename = stripWhiteSpace($inputs{"ProblemFileName$i"});} 580 &putProblemFileName($filename , $num,$psvn); 581 582 if ($inputs{"ProblemAttempted$i"} =~ /\w+/) {$attempted = stripWhiteSpace($inputs{"ProblemAttempted$i"});} 583 &putProblemAttempted($attempted, $num,$psvn); 584 585 if ($inputs{"ProblemStatus$i"} =~ /\w+/) {$status = stripWhiteSpace($inputs{"ProblemStatus$i"});} 586 &putProblemStatus($status, $num,$psvn); 587 588 if ($inputs{"ProblemValue$i"} =~ /\w+/) {$pvalue = stripWhiteSpace($inputs{"ProblemValue$i"});} 589 &putProblemValue($pvalue, $num,$psvn); 590 591 if ($inputs{"ProblemMaxNumOfIncorrectAttemps$i"} =~ /\w+/) {$maxNumOfIncorrectAttempts = stripWhiteSpace($inputs{"ProblemMaxNumOfIncorrectAttemps$i"});} 592 &putProblemMaxNumOfIncorrectAttemps($maxNumOfIncorrectAttempts, $num,$psvn); 593 594 &putProblemSeed( $seed,$num,$psvn); 595 596 # Reseed if requested 597 if ( defined( $inputs{"problem{$i}EditMode"}) && $inputs{"problem{$i}EditMode"} eq "ReSeed" ) { 598 $seed = int( rand(5000) ); 599 &putProblemSeed( $seed , $num,$psvn); 600 print "Seed changed for problem number $num, psvn $psvn<BR>\n"; 601 } 602 $num++; 603 } 604 605 606 } 607 &detachProbSetRecord($psvn); 608 } 609 } # end of updating database 610 611 ## remobe l2h images if necessary 612 613 if ($delete_cached_l2h_images) { 614 my $l2hDir = getCoursel2hDirectory(); 615 system ("rm -rf ${l2hDir}set$setNumber"); 616 print "\n<BR>deleting Latex2html tmp files and the directory:<BR>\n"; 617 print " ${l2hDir}set$setNumber<BR>"; 618 } 619 620 621 # print a new form 622 print qq!<HR NOSHADE>\n 623 <FORM method="post" action="profChangeDates.pl"> 624 !; 625 print &sessionKeyInputs(\%inputs); 626 if (defined( $inputs{"FileNameEditMode"}) && $inputs{"FileNameEditMode"} eq "ReadWrite") { 627 print "CHANGES SAVED FOR SET $setNumber<BR>"; 628 } elsif ( defined( $inputs{'AddNewProblem'}) && $inputs{'AddNewProblem'} eq "Add" ) { 629 print "Problems added to SET $setNumber<BR>"; 630 } elsif ( defined( $inputs{"FileNameEditMode"}) && $inputs{"FileNameEditMode"} eq "ReadOnly") { 631 print "ReadOnly mode -- <B>NO</B> CHANGES SAVED FOR SET $setNumber<BR>"; 632 } 633 my @psvn = &getAllProbSetKeysForSet($setNumber); 634 635 print qq! 636 <INPUT TYPE="HIDDEN" NAME="pCD" VALUE="1">\n 637 <INPUT TYPE="HIDDEN" NAME="setNo" VALUE="$setNumber">\n 638 639 <H3>Change problem file names, status, etc. for set $setNumber:</H3>\n 640 641 <H4>If a Filename, "Attempted", "Status", "Value", or "MaxAttmp" cell is left blank, the corresponding 642 individualized current values in the database will be maintained. If a value is 643 entered, that value will be used for every student's problem. Valid values for "Attempted" 644 are: 0 (not attempted) or 1. Valid values for "Status" are numbers in the range [0,1] where 0 represents 645 no credit and 1 full crefit. Valid values for "Value" are 646 non-negative integers with 1 (1 point) being the most common. Valid values for "MaxAttmp" 647 are -1 and non-negative integers where -1 means allow unlimited attempts. The Filename 648 for a random student is listed. To see the actual data for any student, go back and use 649 "Examine or change individual problem set for:" 650 </H4>\n 651 652 <TABLE><TR><TD>\n 653 ReadOnly<INPUT TYPE=RADIO NAME="FileNameEditMode" VALUE="ReadOnly" CHECKED>\n 654 </TD><TD>\n 655 Read/Write<INPUT TYPE=RADIO NAME="FileNameEditMode" VALUE="ReadWrite" >\n 656 </TD><TD>\n 657 <INPUT TYPE=SUBMIT VALUE="Save Problem Changes"><p>\n 658 </TD></TR></TABLE> 659 <TABLE BORDER="1" CELLPADDING="1" CELLSPACING="2" >\n 660 !; 661 #Re-establish the order of problems from database -- they may have changed. 662 my $psvn = $psvn[0]; 663 my $Mode = defined($inputs{'mode'}) ? $inputs{'mode'} : "HTML"; 664 my $User = $inputs{'user'}; 665 my $Key = $inputs{'key'}; 666 &attachProbSetRecord($psvn); 667 my @problems = sort {$a <=> $b} &getAllProblemsForProbSetRecord($psvn); 668 669 670 # print table listing problems 671 my $i; 672 foreach $i (@problems) { 673 print "<TR>"; 674 print &formatHeaderCell( qq! 675 <A HREF="${Global::processProblem_CGI}?probSetKey=$psvn&probNum=$i&Mode=$Mode&course=$Course&user=$User&key=$Key" TARGET="VIEW_PROBLEM"> 676 Problem $i</A> 677 ! 678 ); 679 print &formatHeaderCell( "Attempted"); 680 print &formatHeaderCell( "Status"); 681 print &formatHeaderCell( "Value"); 682 print &formatHeaderCell( "MaxAttmp"); 683 print &formatHeaderCell( "Delete" ); 684 print &formatHeaderCell( "ReSeed" ); 685 print "</TR>"; 686 687 688 print "<TR>"; 689 690 print &formatDataCell( "ProblemFileName$i" , &getProblemFileName($i,$psvn),"50" ); 691 print &formatDataCell( "ProblemAttempted$i" , '' ,"1"); 692 print &formatDataCell( "ProblemStatus$i" ,'' ,"5"); 693 print &formatDataCell( "ProblemValue$i" ,'' ,"5"); 694 print &formatDataCell( "ProblemMaxNumOfIncorrectAttemps$i" , '' ,"4"); 695 print & formatRadioButtonCell( "problem{$i}EditMode", "Delete" ,"5", ""); 696 print & formatRadioButtonCell( "problem{$i}EditMode", "ReSeed" ,"5", ""); 697 698 print "</TR>"; 699 700 } 701 702 print qq! 703 </TABLE>\n 704 <HR NOSHADE> 705 <H3>Add problem file names for set $setNumber</H3>\n 706 Off <INPUT TYPE="RADIO" NAME="AddNewProblem" VALUE="Off" CHECKED> \n 707 Add <INPUT TYPE="RADIO" NAME="AddNewProblem" VALUE="Add"> \n 708 <INPUT TYPE=SUBMIT VALUE="Add File Names to Set"><p>\n 709 <TABLE BORDER="1" CELLPADDING="1" CELLSPACING="2" >\n 710 !; 711 # print table new listing problems 712 foreach $i (101,102) { 713 print "<TR>"; 714 print &formatHeaderCell( "New File $i"); 715 print &formatHeaderCell( "Attempted"); 716 print &formatHeaderCell( "Status"); 717 print &formatHeaderCell( "Value"); 718 print &formatHeaderCell( "MaxAttmp"); 719 print "</TR>\n"; 720 721 722 print "<TR>"; 723 724 print &formatDataCell( "NewProblemFileName$i" , " " ,"30" ); 725 print &formatDataCell( "NewProblemAttempted$i" , "0" ,"1"); 726 print &formatDataCell( "NewProblemStatus$i" , "0" ,"5"); 727 print &formatDataCell( "NewProblemValue$i" , "1" ,"5"); 728 print &formatDataCell( "ProblemMaxNumOfIncorrectAttemps$i" , "-1" ,"4"); 729 730 print "</TR>\n"; 731 } 732 print qq! 733 </TABLE>\n 734 735 </FORM>\n 736 !; 737 ############################################# 738 # build a problem set 739 ############################################# 740 741 print <<EOF; 742 <P> 743 <HR NOSHADE> 744 <H4 ALIGN=LEFT> 745 <img src="$Global::bluesquareImgUrl" border=1 alt=""> 746 Build a problem set for $Course: 747 </H4> 748 EOF 749 750 print "<TD>", 751 start_form('POST', "${Global::cgiWebworkURL}profBuildProblemSetPage.pl"), 752 p,"\n", 753 hidden('course'), "\n", 754 hidden('user'), "\n", 755 hidden('key'), "\n", 756 submit("Enter Build Problem Set Page"), 757 end_form, 758 "</TD>", 759 "You can build a problem set, edit a set definition file, etc."; 760 761 # delete an entire problem set 762 print <<EOF; 763 <P> 764 <HR NOSHADE> 765 <H4 ALIGN=LEFT><A HREF="${cgiURL}profDeleteProbSet.pl?user=$inputs{'user'}&key=$inputs{'key'}&course=$inputs{'course'}"> 766 <IMG SRC="$Global::bluesquareImgUrl" 767 BORDER=1 768 ALT=""> Delete a problem set in $Course</A> 769 </H4> 770 Remove an entire problem set from the database. 771 Individual problems can be deleted from the set using the method 2. above. 772 773 EOF 774 775 } #DONE printChangeProblemFileNamesForm() 776 777 #sub printAddProblemFileNameForm { 778 # 779 # my @problems = ("new1","new2"); 780 # 781 ## updating will be done in printChangeProblemFileNamesForm() 782 # 783 ## print a new form 784 # print qq!<HR NOSHADE>\n 785 # <FORM method="post" action="profChangeDates.pl"> 786 # !; 787 # print &sessionKeyInputs(\%inputs); 788 # print qq! 789 # <INPUT TYPE="HIDDEN" NAME="pCD" VALUE="1">\n 790 # <INPUT TYPE="HIDDEN" NAME="setNumber" VALUE="$setNumber">\n 791 # <HR NOSHADE> 792 # <H3>Add problem file names for set $setNumber</H3>\n 793 # Off <INPUT TYPE="RADIO" NAME="AddNewProblem" VALUE="Off"><BR>\n 794 # Add <INPUT TYPE="RADIO" NAME="AddNewProblem" VALUE="Add"><BR>\n 795 # <INPUT TYPE=SUBMIT VALUE="Add New Problem"><p>\n 796 # <TABLE BORDER="1" CELLPADDING="1" CELLSPACING="2" >\n 797 # !; 798 ## print table new listing problems 799 # foreach $i ("9998") { 800 # print "<TR>"; 801 # print &formatHeaderCell( $i); 802 # print &formatHeaderCell( "Value" ); 803 # print "</TR>\n"; 804 # 805 # 806 # print "<TR>"; 807 # 808 # print &formatDataCell( "NewProblemFileName$i" , "???" ,"30" ); 809 # print &formatDataCell( "NewProblemValue$i" , "???" ,"5"); 810 # 811 # print "</TR>\n"; 812 # } 813 #print qq! 814 # </TABLE>\n 815 # 816 # </FORM>\n 817 # !; 818 # } 819 820 sub formatDataRow { 821 my ($pAitems,$size) =@_; 822 my $out = "<TR>\n"; 823 my $value; 824 my $i; 825 foreach $i (@$pAitems) { 826 $value = eval "\$$i=&get$i($inputs{'psvn'})"; 827 $out .= &formatDataCell($i,$value,$size); 828 } 829 $out .= "</TR>\n"; 830 } 831 sub formatHeaderRow { 832 my ( $pAitems,$options) =@_; 833 my $out = "<TR>\n"; 834 my $i; 835 foreach $i ( @$pAitems) { 836 $out .= &formatHeaderCell($i,$options); 837 } 838 $out .= "</TR>\n"; 839 } 840 sub formatDataCell { 841 my ($name,$value,$size) = @_; 842 $value = "" unless defined($value); # this value is optional 843 $size = "" unless defined($size); # this value is optional 844 my $out = qq! 845 <TD ALIGN=CENTER VALIGN=MIDDLE > 846 <INPUT TYPE="TEXT" NAME="$name" VALUE="$value", SIZE=$size> 847 </TD> 848 !; 849 $out; 850 } 851 sub formatRadioButtonCell { 852 my ($name,$value,$size, $options) = @_; 853 $options = "" unless defined($options); 854 my $out = qq! 855 <TD ALIGN=CENTER VALIGN=MIDDLE > 856 <INPUT TYPE="RADIO" NAME="$name" VALUE="$value" SIZE="$size" $options> 857 </TD> 858 !; 859 $out; 860 } 861 sub formatHeaderCell { 862 my ($item,$options) = @_; 863 $options = "" unless defined($options); 864 my $out = qq! 865 <TH ALIGN=CENTER VALIGN=MIDDLE $options> 866 $item 867 </TH> 868 !; 869 870 }
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |