[system] / trunk / webwork / system / scripts / precreate.pl Repository:
ViewVC logotype

View of /trunk/webwork/system/scripts/precreate.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 567 - (download) (as text) (annotate)
Mon Oct 7 14:33:24 2002 UTC (10 years, 7 months ago) by apizer
File size: 9965 byte(s)
rewriten allowing png mode and error checking

    1 #!/usr/local/bin/webwork-perl
    2 
    3 use strict;
    4 ## $Id$
    5 
    6 
    7 ################################################################
    8 #  Copyright @1995-2002 by Michael E. Gage, Arnold K. Pizer and
    9 #  WeBWorK at the University of Rochester. All rights reserved.
   10 ################################################################
   11 
   12 ## precreate.pl
   13 ##
   14 ## pre-creates latex2html or dvipng output for each student for a problem set
   15 ## so that WeBWorK doesn't have to run latex2html or dvipng in processProblems
   16 
   17 ## NOTE: problem set has to be built before precreating...
   18 
   19 use CGI;
   20 use Global;
   21 use TimeLocal;
   22 use PGtranslator;
   23 use ImageGenerator;
   24 
   25 sub precreate {
   26 
   27   my $type = shift;
   28   my ($mode, $courseID,$fileName, $probNumber, $lowerLimit, $upperLimit);
   29 
   30   if ($type eq 'set') {
   31     ($mode, $courseID, $fileName, $lowerLimit, $upperLimit) = @_;
   32   }
   33   elsif ($type eq 'prob') {
   34     ($mode, $courseID,$fileName, $probNumber, $lowerLimit, $upperLimit) = @_;
   35   }
   36   else {
   37     die "Unknown parameter $type passed to subroutine precreate, stopped";
   38   }
   39 
   40   &Global::getCourseEnvironment($courseID);
   41 
   42   my $databaseDirectory       = getCourseDatabaseDirectory();
   43   my $htmlDirectory           = getCourseHtmlDirectory();
   44   my $htmlURL                 = getCourseHtmlURL();
   45   my $scriptDirectory         = getWebworkScriptDirectory();
   46   my $templateDirectory       = getCourseTemplateDirectory();
   47   my $courseScriptsDirectory  = getCourseScriptsDirectory();
   48   my $tempDirectory           = getCourseTempDirectory();
   49 
   50   require "${courseScriptsDirectory}$Global::displayMacros_pl";
   51   require "${scriptDirectory}$Global::DBglue_pl";
   52   require "${scriptDirectory}$Global::classlist_DBglue_pl";
   53   require "${scriptDirectory}$Global::FILE_pl";
   54   require "${scriptDirectory}$Global::HTMLglue_pl";
   55 
   56   ####################################################################
   57   # load the modules to be used in PGtranslator
   58     require "${courseScriptsDirectory}PG_module_list.pl";
   59   ####################################################################
   60 
   61   $fileName = ${templateDirectory} . $fileName;
   62 
   63   my  $starttime = time;
   64   my  ($name);
   65   my  ($setNumber,$setHeaderFileName,$probHeaderFileName,$dueDate,$openDate,$answerDate,$problemListref,$problemValueListref,$problemAttemptLimitListref,$problemContinuationFlagListRef)
   66           = &readSetDef($fileName);
   67   my  @problemList = @$problemListref;
   68   # my  @problemValueList = @$problemValueListref;
   69   # my  @problemAttemptLimitList = @$problemAttemptLimitListref;
   70 
   71 
   72   my $numProbs=0;
   73   foreach $name (@problemList)
   74       {$numProbs++;}
   75 
   76   my @setProbSetKeys = &getAllProbSetKeysForSet($setNumber);
   77   #sort the ProbSetKeys to make it easier to keep track of what's happening
   78   @setProbSetKeys = sort {$a <=> $b} @setProbSetKeys;
   79 
   80 # my $mode = 'HTML_dpng';
   81   my ($ii,$psvn);
   82   my @saveSubmittedAnswerList = ();
   83   my ($login_name_for_psvn);
   84 
   85   foreach $psvn (@setProbSetKeys) {
   86     next if ((defined $lowerLimit) and ($psvn < $lowerLimit));
   87     next if ((defined $upperLimit) and ($psvn > $upperLimit));
   88 
   89     &attachProbSetRecord($psvn);
   90     $login_name_for_psvn = &getStudentLogin($psvn);
   91     attachCLRecord($login_name_for_psvn);
   92 
   93       print "In foreach: key = $psvn\n";
   94       for($ii=1; $ii<=$numProbs; $ii++) {
   95         next if (($type eq 'prob') and ($ii != $probNumber));
   96         print "In for key = $psvn .... i = $ii\n";
   97 
   98         my $source;
   99           my $probFileName    =   &getProblemFileName($ii,$psvn);;
  100       if (-e "${templateDirectory}$probFileName" ) {
  101         unless (-r "${templateDirectory}$probFileName") {
  102           wwerror($0, "Can't read ${templateDirectory}$probFileName");
  103           }
  104           open(PROB,"<${templateDirectory}$probFileName");
  105           $source = join("",<PROB>);
  106           close(PROB);
  107         }
  108         ###############################################
  109         # Create problem text
  110         ###############################################
  111         my %envir=defineProblemEnvir($mode,$ii,$psvn,$courseID,\@saveSubmittedAnswerList);
  112 
  113       ###### New Code contributed by Bill Wheeler ############
  114       ####### to fix memory leak
  115       my $pid=fork();
  116       if ($pid) {
  117         waitpid($pid,0);
  118         exit 1 if $?; ## exit main program if there was an error in the child process
  119       }
  120           else {
  121 
  122         my $pt = new PGtranslator;  #pt stands for problem translator;
  123         $pt -> evaluate_modules( @{main::modules_to_evaluate});
  124         $pt -> load_extra_packages(@{main::extra_packages_to_be_loaded});
  125         # The variables in the two preceding lines are  defined in PG_module_list.pl at Indiana.
  126 
  127         my $imgen="";
  128         if($mode eq 'HTML_dpng') {
  129             $imgen = new ImageGenerator;
  130             $imgen->initialize(\%envir);
  131         }
  132           $envir{imagegen} = $imgen;
  133 
  134         $pt->environment(\%envir);
  135         $pt->initialize();
  136         $pt-> set_mask();
  137         $pt->source_string($source);
  138           $pt -> unrestricted_load("${courseScriptsDirectory}PG.pl");
  139           $pt -> unrestricted_load("${courseScriptsDirectory}dangerousMacros.pl");
  140           $pt ->  rf_safety_filter( \&safetyFilter);   # install blank safety filter
  141           $pt ->translate();
  142 
  143         if ($mode eq 'Latex2HTML') {
  144           &createDisplayedProblem($setNumber,$ii,$psvn,$pt->ra_text(), $pt->rh_flags());
  145         }
  146         if($mode eq 'HTML_dpng') {
  147           my $forceRefresh=0;
  148           $imgen->render('refresh'=>$forceRefresh); # Can force new images
  149         }
  150       if  ($pt ->rh_flags->{'error_flag'}) { # print out error and exit
  151         print "\n\nProblem $ii in $setNumber for PSVN $psvn has the following error:\n\n";
  152         print @{ $pt->ra_text() };
  153         exit(1);
  154       }
  155           undef($pt);
  156       ## remove any links to gifs. These are not needed and when created by a script run from
  157       ## the command line, they are invalid if the webserver is in a chroot enviroment
  158       unlink(<$tempDirectory/gif/*${psvn}-set${setNumber}*prob${ii}*>);
  159       unlink(<$tempDirectory/eps/*${psvn}-set${setNumber}*prob${ii}*>);
  160         ############## New Code ########################
  161           exit(0);
  162       }
  163     }
  164   }
  165 
  166 
  167 
  168 
  169   my $endtime = time;
  170   my $totaltime = ($endtime - $starttime)/60;
  171 
  172   print "\n\nThis took $totaltime minutes to precreate $fileName \n\n";
  173 }
  174 
  175 
  176 sub defineProblemEnvir {
  177     my ($mode,$probNum,$psvn,$courseName,$refSubmittedAnswers)      =   @_;
  178     my %envir=();
  179     my $loginName = &getStudentLogin($psvn);
  180     ##how to put an array submittedAnswers in a hash??
  181     $envir{'refSubmittedAnswers'}   =   $refSubmittedAnswers if defined($refSubmittedAnswers);
  182     $envir{'psvnNumber'}        =   $psvn;
  183     $envir{'psvn'}            =   $psvn;
  184     $envir{'studentName'}       =   &CL_getStudentName($loginName);
  185   $envir{'studentID'}         = &CL_getStudentID($loginName);
  186   $envir{'studentLogin'}        = $loginName;
  187   $envir{'sectionName'}       = &CL_getClassSection($loginName);
  188   $envir{'sectionNumber'}       = &CL_getClassSection($loginName);
  189   $envir{'recitationName'}      = &CL_getClassRecitation($loginName);
  190   $envir{'recitationNumber'}      = &CL_getClassRecitation($loginName);
  191   $envir{'setNumber'}         = &getSetNumber($psvn);
  192   $envir{'questionNumber'}        = $probNum;
  193   $envir{'probNum'}           = $probNum;
  194   $envir{'openDate'}          = &getOpenDate($psvn);
  195   $envir{'formattedOpenDate'}     = &formatDateAndTime(&getOpenDate($psvn));
  196   $envir{'dueDate'}           = &getDueDate($psvn);
  197   $envir{'formattedDueDate'}      = &formatDateAndTime(&getDueDate($psvn));
  198   $envir{'answerDate'}        = &getAnswerDate($psvn);
  199   $envir{'formattedAnswerDate'}   = &formatDateAndTime(&getAnswerDate($psvn));
  200   $envir{'problemValue'}        = &getProblemValue($probNum,$psvn);
  201   $envir{'fileName'}          = &getProblemFileName($probNum,$psvn);
  202   $envir{'probFileName'}        = &getProblemFileName($probNum,$psvn );
  203   $envir{'displayMode'}       = $mode;
  204   $envir{'languageMode'}        = $mode;
  205   $envir{'outputMode'}        = $mode;
  206   $envir{'courseName'}        = $courseName;
  207   $envir{'sessionKey'}        = ( defined($main::in{'key'}) ) ?$main::in{'key'} : " ";
  208 
  209 
  210   # initialize constants for PGanswermacros.pl
  211   $envir{'numRelPercentTolDefault'}   =     getNumRelPercentTolDefault();
  212   $envir{'numZeroLevelDefault'}   =     getNumZeroLevelDefault();
  213   $envir{'numZeroLevelTolDefault'}  =     getNumZeroLevelTolDefault();
  214   $envir{'numAbsTolDefault'}      =     getNumAbsTolDefault();
  215   $envir{'numFormatDefault'}      =     getNumFormatDefault();
  216   $envir{'functRelPercentTolDefault'} =     getFunctRelPercentTolDefault();
  217   $envir{'functZeroLevelDefault'}   =     getFunctZeroLevelDefault();
  218   $envir{'functZeroLevelTolDefault'}  =     getFunctZeroLevelTolDefault();
  219   $envir{'functAbsTolDefault'}    =     getFunctAbsTolDefault();
  220   $envir{'functNumOfPoints'}      =     getFunctNumOfPoints();
  221   $envir{'functVarDefault'}       =     getFunctVarDefault();
  222   $envir{'functLLimitDefault'}    =     getFunctLLimitDefault();
  223   $envir{'functULimitDefault'}    =     getFunctULimitDefault();
  224   $envir{'functMaxConstantOfIntegration'} = getFunctMaxConstantOfIntegration();
  225   $envir{'numOfAttempts'}             =     undef;
  226 
  227   # defining directorys and URLs
  228   $envir{'templateDirectory'}       = &getCourseTemplateDirectory();
  229   $envir{'classDirectory'}        = $Global::classDirectory;
  230   $envir{'cgiDirectory'}        = $Global::cgiDirectory;
  231   $envir{'cgiURL'}                    =   getWebworkCgiURL();
  232   $envir{'macroDirectory'}        = getCourseMacroDirectory();
  233   $envir{'courseScriptsDirectory'}    = getCourseScriptsDirectory();
  234   $envir{'htmlDirectory'}             =   getCourseHtmlDirectory();
  235   $envir{'htmlURL'}           = getCourseHtmlURL();
  236   $envir{'tempDirectory'}             =   getCourseTempDirectory();
  237   $envir{'tempURL'}                   =   getCourseTempURL();
  238   $envir{'scriptDirectory'}       = $Global::scriptDirectory;
  239   $envir{'webworkDocsURL'}        = $Global::webworkDocsURL;
  240   $envir{'externalTTHPath'}       = $Global::externalTTHPath;
  241 
  242   $envir{'inputs_ref'}        = {user => 'practice1',course => 'demoCourse', key => ' '};
  243     # no inputs when in this mode
  244   my $seed  = &getProblemSeed($probNum, $psvn);
  245   $seed = 0 unless defined($seed);
  246 
  247   $envir{'problemSeed'}     =   $seed if defined($seed);
  248 
  249   my $k;
  250   foreach $k (keys %Global::PG_environment ) {
  251     $envir{$k} = $Global::PG_environment{$k};
  252   }
  253   %envir;
  254 }
  255 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9