--- loncom/homework/inputtags.pm 2004/06/07 21:52:11 1.146
+++ loncom/homework/inputtags.pm 2005/07/11 19:41:53 1.171
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# input definitons
#
-# $Id: inputtags.pm,v 1.146 2004/06/07 21:52:11 albertel Exp $
+# $Id: inputtags.pm,v 1.171 2005/07/11 19:41:53 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -30,6 +30,7 @@ use HTML::Entities();
use strict;
use Apache::loncommon;
use Apache::lonlocal;
+use Apache::lonnet;
BEGIN {
&Apache::lonxml::register('Apache::inputtags',('hiddenline','textfield','textline'));
@@ -148,9 +149,9 @@ sub start_textfield {
}
} elsif ($target eq 'grade') {
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
- $ENV{'form.HWVAL_'.$resid}='';
+ $env{'form.HWVAL_'.$resid}='';
}
} elsif ($target eq 'edit') {
$result.=&Apache::edit::tag_start($target,$token);
@@ -222,22 +223,34 @@ sub start_textline {
if ($addchars) {
$result.=&addchars('HWVAL_'.$id,$addchars);
}
- $result.= '';
}
} else {
#right or wrong don't show what was last typed in.
- $result=''.$Apache::inputtags::answertxt{$id}.'';
+ $result=''.$Apache::inputtags::answertxt{$id}.'';
#$result='';
}
} elsif ($target eq 'edit') {
$result=&Apache::edit::tag_start($target,$token);
$result.=&Apache::edit::text_arg('Size:','size',$token,'5').
- &Apache::edit::text_arg
- ('Click-On Texts (comma sep):','addchars',$token,10)."";
- $result.=&Apache::edit::end_table;
+ &Apache::edit::text_arg('Click-On Texts (comma sep):',
+ 'addchars',$token,10);
+ $result.=&Apache::edit::select_arg('Readonly:','readonly',
+ ['no','yes'],$token);
+ $result.=&Apache::edit::end_row();
+ $result.=&Apache::edit::end_table();
} elsif ($target eq 'modified') {
- my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'size','addchars');
+ my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+ $safeeval,'size',
+ 'addchars','readonly');
if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
} elsif ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval);
@@ -282,6 +295,69 @@ 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
+# returns a table row
+sub file_selector {
+ my ($part,$id,$uploadedfiletypes,$which)=@_;
+ if (!$uploadedfiletypes) { return ''; }
+
+ my $jspart=$part;
+ $jspart=~s/\./_/g;
+
+ my $result;
+
+ $result.='
';
+ if ($uploadedfiletypes ne '*') {
+ $result.=
+ &mt('Allowed filetypes: [_1]',$uploadedfiletypes).' ';
+ }
+ if ($which eq 'uploadonly' || $which eq 'both') {
+ $result.=&mt('Submit a file: (only one file can be uploaded)').
+ '
';
+ my $uploadedfile= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.uploadedfile"},'<>&"');
+
+ if ($uploadedfile) {
+ my $url=$Apache::lonhomework::history{"resource.$part.$id.uploadedurl"};
+ push (@Apache::lonxml::extlinks,$url);
+ &Apache::lonnet::allowuploaded('/adm/essayresponse',$url);
+ my $icon=&Apache::loncommon::icon($url);
+ my $curfile=''.$uploadedfile.'';
+ $result.=&mt('Currently submitted: [_1]',$curfile);
+ } else {
+ #$result.=&mt('(Hand in a file you have prepared on your computer)');
+ }
+ }
+ if ( $which eq 'both') {
+ $result.=' '.''.&mt('OR:').' ';
+ }
+ if ($which eq 'portfolioonly' || $which eq 'both') {
+ $result.=''.
+ &mt('Select Portfolio Files').' '.
+ ''.
+ ' ';
+ if ($Apache::lonhomework::history{"resource.$part.$id.portfiles"}=~/[^\s]/){
+ my @filelist;
+ foreach my $file (split(',',&Apache::lonnet::unescape($Apache::lonhomework::history{"resource.$part.$id.portfiles"}))) {
+ my (undef,undef,$domain,$user)=&Apache::lonxml::whichuser();
+ my $url="/uploaded/$domain/$user/portfolio$file";
+ my $icon=&Apache::loncommon::icon($url);
+ push(@filelist,''.$file.'');
+ }
+ $result.=&mt("Portfolio files previously selected: [_1]",join(', ',@filelist));
+ }
+ }
+ $result.='
';
+ return $result;
+}
+
sub checkstatus {
my ($value,$awardref,$msgref)=@_;
for (my $i=0;$i<=$#$awardref;$i++) {
@@ -317,7 +393,7 @@ sub finalizeawards {
'BAD_FORMULA', 'SIG_FAIL', 'INCORRECT',
'MISORDERED_RANK', 'INVALID_FILETYPE',
'DRAFT', 'SUBMITTED', 'ASSIGNED_SCORE',
- 'APPROX_ANS', 'EXACT_ANS') {
+ 'APPROX_ANS', 'EXACT_ANS','COMMA_FAIL') {
($result,$msg)=&checkstatus($possibleaward,$awardref,$msgref);
if (defined($result)) { return ($result,$msg); }
}
@@ -325,38 +401,52 @@ sub finalizeawards {
}
sub decideoutput {
- my ($award,$awardmsg,$solved,$previous,$target)=@_;
+ my ($award,$awarded,$awardmsg,$solved,$previous,$target)=@_;
my $message='';
my $button=0;
my $previousmsg;
my $bgcolor='orange';
+ my $added_computer_text=0;
my %possiblecolors =
( 'correct' => '#aaffaa',
'charged_try' => '#ffaaaa',
'not_charged_try' => '#ffffaa',
'no_message' => '#fffff',
);
+
if ($previous) { $previousmsg=&mt('You have entered that answer before'); }
if ($solved =~ /^correct/) {
- if ($award eq 'ASSIGNED_SCORE') {
- $message = &mt("A score has been assigned.");
+ $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 ($target eq 'tex') {
+ $message = '\textbf{'.$message.'}';
} else {
- if ($target eq 'tex') {
- $message = '\textbf{'.&mt('You are correct.').'}';
- } else {
- $message = "".&mt('You are correct.')."";
+ $message = "".$message."";
+ }
+ $added_computer_text=1;
+
+ if ($env{'request.filename'} !~
+ m|/res/lib/templates/examupload.problem$|) {
+ if ($target ne 'tex') {
+ $message.=" ".&mt("Computer's answer now shown above.");
}
- $message.= " ".&mt(" Computer's answer now shown.");
- unless ($ENV{'course.'.
- $ENV{'request.course.id'}.
+ unless ($env{'course.'.
+ $env{'request.course.id'}.
'.disable_receipt_display'} eq 'yes') {
$message.=(($target eq 'web')?' ':' ').
&mt('Your receipt is').' '.&Apache::lonnet::receipt($Apache::inputtags::part).
(($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):'');
}
}
- $bgcolor=$possiblecolors{'correct'};
$button=0;
$previousmsg='';
} elsif ($solved =~ /^excused/) {
@@ -378,10 +468,11 @@ sub decideoutput {
$message = '\textbf{'.&mt('You are correct.').'}';
} else {
$message = "".&mt('You are correct.')."";
+ $message.=" ".&mt("Computer's answer now shown above.");
}
- $message.= " ".&mt(" Computer's answer now shown.");
- unless ($ENV{'course.'.
- $ENV{'request.course.id'}.
+ $added_computer_text=1;
+ unless ($env{'course.'.
+ $env{'request.course.id'}.
'.disable_receipt_display'} eq 'yes') {
$message.=(($target eq 'web')?' ':' ').
'Your receipt is '.&Apache::lonnet::receipt($Apache::inputtags::part).
@@ -414,12 +505,12 @@ sub decideoutput {
} 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('please refer to').' '.&Apache::loncommon::help_open_topic('Ranking_Problems','help on ranking problems');
}
$bgcolor=$possiblecolors{'not_charged_try'};
$button=1;
} 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'};
$button=1;
} elsif ($award eq 'SIG_FAIL') {
@@ -436,17 +527,17 @@ sub decideoutput {
$bgcolor=$possiblecolors{'not_charged_try'};
$button=1;
} elsif ($award eq 'UNIT_INVALID_STUDENT') {
- $message = &mt('Unable to interpret units. Computer reads units as "[_1]"',''.$awardmsg.'.');
+ $message = &mt('Unable to interpret units. Computer reads units as "[_1]".',&markup_unit($awardmsg,$target));
if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');}
$bgcolor=$possiblecolors{'not_charged_try'};
$button=1;
} elsif ($award eq 'UNIT_FAIL' || $award eq 'UNIT_IRRECONCIBLE') {
- $message = &mt('Incompatible units. No conversion found between "[_1]" and the required units ',''.$awardmsg.'.');
+ $message = &mt('Incompatible units. No conversion found between "[_1]" and the required units.',&markup_unit($awardmsg,$target));
if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');}
$bgcolor=$possiblecolors{'not_charged_try'};
$button=1;
} elsif ($award eq 'UNIT_NOTNEEDED') {
- $message = &mt('Only a number required. Computer reads units of "[_1]"',''.$awardmsg.'.');
+ $message = &mt('Only a number required. Computer reads units of "[_1]".',&markup_unit($awardmsg,$target));
$bgcolor=$possiblecolors{'not_charged_try'};
$button=1;
} elsif ($award eq 'NO_UNIT') {
@@ -454,6 +545,10 @@ sub decideoutput {
if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units')};
$bgcolor=$possiblecolors{'not_charged_try'};
$button=1;
+ } elsif ($award eq 'COMMA_FAIL') {
+ $message = &mt("Proper comma separation is required").'.';
+ $bgcolor=$possiblecolors{'not_charged_try'};
+ $button=1;
} elsif ($award eq 'BAD_FORMULA') {
$message = &mt("Unable to understand formula");
$bgcolor=$possiblecolors{'not_charged_try'};
@@ -487,12 +582,23 @@ sub decideoutput {
$bgcolor=$possiblecolors{'correct'};
$button=1;
}
- if ($Apache::inputtags::status[-1] eq 'SHOW_ANSWER') {
- $message.=" ".&mt("Computer's answer now shown.");
+ if ($Apache::inputtags::status[-1] eq 'SHOW_ANSWER' &&
+ !$added_computer_text && $target ne 'tex') {
+ $message.=" ".&mt("Computer's answer now shown above.");
+ $added_computer_text=1;
}
return ($button,$bgcolor,$message,$previousmsg);
}
+sub markup_unit {
+ my ($unit,$target)=@_;
+ if ($target eq 'tex') {
+ return '\texttt{'.&Apache::lonxml::latex_special_symbols($unit).'}';
+ } else {
+ return "".$unit."";
+ }
+}
+
sub removealldata {
my ($id)=@_;
foreach my $key (keys(%Apache::lonhomework::results)) {
@@ -519,10 +625,15 @@ sub hidealldata {
sub setgradedata {
my ($award,$msg,$id,$previously_used) = @_;
- # if the student already has it correct, don't modify the status
- if ($Apache::lonhomework::scantronmode && defined($ENV{'form.CODE'})) {
- $Apache::lonhomework::results{"resource.CODE"}=$ENV{'form.CODE'};
+ if ($Apache::lonhomework::scantronmode &&
+ &Apache::lonnet::validCODE($env{'form.CODE'})) {
+ $Apache::lonhomework::results{"resource.CODE"}=$env{'form.CODE'};
+ } elsif ($Apache::lonhomework::scantronmode &&
+ $env{'form.CODE'} eq '' &&
+ $Apache::lonhomework::history{"resource.CODE"} ne '') {
+ $Apache::lonhomework::results{"resource.CODE"}='';
}
+
if (!$Apache::lonhomework::scantronmode &&
$Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
$Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
@@ -531,7 +642,10 @@ sub setgradedata {
} elsif ( $Apache::lonhomework::history{"resource.$id.solved"} !~
/^correct/ || $Apache::lonhomework::scantronmode ||
lc($Apache::lonhomework::problemstatus) eq 'no') {
- #handle assignment of tries and solved 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
+ # handle assignment of tries and solved status
my $solvemsg;
if ($Apache::lonhomework::scantronmode) {
$solvemsg='correct_by_scantron';
@@ -565,7 +679,8 @@ sub setgradedata {
} elsif ( $award eq 'INCORRECT' ) {
$Apache::lonhomework::results{"resource.$id.tries"} =
$Apache::lonhomework::history{"resource.$id.tries"} + 1;
- if (lc($Apache::lonhomework::problemstatus) eq 'no') {
+ if (lc($Apache::lonhomework::problemstatus) eq 'no' ||
+ $Apache::lonhomework::scantronmode) {
$Apache::lonhomework::results{"resource.$id.awarded"} = 0;
}
$Apache::lonhomework::results{"resource.$id.solved"} =
@@ -584,7 +699,8 @@ sub setgradedata {
} else {
$Apache::lonhomework::results{"resource.$id.solved"} =
'incorrect_attempted';
- if (lc($Apache::lonhomework::problemstatus) eq 'no') {
+ if (lc($Apache::lonhomework::problemstatus) eq 'no' ||
+ $Apache::lonhomework::scantronmode) {
$Apache::lonhomework::results{"resource.$id.tries"} =
$Apache::lonhomework::history{"resource.$id.tries"} + 1;
$Apache::lonhomework::results{"resource.$id.awarded"} = 0;
@@ -630,7 +746,7 @@ sub grade {
my ($target) = @_;
my $id = $Apache::inputtags::part;
my $response='';
- if ( defined $ENV{'form.submitted'}) {
+ if ( defined $env{'form.submitted'}) {
my (@awards,@msgs);
foreach $response (@Apache::inputtags::response) {
&Apache::lonxml::debug("looking for response.$id.$response.awarddetail");
@@ -683,6 +799,7 @@ sub gradestatus {
if ( $status ne 'CLOSED' && $status ne 'UNAVAILABLE' &&
$status ne 'INVALID_ACCESS') {
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 $previous = $Apache::lonhomework::history{"resource.$id.previous"};
my $awardmsg = $Apache::lonhomework::history{"resource.$id.awardmsg"};
@@ -690,7 +807,8 @@ sub gradestatus {
if ( $award ne '' || $solved ne '' || $status eq 'SHOW_ANSWER') {
&Apache::lonxml::debug('Getting message');
($showbutton,$bgcolor,$message,$previousmsg) =
- &decideoutput($award,$awardmsg,$solved,$previous,$target);
+ &decideoutput($award,$awarded,$awardmsg,$solved,$previous,
+ $target);
if ($target eq 'tex') {
$message='\vskip 2 mm '.$message.' ';
} else {
@@ -709,17 +827,21 @@ sub gradestatus {
if ( $maxtries eq '' ) { $maxtries = '2'; }
if ( $maxtries eq 'con_lost' ) { $maxtries = '0'; }
my $tries_text=&mt('Tries');
- if ( $Apache::lonhomework::type eq 'survey') { $tries_text=&mt('Submissions'); }
+ if ( $Apache::lonhomework::type eq 'survey' ||
+ $Apache::lonhomework::parsing_a_task) {
+ $tries_text=&mt('Submissions');
+ }
if ( $showbutton ) {
if ($target eq 'tex') {
- if ($ENV{'request.state'} ne "construct" && $Apache::lonhomework::type ne 'exam') {
+ 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 ';
} else {
$trystr = '\vskip 0 mm ';
}
} else {
$trystr = "
".$tries_text." $tries";
- if($ENV{'request.state'} ne 'construct') {
+ if ($Apache::lonhomework::parsing_a_task) {
+ } elsif($env{'request.state'} ne 'construct') {
$trystr.="/$maxtries";
} else {
if (defined($Apache::inputtags::params{'maxtries'})) {
@@ -732,15 +854,14 @@ sub gradestatus {
if ( $status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER') {$showbutton = 0;}
if ( $showbutton ) {
if ($target ne 'tex') {
- $button = '';
+ $button = '';
}
}
if ($Apache::lonhomework::history{"resource.$id.afterduedate"}) {
#last submissions was after due date
- if ($target eq 'tex') {
- $latemessage=' The last submission was after the Due Date ';
- } else {
- $latemessage="
The last submission was after the Due Date
";
+ $latemessage=&mt(' The last submission was after the Due Date ');;
+ if ($target eq 'web') {
+ $latemessage='