[system] / trunk / webwork / system / cgi / cgi-scripts / profChangeDates.pl Repository:
ViewVC logotype

View of /trunk/webwork/system/cgi/cgi-scripts/profChangeDates.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10 - (download) (as text) (annotate)
Fri Jun 15 21:06:18 2001 UTC (11 years, 11 months ago) by sam
File size: 29875 byte(s)
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