--- loncom/homework/inputtags.pm 2007/04/16 22:50:41 1.221 +++ loncom/homework/inputtags.pm 2010/06/05 01:38:43 1.262 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # input definitons # -# $Id: inputtags.pm,v 1.221 2007/04/16 22:50:41 albertel Exp $ +# $Id: inputtags.pm,v 1.262 2010/06/05 01:38:43 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,13 +25,36 @@ # # http://www.lon-capa.org/ +=pod + +=head1 NAME + +Apache::inputtags + +=head1 SYNOPSIS + + + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + + +=head1 NOTABLE SUBROUTINES + +=over + +=item + +=back + +=cut + package Apache::inputtags; use HTML::Entities(); use strict; use Apache::loncommon; use Apache::lonlocal; use Apache::lonnet; -use lib '/home/httpd/lib/perl/'; use LONCAPA; @@ -39,41 +62,47 @@ BEGIN { &Apache::lonxml::register('Apache::inputtags',('hiddenline','textfield','textline')); } -# Initializes a set of global variables used during the parse of the problem. -# -# @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 -# ) -# 0 if not in a part. -# @Apache::inputtags::partlist - List of part ids seen in the current -# -# @Apache::inputtags::status - List of problem statuses. First -# element is the status of the -# the remainder are for individual s. -# %Apache::inputtags::params - Hash of defined parameters for the -# current response. -# @Apache::inputtags::import - List of all ids for 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 -# %Apache::inputtags::answertxt - <*response> tags store correct -# answer strings for display by -# in this hash. -# %Apache::inputtags::submission_display -# - <*response> tags store improved display -# of submission strings for display by part -# end. +=pod + +=item initialize_inputtags() + +Initializes a set of global variables used during the parse of the problem. + +@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 + ) + 0 if not in a part. +@Apache::inputtags::partlist - List of part ids seen in the current + +@Apache::inputtags::status - List of problem statuses. First + element is the status of the + the remainder are for individual s. +%Apache::inputtags::params - Hash of defined parameters for the + current response. +@Apache::inputtags::import - List of all ids for 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 +%Apache::inputtags::answertxt - <*response> tags store correct + answer strings for display by + in this hash. +%Apache::inputtags::submission_display + - <*response> tags store improved display + of submission strings for display by part + end. + +=cut sub initialize_inputtags { @Apache::inputtags::input=(); @@ -116,8 +145,7 @@ sub check_for_duplicate_ids { sub start_input { my ($parstack,$safeeval)=@_; - my $id = &Apache::lonxml::get_param('id',$parstack,$safeeval); - if ($id eq '') { $id = $Apache::lonxml::curdepth; } + my $id = &Apache::lonxml::get_id($parstack,$safeeval); push (@Apache::inputtags::input,$id); push (@Apache::inputtags::inputlist,$id); return $id; @@ -308,7 +336,9 @@ sub start_textline { $oldresponse = $oldresponse->[$#Apache::inputtags::inputlist]; } $oldresponse = &HTML::Entities::encode($oldresponse,'<>&"'); - + $oldresponse =~ s/^\s+//; + $oldresponse =~ s/\s+$//; + $oldresponse =~ s/\s+/ /g; if ($Apache::lonhomework::type ne 'exam') { my $addchars=&Apache::lonxml::get_param('addchars',$parstack,$safeeval); $result=''; @@ -358,8 +388,16 @@ sub start_textline { && $Apache::lonhomework::type ne 'exam') { my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval); if ($size != 0) {$size=$size*2; $size.=' mm';} else {$size='40 mm';} - $result='\framebox['.$size.'][s]{\tiny\strut}'; - + if ($env{'form.pdfFormFields'} eq 'yes' + && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') { + my $fieldname = $env{'request.symb'}. + '&part_'. $Apache::inputtags::part. + '&textresponse'. + '&HWVAL_' . $Apache::inputtags::response['-1']; + $result='\textField{'.$fieldname.'}{'.$size.'}{12 bp}'; + } else { + $result='\framebox['.$size.'][s]{\tiny\strut}'; + } } elsif ($target eq 'tex' && $Apache::lonhomework::type eq 'exam' && &needs_exam_box($tagstack)) { @@ -417,16 +455,24 @@ sub end_hiddenline { return ""; } -# $part -> partid -# $id -> responseid -# $uploadefiletypes -> comma seperated list of extensions allowed or * for any -# $which -> 'uploadedonly' -> only newly uploaded files -# 'portfolioonly' -> only allow files from portfolio -# 'both' -> allow files from either location -# $extratext -> additional text to go between the link and the input box -# returns a table row +=pod + +=item file_selector() + +$part -> partid +$id -> responseid +$uploadefiletypes -> comma seperated list of extensions allowed or * for any +$which -> 'uploadonly' -> only newly uploaded files + 'portfolioonly' -> only allow files from portfolio + 'both' -> allow files from either location +$extratext -> additional text to go between the link and the input box +$maxfilesize -> maximum cumulative filesize for submitted files (in MB). +returns a table row + +=cut + sub file_selector { - my ($part,$id,$uploadedfiletypes,$which,$extratext)=@_; + my ($part,$id,$uploadedfiletypes,$which,$extratext,$maxfilesize)=@_; if (!$uploadedfiletypes) { return ''; } my $jspart=$part; @@ -435,9 +481,16 @@ sub file_selector { my $result; $result.=''; - if ($uploadedfiletypes ne '*') { - $result.= - &mt('Allowed filetypes: [_1]',$uploadedfiletypes).'
'; + if (($uploadedfiletypes ne '*') || ($maxfilesize)) { + if ($uploadedfiletypes ne '*') { + $result.= + &mt('Allowed filetypes: [_1]',''.$uploadedfiletypes.'').'
'; + } + if ($maxfilesize) { + $result.=&mt('Combined size of files not to exceed: [_1] MB[_2].', + ''.$maxfilesize.'').'
'; + } + $result .= '
'; } if ($which eq 'uploadonly' || $which eq 'both') { $result.=&mt('Submit a file: (only one file can be uploaded)'). @@ -449,12 +502,11 @@ sub file_selector { $result.='
'.''.&mt('OR:').'
'; } if ($which eq 'portfolioonly' || $which eq 'both') { - $result.=$extratext.''. + $result.=$extratext.''. &mt('Select Portfolio Files').'
'. ''. '
'; $result .= &show_past_portfile_submission($part,$id); - } $result.=''; return $result; @@ -472,7 +524,7 @@ sub show_past_file_submission { my $icon=&Apache::loncommon::icon($url); my $curfile=''.$uploadedfile.''; - return &mt('Currently submitted: [_1]',$curfile); + return &mt('Currently submitted: [_1]',''.$curfile.''); } @@ -502,7 +554,9 @@ sub show_past_portfile_submission { my $bad_files = ''. join(', ',@bad_file_list). ''; - $result.='
'.&mt('These file(s) don\'t exist: [_1]',$bad_files); + $result.='

