[system] / trunk / webwork2 / lib / WeBWorK / PG.pm Repository:
ViewVC logotype

Diff of /trunk/webwork2/lib/WeBWorK/PG.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 620 Revision 927
13 13
14use strict; 14use strict;
15use warnings; 15use warnings;
16use File::Path qw(rmtree); 16use File::Path qw(rmtree);
17use File::Temp qw(tempdir); 17use File::Temp qw(tempdir);
18use WeBWorK::DB::Classlist;
19use WeBWorK::DB::WW;
20use WeBWorK::PG::Translator; 18use WeBWorK::PG::Translator;
21use WeBWorK::Problem;
22use WeBWorK::Utils qw(readFile formatDateTime writeTimingLogEntry); 19use WeBWorK::Utils qw(readFile formatDateTime writeTimingLogEntry);
23 20
24sub new($$$$$$$$) { 21sub new($$$$$$$$) {
25 my $invocant = shift; 22 my $invocant = shift;
26 my $class = ref($invocant) || $invocant; 23 my $class = ref($invocant) || $invocant;
37 # hints and the display mode to use 34 # hints and the display mode to use
38 ) = @_; 35 ) = @_;
39 36
40 # write timing log entry 37 # write timing log entry
41 writeTimingLogEntry($courseEnv, "WeBWorK::PG::new", 38 writeTimingLogEntry($courseEnv, "WeBWorK::PG::new",
42 "user=".$user->id.",problem=".$courseEnv->{courseName}."/".$set->id."/".$problem->id.",mode=".$translationOptions->{displayMode}, 39 "user=".$user->user_id.",problem=".$courseEnv->{courseName}."/".$set->set_id."/".$problem->problem_id.",mode=".$translationOptions->{displayMode},
43 "begin"); 40 "begin");
44 41
45 # install a local warn handler to collect warnings 42 # install a local warn handler to collect warnings
46 my $warnings = ""; 43 my $warnings = "";
47 if ($courseEnv->{pg}->{options}->{catchWarnings}) {
48 local $SIG{__WARN__} = sub { $warnings .= shift }; 44 local $SIG{__WARN__} = sub { $warnings .= shift }
49 } 45 if $courseEnv->{pg}->{options}->{catchWarnings};
50 46
51 # create a Translator 47 # create a Translator
52 #warn "PG: creating a Translator\n"; 48 #warn "PG: creating a Translator\n";
53 my $translator = WeBWorK::PG::Translator->new; 49 my $translator = WeBWorK::PG::Translator->new;
54 50
97 foreach (qw(IO.pl PG.pl dangerousMacros.pl)) { 93 foreach (qw(IO.pl PG.pl dangerousMacros.pl)) {
98 my $macroPath = $courseEnv->{webworkDirs}->{macros} . "/$_"; 94 my $macroPath = $courseEnv->{webworkDirs}->{macros} . "/$_";
99 my $err = $translator->unrestricted_load($macroPath); 95 my $err = $translator->unrestricted_load($macroPath);
100 warn "Error while loading $macroPath: $err" if $err; 96 warn "Error while loading $macroPath: $err" if $err;
101 } 97 }
102 #my $pg_pl = $courseEnv->{webworkDirs}->{macros} . "/PG.pl";
103 #my $dangerousMacros_pl = $courseEnv->{webworkDirs}->{macros} . "/dangerousMacros.pl";
104 #my $io_pl = $courseEnv->{webworkDirs}->{macros} . "/IO.pl";
105 #my $err = $translator->unrestricted_load($pg_pl);
106 #warn "Error while loading $pg_pl: $err" if $err;
107 #$err = $translator->unrestricted_load($dangerousMacros_pl);
108 #warn "Error while loading $dangerousMacros_pl: $err" if $err;
109 #$err = $translator->unrestricted_load($io_pl);
110 #warn "Error while loading $io_pl: $err" if $err;
111 98
112 # set the opcode mask (using default values) 99 # set the opcode mask (using default values)
113 #warn "PG: setting the opcode mask (using default values)\n"; 100 #warn "PG: setting the opcode mask (using default values)\n";
114 $translator->set_mask(); 101 $translator->set_mask();
115 102
116 # store the problem source 103 # store the problem source
117 #warn "PG: storing the problem source\n"; 104 #warn "PG: storing the problem source\n";
118 my $sourceFile = $problem->source_file; 105 my $sourceFile = ( defined($translationOptions->{override_problem_source}) ) ?
106 $translationOptions->{override_problem_source} :
107 $problem->source_file;
119 $sourceFile = $courseEnv->{courseDirs}->{templates}."/".$sourceFile 108 $sourceFile = $courseEnv->{courseDirs}->{templates}."/".$sourceFile
120 unless ($sourceFile =~ /^\//); 109 unless ($sourceFile =~ /^\//);
121 eval { $translator->source_string(readFile($sourceFile)) }; 110 eval { $translator->source_string(readFile($sourceFile)) };
122 if ($@) { 111 if ($@) {
123 # well, we couldn't get the problem source, for some reason. 112 # well, we couldn't get the problem source, for some reason.
139 128
140 # install a safety filter (&safetyFilter) 129 # install a safety filter (&safetyFilter)
141 #warn "PG: installing a safety filter\n"; 130 #warn "PG: installing a safety filter\n";
142 $translator->rf_safety_filter(\&safetyFilter); 131 $translator->rf_safety_filter(\&safetyFilter);
143 132
133 # write timing log entry -- the translator is now all set up
134 writeTimingLogEntry($courseEnv, "WeBWorK::PG::new",
135 "initialized",
136 "intermediate");
137
144 # translate the PG source into text 138 # translate the PG source into text
145 #warn "PG: translating the PG source into text\n"; 139 #warn "PG: translating the PG source into text\n";
146 $translator->translate(); 140 $translator->translate();
147 141
148 # after we're done translating, we may have to clean up after the translator. 142 # after we're done translating, we may have to clean up after the translator.
242 # ADDED: displayHintsQ, displaySolutionsQ, refreshMath2img, 236 # ADDED: displayHintsQ, displaySolutionsQ, refreshMath2img,
243 # texDisposition 237 # texDisposition
244 238
245 $envir{psvn} = $psvn; 239 $envir{psvn} = $psvn;
246 $envir{psvnNumber} = $envir{psvn}; 240 $envir{psvnNumber} = $envir{psvn};
247 $envir{probNum} = $problem->id; 241 $envir{probNum} = $problem->problem_id;
248 $envir{questionNumber} = $envir{probNum}; 242 $envir{questionNumber} = $envir{probNum};
249 $envir{fileName} = $problem->source_file; 243 $envir{fileName} = $problem->source_file;
250 $envir{probFileName} = $envir{fileName}; 244 $envir{probFileName} = $envir{fileName};
251 $envir{problemSeed} = $problem->problem_seed; 245 $envir{problemSeed} = (defined($options->{override_seed}) ) ? $options->{override_seed} :$problem->problem_seed;
252 $envir{displayMode} = translateDisplayModeNames($options->{displayMode}); 246 $envir{displayMode} = translateDisplayModeNames($options->{displayMode});
253 $envir{languageMode} = $envir{displayMode}; 247 $envir{languageMode} = $envir{displayMode};
254 $envir{outputMode} = $envir{displayMode}; 248 $envir{outputMode} = $envir{displayMode};
255 $envir{displayHintsQ} = $options->{hints}; 249 $envir{displayHintsQ} = $options->{showHints};
256 $envir{displaySolutionsQ} = $options->{solutions}; 250 $envir{displaySolutionsQ} = $options->{showSolutions};
257 $envir{refreshMath2img} = $options->{refreshMath2img}; 251 $envir{refreshMath2img} = $options->{refreshMath2img};
258 $envir{texDisposition} = "pdf"; # in webwork-modperl, we use pdflatex 252 $envir{texDisposition} = "pdf"; # in webwork-modperl, we use pdflatex
259 253
260 # Problem Information 254 # Problem Information
261 # ADDED: courseName 255 # ADDED: courseName, formatedDueDate
262 256
263 $envir{openDate} = $set->open_date; 257 $envir{openDate} = $set->open_date;
264 $envir{formattedOpenDate} = formatDateTime($envir{openDate}); 258 $envir{formattedOpenDate} = formatDateTime($envir{openDate});
265 $envir{dueDate} = $set->due_date; 259 $envir{dueDate} = $set->due_date;
266 $envir{formattedDueDate} = formatDateTime($envir{dueDate}); 260 $envir{formattedDueDate} = formatDateTime($envir{dueDate});
261 $envir{formatedDueDate} = $envir{formattedDueDate}; # typo in many header files
267 $envir{answerDate} = $set->answer_date; 262 $envir{answerDate} = $set->answer_date;
268 $envir{formattedAnswerDate} = formatDateTime($envir{answerDate}); 263 $envir{formattedAnswerDate} = formatDateTime($envir{answerDate});
269 $envir{numOfAttempts} = ($problem->num_correct || 0) + ($problem->num_incorrect || 0); 264 $envir{numOfAttempts} = ($problem->num_correct || 0) + ($problem->num_incorrect || 0);
270 $envir{problemValue} = $problem->value; 265 $envir{problemValue} = $problem->value;
271 $envir{sessionKey} = $key; 266 $envir{sessionKey} = $key;
276 271
277 $envir{sectionName} = $user->section; 272 $envir{sectionName} = $user->section;
278 $envir{sectionNumber} = $envir{sectionName}; 273 $envir{sectionNumber} = $envir{sectionName};
279 $envir{recitationName} = $user->recitation; 274 $envir{recitationName} = $user->recitation;
280 $envir{recitationNumber} = $envir{recitationName}; 275 $envir{recitationNumber} = $envir{recitationName};
281 $envir{setNumber} = $set->id; 276 $envir{setNumber} = $set->set_id;
282 $envir{studentLogin} = $user->id; 277 $envir{studentLogin} = $user->user_id;
283 $envir{studentName} = $user->first_name . " " . $user->last_name; 278 $envir{studentName} = $user->first_name . " " . $user->last_name;
284 $envir{studentID} = $user->student_id; 279 $envir{studentID} = $user->student_id;
285 280
286 # Answer Information 281 # Answer Information
287 # REMOVED: refSubmittedAnswers 282 # REMOVED: refSubmittedAnswers
317 $envir{webworkDocsURL} = $courseEnv->{webworkURLs}->{docs}."/"; 312 $envir{webworkDocsURL} = $courseEnv->{webworkURLs}->{docs}."/";
318 $envir{dvipngTempDir} = $options->{displayMode} eq 'images' 313 $envir{dvipngTempDir} = $options->{displayMode} eq 'images'
319 ? tempdir("webwork-dvipng-XXXXXXXX", DIR => $envir{tempDirectory}) 314 ? tempdir("webwork-dvipng-XXXXXXXX", DIR => $envir{tempDirectory})
320 : undef; 315 : undef;
321 316
317 # Information for sending mail
318
319 $envir{mailSmtpServer} = $courseEnv->{mail}->{smtpServer};
320 $envir{mailSmtpSender} = $courseEnv->{mail}->{smtpSender};
321 $envir{ALLOW_MAIL_TO} = $courseEnv->{mail}->{allowedRecipients};
322
322 # Default values for evaluating answers 323 # Default values for evaluating answers
323 324
324 my $ansEvalDefaults = $courseEnv->{pg}->{ansEvalDefaults}; 325 my $ansEvalDefaults = $courseEnv->{pg}->{ansEvalDefaults};
325 $envir{$_} = $ansEvalDefaults->{$_} foreach (keys %$ansEvalDefaults); 326 $envir{$_} = $ansEvalDefaults->{$_} foreach (keys %$ansEvalDefaults);
326 327
353 $errorno = 0; ## don't report blank answer as error 354 $errorno = 0; ## don't report blank answer as error
354 return ($answer,$errorno); 355 return ($answer,$errorno);
355 } 356 }
356 # replace ^ with ** (for exponentiation) 357 # replace ^ with ** (for exponentiation)
357 # $answer =~ s/\^/**/g; 358 # $answer =~ s/\^/**/g;
358 # Return if forbidden characters are found 359 # Return if forbidden characters are found
359 unless ($answer =~ /^[a-zA-Z0-9_\-\+ \t\/@%\*\.\n^\(\)]+$/ ) { 360 unless ($answer =~ /^[a-zA-Z0-9_\-\+ \t\/@%\*\.\n^\(\)]+$/ ) {
360 $answer =~ tr/a-zA-Z0-9_\-\+ \t\/@%\*\.\n^\(\)/#/c; 361 $answer =~ tr/a-zA-Z0-9_\-\+ \t\/@%\*\.\n^\(\)/#/c;
361 $errorno = "<BR>There are forbidden characters in your answer: $submittedAnswer<BR>"; 362 $errorno = "<BR>There are forbidden characters in your answer: $submittedAnswer<BR>";
362 return ($answer,$errorno); 363 return ($answer,$errorno);
363 } 364 }
371 372
372=head1 SYNOPSIS 373=head1 SYNOPSIS
373 374
374 $pg = WeBWorK::PG->new( 375 $pg = WeBWorK::PG->new(
375 $courseEnv, # a WeBWorK::CourseEnvironment object 376 $courseEnv, # a WeBWorK::CourseEnvironment object
376 $user, # a WeBWorK::User object 377 $user, # a WeBWorK::DB::Record::User object
377 $sessionKey, 378 $sessionKey,
378 $set, # a WeBWorK::Set object 379 $set, # a WeBWorK::DB::Record::UserSet object
379 $problem, # a WeBWorK::Problem object 380 $problem, # a WeBWorK::DB::Record::UserProblem object
380 $psvn, 381 $psvn,
381 $formFields # in &WeBWorK::Form::Vars format 382 $formFields # in &WeBWorK::Form::Vars format
382 { # translation options 383 { # translation options
383 displayMode => "images", # (plainText|formattedText|images) 384 displayMode => "images", # (plainText|formattedText|images)
384 showHints => 1, # (0|1) 385 showHints => 1, # (0|1)
436 437
437a WeBWorK::Set object 438a WeBWorK::Set object
438 439
439=item PROBLEM 440=item PROBLEM
440 441
441a WeBWorK::Problem object. The contents of the source_file field can specify a 442a WeBWorK::DB::Record::UserProblem object. The contents of the source_file
442PG file either by absolute path or path relative to the "templates" directory. 443field can specify a PG file either by absolute path or path relative to the
443I<The caller should remove taint from this value before passing!> 444"templates" directory. I<The caller should remove taint from this value before
445passing!>
444 446
445=item PSVN 447=item PSVN
446 448
447the problem set version number 449the problem set version number
448 450

Legend:
Removed from v.620  
changed lines
  Added in v.927

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9