version 1.164, 2005/04/05 15:39:41
|
version 1.177, 2005/11/03 11:11:25
|
Line 30 use HTML::Entities();
|
Line 30 use HTML::Entities();
|
use strict; |
use strict; |
use Apache::loncommon; |
use Apache::loncommon; |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
use Apache::lonnet; |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::inputtags',('hiddenline','textfield','textline')); |
&Apache::lonxml::register('Apache::inputtags',('hiddenline','textfield','textline')); |
} |
} |
|
|
|
# Initializes a set of global variables used during the parse of the problem. |
|
# (I like this way of documenting variables better since |
|
# you don't have to rake your eyes over as much code rf). |
|
# |
|
# @Apache::inputtags::input - List of current input ids. |
|
# @Apache::inputtags::inputlist - List of all input ids seen this problem. |
|
# @Apache::inputtags::response - List of all current resopnse ids. |
|
# @Apache::inputtags::responselist - List of all response ids seen this problem. |
|
# @Apache::inputtags::hint - List of all hint ids. |
|
# @Apache::inputtags::hintlist - List of all hint ids seen this problem. |
|
# @Apache::inputtags::previous - List describing if specific responseds have been used |
|
# @Apache::inputtags::previous_version - Submission responses were used in. |
|
# $Apache::inputtags::part - Current part id (valid only in <problem> |
|
# 0 if not in a part. |
|
# @Apache::inputtags::partlist - List of part ids seen in the current <problem> |
|
# @Apache::inputtags::status - List of problem statuses. First element |
|
# is the status of the <problem> the remainder |
|
# are for individual <part>s. |
|
# %Apache::inputtags::params - Hash of defined parameters for the current |
|
# response. |
|
# @Apache::inputtags::import - List of all ids for <import> thes get |
|
# join()ed and prepended. |
|
# @Apache::inputtags::importlist - List of all import ids seen. |
|
# $Apache::inputtags::response_with_no_part |
|
# - Flag set true if we have seen a response |
|
# that is not inside a <part> |
|
# %Apache::inputtags::answertxt - <*response> tags store correct |
|
# answer strings for display by <textline/> |
|
# in this hash. |
|
# |
sub initialize_inputtags { |
sub initialize_inputtags { |
# list of current input ids |
|
@Apache::inputtags::input=(); |
@Apache::inputtags::input=(); |
# list of all input ids seen in this problem |
|
@Apache::inputtags::inputlist=(); |
@Apache::inputtags::inputlist=(); |
# list of all current response ids |
|
@Apache::inputtags::response=(); |
@Apache::inputtags::response=(); |
# list of all response ids seen in this problem |
|
@Apache::inputtags::responselist=(); |
@Apache::inputtags::responselist=(); |
# list of whether or not a specific response was previously used |
@Apache::inputtags::hint=(); |
|
@Apache::inputtags::hintlist=(); |
@Apache::inputtags::previous=(); |
@Apache::inputtags::previous=(); |
# submission it was used in |
|
@Apache::inputtags::previous_version=(); |
@Apache::inputtags::previous_version=(); |
# id of current part, 0 means that no part is current |
|
# (inside <problem> only |
|
$Apache::inputtags::part=''; |
$Apache::inputtags::part=''; |
# list of all part ids seen |
|
@Apache::inputtags::partlist=(); |
@Apache::inputtags::partlist=(); |
# list of problem date statuses, the first element is for <problem> |
|
# if there is a second element it is for the current <part> |
|
@Apache::inputtags::status=(); |
@Apache::inputtags::status=(); |
# hash of defined params for the current response |
|
%Apache::inputtags::params=(); |
%Apache::inputtags::params=(); |
# list of all ids, for <import>, these get join()ed and prepended |
|
@Apache::inputtags::import=(); |
@Apache::inputtags::import=(); |
# list of all import ids seen |
|
@Apache::inputtags::importlist=(); |
@Apache::inputtags::importlist=(); |
# just used to note whether we have seen a response that isn't in a part |
|
$Apache::inputtags::response_with_no_part=0; |
$Apache::inputtags::response_with_no_part=0; |
# storage location so the begin <*response> tag can generate the correct |
|
# answer string for display by the <textline /> |
|
%Apache::inputtags::answertxt=(); |
%Apache::inputtags::answertxt=(); |
} |
} |
|
|
Line 74 sub check_for_duplicate_ids {
|
Line 89 sub check_for_duplicate_ids {
|
my %check; |
my %check; |
foreach my $id (@Apache::inputtags::partlist, |
foreach my $id (@Apache::inputtags::partlist, |
@Apache::inputtags::responselist, |
@Apache::inputtags::responselist, |
|
@Apache::inputtags::hintlist, |
@Apache::inputtags::importlist) { |
@Apache::inputtags::importlist) { |
$check{$id}++; |
$check{$id}++; |
} |
} |
Line 148 sub start_textfield {
|
Line 164 sub start_textfield {
|
} |
} |
} elsif ($target eq 'grade') { |
} elsif ($target eq 'grade') { |
my $seedtext=&Apache::lonxml::get_all_text("/textfield",$parser); |
my $seedtext=&Apache::lonxml::get_all_text("/textfield",$parser); |
if ($seedtext eq $ENV{'form.HWVAL_'.$resid}) { |
if ($seedtext eq $env{'form.HWVAL_'.$resid}) { |
# if the seed text is still there it wasn't a real submission |
# if the seed text is still there it wasn't a real submission |
$ENV{'form.HWVAL_'.$resid}=''; |
$env{'form.HWVAL_'.$resid}=''; |
} |
} |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result.=&Apache::edit::tag_start($target,$token); |
$result.=&Apache::edit::tag_start($target,$token); |
Line 234 sub start_textline {
|
Line 250 sub start_textline {
|
} |
} |
} else { |
} else { |
#right or wrong don't show what was last typed in. |
#right or wrong don't show what was last typed in. |
$result='<i>'.$Apache::inputtags::answertxt{$id}.'</i>'; |
$result='<b>'.$Apache::inputtags::answertxt{$id}.'</b>'; |
#$result=''; |
#$result=''; |
} |
} |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
Line 300 sub end_hiddenline {
|
Line 316 sub end_hiddenline {
|
# $which -> 'uploadedonly' -> only newly uploaded files |
# $which -> 'uploadedonly' -> only newly uploaded files |
# 'portfolioonly' -> only allow files from portfolio |
# 'portfolioonly' -> only allow files from portfolio |
# 'both' -> allow files from either location |
# 'both' -> allow files from either location |
|
# $extratext -> additional text to go between the link and the input box |
# returns a table row <tr> |
# returns a table row <tr> |
sub file_selector { |
sub file_selector { |
my ($part,$id,$uploadedfiletypes,$which)=@_; |
my ($part,$id,$uploadedfiletypes,$which,$extratext)=@_; |
if (!$uploadedfiletypes) { return ''; } |
if (!$uploadedfiletypes) { return ''; } |
|
|
|
my $jspart=$part; |
|
$jspart=~s/\./_/g; |
|
|
my $result; |
my $result; |
|
|
$result.='<tr><td>'; |
$result.='<tr><td>'; |
Line 314 sub file_selector {
|
Line 335 sub file_selector {
|
if ($which eq 'uploadonly' || $which eq 'both') { |
if ($which eq 'uploadonly' || $which eq 'both') { |
$result.=&mt('Submit a file: (only one file can be uploaded)'). |
$result.=&mt('Submit a file: (only one file can be uploaded)'). |
' <br /><input type="file" size="50" name="HWFILE'. |
' <br /><input type="file" size="50" name="HWFILE'. |
$part.'_'.$id.'" /><br />'; |
$jspart.'_'.$id.'" /><br />'; |
my $uploadedfile= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.uploadedfile"},'<>&"'); |
my $uploadedfile= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.uploadedfile"},'<>&"'); |
|
|
if ($uploadedfile) { |
if ($uploadedfile) { |
my $url=$Apache::lonhomework::history{"resource.$part.$id.uploadedurl"}; |
my $url=$Apache::lonhomework::history{"resource.$part.$id.uploadedurl"}; |
push (@Apache::lonxml::extlinks,$url); |
&Apache::lonxml::extlink($url); |
&Apache::lonnet::allowuploaded('/adm/essayresponse',$url); |
&Apache::lonnet::allowuploaded('/adm/essayresponse',$url); |
my $icon=&Apache::loncommon::icon($url); |
my $icon=&Apache::loncommon::icon($url); |
my $curfile='<a href="'.$url.'"><img src="'.$icon. |
my $curfile='<a href="'.$url.'"><img src="'.$icon. |
Line 333 sub file_selector {
|
Line 354 sub file_selector {
|
$result.='<br />'.'<strong>'.&mt('OR:').'</strong><br />'; |
$result.='<br />'.'<strong>'.&mt('OR:').'</strong><br />'; |
} |
} |
if ($which eq 'portfolioonly' || $which eq 'both') { |
if ($which eq 'portfolioonly' || $which eq 'both') { |
$result.='<a href='."'".'javascript:void(window.open("/adm/portfolio?mode=selectfile&fieldname=HWPORT'.$part.'_'.$id.'","cat","height=600,width=800,scrollbars=1,resizable=1,menubar=2,location=1"))'."'".'>'. |
$result.=$extratext.'<a href='."'".'javascript:void(window.open("/adm/portfolio?mode=selectfile&fieldname=HWPORT'.$jspart.'_'.$id.'","cat","height=600,width=800,scrollbars=1,resizable=1,menubar=2,location=1"))'."'".'>'. |
&mt('Select Portfolio Files').'</a><br />'. |
&mt('Select Portfolio Files').'</a><br />'. |
'<input type="text" size="50" name="HWPORT'.$part.'_'.$id.'" value="" />'. |
'<input type="text" size="50" name="HWPORT'.$jspart.'_'.$id.'" value="" />'. |
'<br />'; |
'<br />'; |
if ($Apache::lonhomework::history{"resource.$part.$id.portfiles"}=~/[^\s]/){ |
if ($Apache::lonhomework::history{"resource.$part.$id.portfiles"}=~/[^\s]/){ |
my @filelist; |
my @filelist; |
Line 396 sub finalizeawards {
|
Line 417 sub finalizeawards {
|
} |
} |
|
|
sub decideoutput { |
sub decideoutput { |
my ($award,$awardmsg,$solved,$previous,$target)=@_; |
my ($award,$awarded,$awardmsg,$solved,$previous,$target)=@_; |
my $message=''; |
my $message=''; |
my $button=0; |
my $button=0; |
my $previousmsg; |
my $previousmsg; |
Line 408 sub decideoutput {
|
Line 429 sub decideoutput {
|
'not_charged_try' => '#ffffaa', |
'not_charged_try' => '#ffffaa', |
'no_message' => '#fffff', |
'no_message' => '#fffff', |
); |
); |
|
|
if ($previous) { $previousmsg=&mt('You have entered that answer before'); } |
if ($previous) { $previousmsg=&mt('You have entered that answer before'); } |
|
|
if ($solved =~ /^correct/) { |
if ($solved =~ /^correct/) { |
if ($award eq 'ASSIGNED_SCORE') { |
$bgcolor=$possiblecolors{'correct'}; |
|
$message=&mt('You are correct.'); |
|
if ($awarded < 1 && $awarded > 0) { |
|
$message=&mt('You are partially correct.'); |
|
$bgcolor=$possiblecolors{'not_charged_try'}; |
|
} elsif ($awarded < 1) { |
|
$message=&mt('Incorrect.'); |
|
$bgcolor=$possiblecolors{'charged_try'}; |
|
} |
|
if ($env{'request.filename'} =~ |
|
m|/res/lib/templates/examupload.problem$|) { |
$message = &mt("A score has been assigned."); |
$message = &mt("A score has been assigned."); |
|
$added_computer_text=1; |
} else { |
} else { |
if ($target eq 'tex') { |
if ($target eq 'tex') { |
$message = '\textbf{'.&mt('You are correct.').'}'; |
$message = '\textbf{'.$message.'}'; |
} else { |
} else { |
$message = "<b>".&mt('You are correct.')."</b>"; |
$message = "<b>".$message."</b>"; |
$message.=" ".&mt("Computer's answer now shown above."); |
$message.=" ".&mt("Computer's answer now shown above."); |
} |
} |
$added_computer_text=1; |
$added_computer_text=1; |
unless ($ENV{'course.'. |
unless ($env{'course.'. |
$ENV{'request.course.id'}. |
$env{'request.course.id'}. |
'.disable_receipt_display'} eq 'yes') { |
'.disable_receipt_display'} eq 'yes') { |
$message.=(($target eq 'web')?'<br />':' '). |
$message.=(($target eq 'web')?'<br />':' '). |
&mt('Your receipt is').' '.&Apache::lonnet::receipt($Apache::inputtags::part). |
&mt('Your receipt is').' '.&Apache::lonnet::receipt($Apache::inputtags::part). |
(($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):''); |
(($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):''); |
} |
} |
} |
} |
$bgcolor=$possiblecolors{'correct'}; |
|
$button=0; |
$button=0; |
$previousmsg=''; |
$previousmsg=''; |
} elsif ($solved =~ /^excused/) { |
} elsif ($solved =~ /^excused/) { |
Line 454 sub decideoutput {
|
Line 486 sub decideoutput {
|
$message.=" ".&mt("Computer's answer now shown above."); |
$message.=" ".&mt("Computer's answer now shown above."); |
} |
} |
$added_computer_text=1; |
$added_computer_text=1; |
unless ($ENV{'course.'. |
unless ($env{'course.'. |
$ENV{'request.course.id'}. |
$env{'request.course.id'}. |
'.disable_receipt_display'} eq 'yes') { |
'.disable_receipt_display'} eq 'yes') { |
$message.=(($target eq 'web')?'<br />':' '). |
$message.=(($target eq 'web')?'<br />':' '). |
'Your receipt is '.&Apache::lonnet::receipt($Apache::inputtags::part). |
'Your receipt is '.&Apache::lonnet::receipt($Apache::inputtags::part). |
Line 493 sub decideoutput {
|
Line 525 sub decideoutput {
|
$bgcolor=$possiblecolors{'not_charged_try'}; |
$bgcolor=$possiblecolors{'not_charged_try'}; |
$button=1; |
$button=1; |
} elsif ($award eq 'INVALID_FILETYPE') { |
} elsif ($award eq 'INVALID_FILETYPE') { |
$message = &mt('The filetype extension of the file you uploaded is not allowed.'); |
$message = &mt('Submission won\'t be graded. The type of file submitted is not allowed.'); |
$bgcolor=$possiblecolors{'not_charged_try'}; |
$bgcolor=$possiblecolors{'not_charged_try'}; |
$button=1; |
$button=1; |
} elsif ($award eq 'SIG_FAIL') { |
} elsif ($award eq 'SIG_FAIL') { |
Line 609 sub hidealldata {
|
Line 641 sub hidealldata {
|
sub setgradedata { |
sub setgradedata { |
my ($award,$msg,$id,$previously_used) = @_; |
my ($award,$msg,$id,$previously_used) = @_; |
if ($Apache::lonhomework::scantronmode && |
if ($Apache::lonhomework::scantronmode && |
&Apache::lonnet::validCODE($ENV{'form.CODE'})) { |
&Apache::lonnet::validCODE($env{'form.CODE'})) { |
$Apache::lonhomework::results{"resource.CODE"}=$ENV{'form.CODE'}; |
$Apache::lonhomework::results{"resource.CODE"}=$env{'form.CODE'}; |
} elsif ($Apache::lonhomework::scantronmode && |
} elsif ($Apache::lonhomework::scantronmode && |
$ENV{'form.CODE'} eq '' && |
$env{'form.CODE'} eq '' && |
$Apache::lonhomework::history{"resource.CODE"} ne '') { |
$Apache::lonhomework::history{"resource.CODE"} ne '') { |
$Apache::lonhomework::results{"resource.CODE"}=''; |
$Apache::lonhomework::results{"resource.CODE"}=''; |
} |
} |
Line 729 sub grade {
|
Line 761 sub grade {
|
my ($target) = @_; |
my ($target) = @_; |
my $id = $Apache::inputtags::part; |
my $id = $Apache::inputtags::part; |
my $response=''; |
my $response=''; |
if ( defined $ENV{'form.submitted'}) { |
if ( defined $env{'form.submitted'}) { |
my (@awards,@msgs); |
my (@awards,@msgs); |
foreach $response (@Apache::inputtags::response) { |
foreach $response (@Apache::inputtags::response) { |
&Apache::lonxml::debug("looking for response.$id.$response.awarddetail"); |
&Apache::lonxml::debug("looking for response.$id.$response.awarddetail"); |
Line 782 sub gradestatus {
|
Line 814 sub gradestatus {
|
if ( $status ne 'CLOSED' && $status ne 'UNAVAILABLE' && |
if ( $status ne 'CLOSED' && $status ne 'UNAVAILABLE' && |
$status ne 'INVALID_ACCESS') { |
$status ne 'INVALID_ACCESS') { |
my $award = $Apache::lonhomework::history{"resource.$id.award"}; |
my $award = $Apache::lonhomework::history{"resource.$id.award"}; |
|
my $awarded = $Apache::lonhomework::history{"resource.$id.awarded"}; |
my $solved = $Apache::lonhomework::history{"resource.$id.solved"}; |
my $solved = $Apache::lonhomework::history{"resource.$id.solved"}; |
my $previous = $Apache::lonhomework::history{"resource.$id.previous"}; |
my $previous = $Apache::lonhomework::history{"resource.$id.previous"}; |
my $awardmsg = $Apache::lonhomework::history{"resource.$id.awardmsg"}; |
my $awardmsg = $Apache::lonhomework::history{"resource.$id.awardmsg"}; |
Line 789 sub gradestatus {
|
Line 822 sub gradestatus {
|
if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') { |
if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') { |
&Apache::lonxml::debug('Getting message'); |
&Apache::lonxml::debug('Getting message'); |
($showbutton,$bgcolor,$message,$previousmsg) = |
($showbutton,$bgcolor,$message,$previousmsg) = |
&decideoutput($award,$awardmsg,$solved,$previous,$target); |
&decideoutput($award,$awarded,$awardmsg,$solved,$previous, |
|
$target); |
if ($target eq 'tex') { |
if ($target eq 'tex') { |
$message='\vskip 2 mm '.$message.' '; |
$message='\vskip 2 mm '.$message.' '; |
} else { |
} else { |
Line 814 sub gradestatus {
|
Line 848 sub gradestatus {
|
} |
} |
if ( $showbutton ) { |
if ( $showbutton ) { |
if ($target eq 'tex') { |
if ($target eq 'tex') { |
if ($ENV{'request.state'} ne "construct" && $Apache::lonhomework::type ne 'exam' && $ENV{'form.suppress_tries'} ne 'yes') { |
if ($env{'request.state'} ne "construct" && $Apache::lonhomework::type ne 'exam' && $env{'form.suppress_tries'} ne 'yes') { |
$trystr = ' {\vskip 1 mm \small \textit{'.$tries_text.'} '.$tries.'/'.$maxtries.'} \vskip 2 mm '; |
$trystr = ' {\vskip 1 mm \small \textit{'.$tries_text.'} '.$tries.'/'.$maxtries.'} \vskip 2 mm '; |
} else { |
} else { |
$trystr = '\vskip 0 mm '; |
$trystr = '\vskip 0 mm '; |
Line 822 sub gradestatus {
|
Line 856 sub gradestatus {
|
} else { |
} else { |
$trystr = "<td><nobr>".$tries_text." $tries"; |
$trystr = "<td><nobr>".$tries_text." $tries"; |
if ($Apache::lonhomework::parsing_a_task) { |
if ($Apache::lonhomework::parsing_a_task) { |
} elsif($ENV{'request.state'} ne 'construct') { |
} elsif($env{'request.state'} ne 'construct') { |
$trystr.="/$maxtries"; |
$trystr.="/$maxtries"; |
} else { |
} else { |
if (defined($Apache::inputtags::params{'maxtries'})) { |
if (defined($Apache::inputtags::params{'maxtries'})) { |