' + .&mt("These file(s) don't exist: [_1]",$bad_files) + .'

'; } return $result; @@ -516,10 +570,13 @@ sub valid_award { 'UNIT_INVALID_STUDENT', 'UNIT_IRRECONCIBLE', 'UNIT_FAIL', 'NO_UNIT', 'UNIT_NOTNEEDED', 'WANTED_NUMERIC', - 'BAD_FORMULA', 'SIG_FAIL', 'INCORRECT', + 'BAD_FORMULA', 'INTERNAL_ERROR', 'SIG_FAIL', 'INCORRECT', 'MISORDERED_RANK', 'INVALID_FILETYPE', - 'DRAFT', 'SUBMITTED', 'ASSIGNED_SCORE', - 'APPROX_ANS', 'EXACT_ANS','COMMA_FAIL') { + 'EXCESS_FILESIZE', 'DRAFT', + 'SUBMITTED', 'SUBMITTED_CREDIT', + 'ANONYMOUS', 'ANONYMOUS_CREDIT', + 'ASSIGNED_SCORE', 'APPROX_ANS', + 'EXACT_ANS','COMMA_FAIL') { if ($award eq $possibleaward) { return 1; } } return 0; @@ -530,10 +587,11 @@ sub valid_award { 'TOO_LONG', 'UNIT_INVALID_INSTRUCTOR', 'UNIT_INVALID_STUDENT', 'UNIT_IRRECONCIBLE', 'UNIT_FAIL', 'NO_UNIT', - 'UNIT_NOTNEEDED', 'WANTED_NUMERIC', 'BAD_FORMULA', + 'UNIT_NOTNEEDED', 'WANTED_NUMERIC', 'BAD_FORMULA', 'INTERNAL_ERROR', 'COMMA_FAIL', 'SIG_FAIL', 'INCORRECT', 'MISORDERED_RANK', - 'INVALID_FILETYPE', 'DRAFT', 'SUBMITTED', 'ASSIGNED_SCORE', - 'APPROX_ANS', 'EXACT_ANS'); + 'INVALID_FILETYPE', 'EXCESS_FILESIZE', 'DRAFT', 'SUBMITTED', + 'SUBMITTED_CREDIT', 'ANONYMOUS', 'ANONYMOUS_CREDIT', + 'ASSIGNED_SCORE', 'APPROX_ANS', 'EXACT_ANS'); my $i=0; my %fwd_awards = map { ($_,$i++) } @awards; my $max=scalar(@awards); @@ -541,8 +599,29 @@ sub valid_award { $i=0; my %rev_awards = map { ($_,$i++) } @awards; +sub awarddetail_to_awarded { + my ($awarddetail) = @_; + if ($awarddetail eq 'EXACT_ANS' + || $awarddetail eq 'APPROX_ANS') { + return 1; + } + return 0; +} + +sub hide_award { + my ($award) = @_; + if (&Apache::lonhomework::show_no_problem_status()) { + return 1; + } + if ($award =~ + /^(?:EXACT_ANS|APPROX_ANS|SUBMITTED|SUBMITTED_CREDIT|ANONYMOUS|ANONYMOUS_CREDIT|ASSIGNED_SCORE|INCORRECT)/) { + return 1; + } + return 0; +} + sub finalizeawards { - my ($awardref,$msgref,$nameref,$reverse)=@_; + my ($awardref,$msgref,$nameref,$reverse,$final_scantron)=@_; my $result; if ($#$awardref == -1) { $result = "NO_RESPONSE"; } if ($result eq '' ) { @@ -553,10 +632,32 @@ sub finalizeawards { $blankcount++; } } - if ($blankcount == ($#$awardref + 1)) { $result = 'NO_RESPONSE'; } + if ($blankcount == ($#$awardref + 1)) { + return ('NO_RESPONSE'); + } + } + + if ($Apache::lonxml::internal_error) { $result='INTERNAL_ERROR'; } + + if (!$final_scantron && defined($result)) { return ($result); } + + # if in scantron mode, if the award for any response is + # assigned score, then the part gets an assigned score + if ($final_scantron + && grep {$_ eq 'ASSIGNED_SCORE'} (@$awardref)) { + return ('ASSIGNED_SCORE'); } - if (defined($result)) { return ($result); } + # if in scantron mode, if the award for any response is + # correct and there are non-correct responses, + # then the part gets an assigned score + if ($final_scantron + && (grep { $_ eq 'EXACT_ANS' || + $_ eq 'APPROX_ANS' } (@$awardref)) + && (grep { $_ ne 'EXACT_ANS' && + $_ ne 'APPROX_ANS' } (@$awardref))) { + return ('ASSIGNED_SCORE'); + } # these awards are ordered from most important error through best correct my $awards = (!$reverse) ? \%fwd_awards : \%rev_awards ; @@ -570,6 +671,7 @@ sub finalizeawards { } $j++; } + if (defined($which)) { if (ref($nameref)) { return ($$awardref[$which],$$msgref[$which],$$nameref[$which]); @@ -583,6 +685,7 @@ sub finalizeawards { sub decideoutput { my ($award,$awarded,$awardmsg,$solved,$previous,$target)=@_; + my $message=''; my $button=0; my $previousmsg; @@ -597,8 +700,8 @@ sub decideoutput { ); my $part = $Apache::inputtags::part; - my $handgrade = - ('yes' eq lc(&Apache::lonnet::EXT("resource.$part.handgrade"))); + my $tohandgrade = &Apache::lonnet::EXT("resource.$part.handgrade"); + my $handgrade = ('yes' eq lc($tohandgrade)); my $computer = ($handgrade)? '' : " ".&mt("Computer's answer now shown above."); @@ -628,14 +731,18 @@ sub decideoutput { $message.= $computer; } $added_computer_text=1; - my ($symb) = &Apache::lonnet::whichuser(); - if ((!$env{'course.'. - $env{'request.course.id'}. - '.disable_receipt_display'} eq 'yes')&& - $symb) { - $message.=(($target eq 'web')?'
':' '). - &mt('Your receipt is').' '.&Apache::lonnet::receipt($Apache::inputtags::part). - (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):''); + if ($awarded > 0) { + my ($symb) = &Apache::lonnet::whichuser(); + if (($symb ne '') + && + ($env{'course.'.$env{'request.course.id'}. + '.disable_receipt_display'} ne 'yes') && + ($Apache::lonhomework::type ne 'practice')) { + $message.=(($target eq 'web')?'
':' '). + &mt('Your receipt no. is [_1]', + (&Apache::lonnet::receipt($Apache::inputtags::part). + (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):''))); + } } } $button=0; @@ -662,12 +769,14 @@ sub decideoutput { $message.= $computer; } $added_computer_text=1; - unless ($env{'course.'. + if ($awarded > 0 + && $env{'course.'. $env{'request.course.id'}. - '.disable_receipt_display'} eq 'yes') { + '.disable_receipt_display'} ne 'yes') { $message.=(($target eq 'web')?'
':' '). - 'Your receipt is '.&Apache::lonnet::receipt($Apache::inputtags::part). - (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):''); + &mt('Your receipt is [_1]', + (&Apache::lonnet::receipt($Apache::inputtags::part). + (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):''))); } $css_class=$possible_class{'correct'}; $button=0; @@ -683,10 +792,13 @@ sub decideoutput { $button = 1; } elsif ($award eq 'MISSING_ANSWER') { $message = &mt('Some items were not submitted.'); + if ($target ne 'tex') { + $message .= &Apache::loncommon::help_open_topic('Some_Items_Were_Not_Submitted'); + } $css_class=$possible_class{'not_charged_try'}; $button = 1; } elsif ($award eq 'ERROR') { - $message = &mt('An error occured while grading your answer.'); + $message = &mt('An error occurred while grading your answer.'); $css_class=$possible_class{'not_charged_try'}; $button = 1; } elsif ($award eq 'TOO_LONG') { @@ -698,20 +810,24 @@ sub decideoutput { $css_class=$possible_class{'not_charged_try'}; $button=1; } elsif ($award eq 'MISORDERED_RANK') { - $message = &mt('You have provided an invalid ranking'); - if ($target ne 'tex') { - $message.=', '.&mt('please refer to').' '.&Apache::loncommon::help_open_topic('Ranking_Problems','help on ranking problems'); - } + $message = &mt('You have provided an invalid ranking.'); + if ($target ne 'tex') { + $message.=' '.&mt('Please refer to [_1]',&Apache::loncommon::help_open_topic('Ranking_Problems',&mt('help on ranking problems'))); + } $css_class=$possible_class{'not_charged_try'}; $button=1; + } elsif ($award eq 'EXCESS_FILESIZE') { + $message = &mt('Submission won\'t be graded. The combined size of submitted files exceeded the amount allowed.'); + $css_class=$possible_class{'not_charged_try'}; + $button=1; } elsif ($award eq 'INVALID_FILETYPE') { - $message = &mt('Submission won\'t be graded. The type of file submitted is not allowed.'); + $message = &mt("Submission won't be graded. The type of file submitted is not allowed."); $css_class=$possible_class{'not_charged_try'}; $button=1; } elsif ($award eq 'SIG_FAIL') { my ($used,$min,$max)=split(':',$awardmsg); my $word = ($used < $min) ? 'more' : 'fewer'; - $message = &mt("Submission not graded. Use $word digits.",$used); + $message = &mt("Submission not graded. Use $word digits.",$used); $css_class=$possible_class{'not_charged_try'}; $button=1; } elsif ($award eq 'UNIT_INVALID_INSTRUCTOR') { @@ -743,9 +859,14 @@ sub decideoutput { $css_class=$possible_class{'not_charged_try'}; $button=1; } elsif ($award eq 'BAD_FORMULA') { - $message = &mt("Unable to understand formula"); + $message = &mt("Unable to understand formula").'.'; + if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Formula_Answers')}; $css_class=$possible_class{'not_charged_try'}; $button=1; + } elsif ($award eq 'INTERNAL_ERROR') { + $message = &mt("An internal error occurred while processing your answer. Please try again later."); + $css_class=$possible_class{'not_charged_try'}; + $button=1; } elsif ($award eq 'INCORRECT') { $message = &mt("Incorrect").'.'; $css_class=$possible_class{'charged_try'}; @@ -754,8 +875,19 @@ sub decideoutput { $message = &mt("Your submission has been recorded."); $css_class=$possible_class{'no_grade'}; $button=1; + } elsif ($award eq 'SUBMITTED_CREDIT') { + $message = &mt("Your submission has been recorded, and credit awarded."); + $css_class=$possible_class{'correct'}; + $button=1; + } elsif ($award eq 'ANONYMOUS') { + $message = &mt("Your anonymous submission has been recorded."); + $css_class=$possible_class{'no_grade'}; + $button=1; + } elsif ($award eq 'ANONYMOUS_CREDIT') { + $message = &mt("Your anonymous submission has been recorded, and credit awarded."); + $css_class=$possible_class{'correct'}; } elsif ($award eq 'DRAFT') { - $message = &mt("A draft copy has been saved."); + $message = &mt("Copy saved but not submitted."); $css_class=$possible_class{'not_charged_try'}; $button=1; } elsif ($award eq 'ASSIGNED_SCORE') { @@ -777,19 +909,33 @@ sub decideoutput { my (undef,undef,$domain,$user)=&Apache::lonnet::whichuser(); foreach my $resid(@Apache::inputtags::response){ if ($Apache::lonhomework::history{"resource.$part.$resid.handback"}) { - $message.='
'; + if ($target eq 'tex') { + $message.= "\\\\\n"; + } else { + $message.='
'; + } my @files = split(/\s*,\s*/, $Apache::lonhomework::history{"resource.$part.$resid.handback"}); my $file_msg; foreach my $file (@files) { - $file_msg.= '
'.$file.''; + if ($target eq 'tex') { + $file_msg.= "\\\\\n".$file; + } else { + $file_msg.= '
'.$file.''; + } } $message .= &mt('Returned file(s): [_1]',$file_msg); + if ($target eq 'tex') { + $message.= "\\\\\n"; + } else { + $message.='
'; + } } } - if (lc($Apache::lonhomework::problemstatus) eq 'no' && - $Apache::inputtags::status[-1] ne 'SHOW_ANSWER') { + if (&Apache::lonhomework::hide_problem_status() + && $Apache::inputtags::status[-1] ne 'SHOW_ANSWER' + && &hide_award($award)) { $message = &mt("Answer Submitted: Your final submission will be graded after the due date."); $css_class=$possible_class{'no_grade'}; $button=1; @@ -799,6 +945,15 @@ sub decideoutput { $message.= $computer; $added_computer_text=1; } + if ($Apache::lonhomework::type eq 'practice') { + if ($target eq 'web') { + $message .= '
'; + } else { + $message .= ' '; + } + $message.=&mt('Submissions to practice problems are not permanently recorded.'); + } + return ($button,$css_class,$message,$previousmsg); } @@ -852,8 +1007,9 @@ sub setgradedata { $Apache::lonhomework::results{"resource.$id.afterduedate"}=$award; return ''; } elsif ( $Apache::lonhomework::history{"resource.$id.solved"} !~ - /^correct/ || $Apache::lonhomework::scantronmode || - lc($Apache::lonhomework::problemstatus) eq 'no') { + /^correct/ + || $Apache::lonhomework::scantronmode + || &Apache::lonhomework::hide_problem_status() ) { # the student doesn't already have it correct, # or we are in a mode (scantron orno problem status) where a correct # can become incorrect @@ -875,8 +1031,13 @@ sub setgradedata { my $numawards=scalar(@Apache::inputtags::response); $Apache::lonhomework::results{"resource.$id.awarded"} = 0; foreach my $res (@Apache::inputtags::response) { - $Apache::lonhomework::results{"resource.$id.awarded"}+= - $Apache::lonhomework::results{"resource.$id.$res.awarded"}; + if (defined($Apache::lonhomework::results{"resource.$id.$res.awarded"})) { + $Apache::lonhomework::results{"resource.$id.awarded"}+= + $Apache::lonhomework::results{"resource.$id.$res.awarded"}; + } else { + $Apache::lonhomework::results{"resource.$id.awarded"}+= + &awarddetail_to_awarded($Apache::lonhomework::results{"resource.$id.$res.awarddetail"}); + } } if ($numawards > 0) { $Apache::lonhomework::results{"resource.$id.awarded"}/= @@ -888,11 +1049,23 @@ sub setgradedata { $Apache::lonhomework::results{"resource.$id.solved"} = $solvemsg; $Apache::lonhomework::results{"resource.$id.awarded"} = '1'; + } elsif ( $award eq 'SUBMITTED_CREDIT' ) { + $Apache::lonhomework::results{"resource.$id.tries"} = + $Apache::lonhomework::history{"resource.$id.tries"} + 1; + $Apache::lonhomework::results{"resource.$id.solved"} = + 'credit_attempted'; + $Apache::lonhomework::results{"resource.$id.awarded"} = '1'; + } elsif ( $award eq 'ANONYMOUS_CREDIT' ) { + $Apache::lonhomework::results{"resource.$id.tries"} = + $Apache::lonhomework::history{"resource.$id.tries"} + 1; + $Apache::lonhomework::results{"resource.$id.solved"} = + 'credit_attempted'; + $Apache::lonhomework::results{"resource.$id.awarded"} = '1'; } elsif ( $award eq 'INCORRECT' ) { $Apache::lonhomework::results{"resource.$id.tries"} = $Apache::lonhomework::history{"resource.$id.tries"} + 1; - if (lc($Apache::lonhomework::problemstatus) eq 'no' || - $Apache::lonhomework::scantronmode) { + if (&Apache::lonhomework::hide_problem_status() + || $Apache::lonhomework::scantronmode) { $Apache::lonhomework::results{"resource.$id.awarded"} = 0; } $Apache::lonhomework::results{"resource.$id.solved"} = @@ -902,6 +1075,11 @@ sub setgradedata { $Apache::lonhomework::history{"resource.$id.tries"} + 1; $Apache::lonhomework::results{"resource.$id.solved"} = 'ungraded_attempted'; + } elsif ( $award eq 'ANONYMOUS' ) { + $Apache::lonhomework::results{"resource.$id.tries"} = + $Apache::lonhomework::history{"resource.$id.tries"} + 1; + $Apache::lonhomework::results{"resource.$id.solved"} = + 'ungraded_attempted'; } elsif ( $award eq 'DRAFT' ) { $Apache::lonhomework::results{"resource.$id.solved"} = ''; } elsif ( $award eq 'NO_RESPONSE' ) { @@ -911,12 +1089,18 @@ sub setgradedata { } else { $Apache::lonhomework::results{"resource.$id.solved"} = 'incorrect_attempted'; - if (lc($Apache::lonhomework::problemstatus) eq 'no' || - $Apache::lonhomework::scantronmode) { + if (&Apache::lonhomework::show_no_problem_status() + || $Apache::lonhomework::scantronmode) { $Apache::lonhomework::results{"resource.$id.tries"} = $Apache::lonhomework::history{"resource.$id.tries"} + 1; $Apache::lonhomework::results{"resource.$id.awarded"} = 0; } + + if (&Apache::lonhomework::show_some_problem_status()) { + # clear out the awarded if they had gotten it wrong/right + # and are now in an error mode + $Apache::lonhomework::results{"resource.$id.awarded"} = ''; + } } if (defined($msg)) { $Apache::lonhomework::results{"resource.$id.awardmsg"} = $msg; @@ -930,7 +1114,7 @@ sub setgradedata { # check if this was a previous submission if it was delete the # unneeded data and update the previously_used attribute if ( $previously_used eq 'PREVIOUSLY_USED') { - if (lc($Apache::lonhomework::problemstatus) ne 'no') { + if (&Apache::lonhomework::show_problem_status()) { delete($Apache::lonhomework::results{"resource.$id.tries"}); $Apache::lonhomework::results{"resource.$id.previous"} = '1'; } @@ -955,6 +1139,10 @@ sub setgradedata { if ($award eq 'SUBMITTED') { &Apache::response::add_to_gradingqueue(); } + if (($Apache::lonhomework::type eq 'anonsurvey') || + ($Apache::lonhomework::type eq 'anonsurveycred')) { + $Apache::lonhomework::results{"resource.$id.type"} = $Apache::lonhomework::type; + } } sub find_which_previous { @@ -1008,13 +1196,15 @@ sub grade { &Apache::lonxml::debug("got message $value from $response for $id"); push (@msgs,$value); } - my ($finalaward,$msg) = &finalizeawards(\@awards,\@msgs); + my ($finalaward,$msg) = + &finalizeawards(\@awards,\@msgs,undef,undef, + $Apache::lonhomework::scantronmode); my $previously_used; if ( $#Apache::inputtags::previous eq $#awards ) { my ($match) = &previous_match(\@Apache::inputtags::previous_version, scalar(@Apache::inputtags::response)); - + if ($match) { $previously_used = 'PREVIOUSLY_LAST'; foreach my $value (@Apache::inputtags::previous) { @@ -1067,6 +1257,9 @@ sub get_grade_messages { if ( $maxtries eq 'con_lost' ) { $maxtries = '0'; } my $tries_text=&mt('Tries'); if ( $Apache::lonhomework::type eq 'survey' || + $Apache::lonhomework::type eq 'surveycred' || + $Apache::lonhomework::type eq 'anonsurvey' || + $Apache::lonhomework::type eq 'anonsurveycred' || $Apache::lonhomework::parsing_a_task) { $tries_text=&mt('Submissions'); } @@ -1082,7 +1275,7 @@ sub get_grade_messages { $trystr = '\vskip 0 mm '; } } else { - $trystr = "".$tries_text." $tries"; + $trystr = ''.$tries_text." $tries"; if ($Apache::lonhomework::parsing_a_task) { } elsif($env{'request.state'} ne 'construct') { $trystr.="/$maxtries"; @@ -1091,7 +1284,7 @@ sub get_grade_messages { $trystr.="/".$Apache::inputtags::params{'maxtries'}; } } - $trystr.=""; + $trystr.=""; } } @@ -1106,7 +1299,7 @@ sub get_grade_messages { } sub gradestatus { - my ($id,$target) = @_; + my ($id,$target,$no_previous) = @_; my $showbutton = 1; my $message = ''; my $latemessage = ''; @@ -1133,7 +1326,10 @@ sub gradestatus { } if ( $showbutton ) { if ($target ne 'tex') { - $button = ''; + $button = + ''; } } @@ -1145,7 +1341,13 @@ sub gradestatus { if ($target eq 'tex') { return $button.' \vskip 0 mm '.$output.' '; } else { - return ''.$output.'
'.$button.''.&previous_tries($id,$target).'
'; + $output = + ''.$output; + if (!$no_previous) { + $output.=''; + } + $output.= '
'.$button.''.&previous_tries($id,$target).'
'; + return $output; } } } @@ -1174,15 +1376,18 @@ sub previous_tries { my ($match,$which) = &find_which_previous($i); $message=$previousmsg; my $previous = $count_lookup{$which}; - $message =~ s{()}{ as submission # $previous $1}; + $message =~ s{()}{ as submission \# $previous $1}; } elsif ($Apache::lonhomework::history{"$prefix.tries"}) { - if ( $Apache::lonhomework::history{"$prefix.solved"} =~ - /^correct/) { + if (!(&Apache::lonhomework::hide_problem_status() + && $Apache::inputtags::status[-1] ne 'SHOW_ANSWER') + && $Apache::lonhomework::history{"$prefix.solved"} =~/^correct/ + ) { + + my $txt_correct = &mt('Correct'); $message =~ s{()(.*?)()} - {$1 Correct. $3}; + {$1 $txt_correct. $3}s; } - my $trystr = "(Try ". - $Apache::lonhomework::history{"$prefix.tries"}.')'; + my $trystr = "(".&mt('Try [_1]',$Apache::lonhomework::history{"$prefix.tries"}).")"; $message =~ s{()}{ $trystr $1}; } my ($class) = ($message =~ m{'; - $output.=''.$count.''; + $output.=''.$count.''; $output.=$message; foreach my $resid (@Apache::inputtags::response) { @@ -1211,28 +1416,32 @@ sub previous_tries { } return if ($output eq ''); my $headers = - ''.''.&mt('Submission #').''.&mt(' '). + ''.''.&mt('Submission #').''.&mt('Try'). ''. &mt('Submitted Answer').''; $output =''.$headers.$output.'
'; #return $output; - $output=~s/\\/\\\\/g; - $output=~s/\'/\\\'/g; - $output=~s/\s+/ /g; + $output = &Apache::loncommon::js_ready($output); + $output.='
'; + my $windowopen=&Apache::lonhtmlcommon::javascript_docopen(); my $start_page = &Apache::loncommon::start_page('Previous Tries', undef, - {'only_body' => 1, - 'bgcolor' => '#FFFFFF', - 'js_ready' => 1,}); + {'only_body' => 1, + 'bgcolor' => '#FFFFFF', + 'js_ready' => 1, + 'inherit_jsmath' => 1, }); my $end_page = &Apache::loncommon::end_page({'js_ready' => 1,}); - + my $prefix = $env{'form.request.prefix'}; + $prefix =~ tr{.}{_}; + my $function_name = "LONCAPA_previous_tries_".$prefix. + $Apache::lonxml::curdepth.'_'.$env{'form.counter'}; my $result ="".&mt("Previous Tries")."
"; +".&mt("Previous Tries")."
"; #use Data::Dumper; #&Apache::lonnet::logthis(&Dumper(\%Apache::inputtags::submission_display)); return $result; @@ -1240,4 +1449,10 @@ sub previous_tries { 1; __END__ + +=pod + +=back + +=cut 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.