--- loncom/homework/inputtags.pm 2003/05/06 15:31:45 1.98 +++ loncom/homework/inputtags.pm 2003/08/28 12:54:27 1.114 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # input definitons # -# $Id: inputtags.pm,v 1.98 2003/05/06 15:31:45 albertel Exp $ +# $Id: inputtags.pm,v 1.114 2003/08/28 12:54:27 sakharuk Exp $ # # Copyright Michigan State University Board of Trustees # @@ -52,6 +52,8 @@ sub initialize_inputtags { @Apache::inputtags::previous_version=(); # id of current part, 0 means that no part is current (inside only $Apache::inputtags::part=''; + # list of all part ids seen + @Apache::inputtags::partlist=(); # list of problem date statuses, the first element is for # if there is a second element it is for the current @Apache::inputtags::status=(); @@ -59,6 +61,26 @@ sub initialize_inputtags { %Apache::inputtags::params=(); # list of all ids, for , these get join()ed and prepended @Apache::inputtags::import=(); + # list of all import ids seen + @Apache::inputtags::importlist=(); +} + +sub check_for_duplicate_ids { + my %check; + foreach my $id (@Apache::inputtags::partlist, + @Apache::inputtags::responselist, + @Apache::inputtags::importlist) { + $check{$id}++; + } + my @duplicates; + foreach my $id (sort(keys(%check))) { + if ($check{$id} > 1) { + push(@duplicates,$id); + } + } + if (@duplicates) { + &Apache::lonxml::error("Duplicated ids found, problem will operate incorrectly. Duplicated ids seen: ",join(', ',@duplicates)); + } } sub start_input { @@ -122,6 +144,7 @@ sub start_textfield { } else { $result=$token->[4]; } + my $bodytext=&Apache::lonxml::get_all_text("/textfield",$parser); $result.=&Apache::edit::modifiedfield(); } elsif ($target eq 'tex') { my $number_of_lines = &Apache::lonxml::get_param('rows',$parstack,$safeeval); @@ -160,14 +183,14 @@ sub start_textline { my $result = ""; if ($target eq 'web') { $Apache::lonxml::evaluate--; + my $partid=$Apache::inputtags::part; + my $id=$Apache::inputtags::response[-1]; if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') { my $size = &Apache::lonxml::get_param('size',$parstack,$safeeval); my $maxlength; if ($size eq '') { $size=20; } else { if ($size < 20) { $maxlength=$size; } } - my $partid=$Apache::inputtags::part; - my $id=$Apache::inputtags::response[-1]; my $oldresponse = &HTML::Entities::encode($Apache::lonhomework::history{"resource.$partid.$id.submission"}); if ($Apache::lonhomework::type ne 'exam') { $result= 'You are correct."; } - $message=' Your receipt is '.&Apache::lonnet::receipt; + unless ($ENV{'course.'. + $ENV{'request.course.id'}. + '.disable_receipt_display'} eq 'yes') { + $message.=(($target eq 'web')?'
':' '). + 'Your receipt is '.&Apache::lonnet::receipt(). + (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):''); + } } + $bgcolor=$possiblecolors{'correct'}; $button=0; $previousmsg=''; } elsif ($solved =~ /^excused/) { - $message = "You are excused from the problem."; + if ($target eq 'tex') { + $message = ' \textbf{You are excused from the problem.} '; + } else { + $message = "You are excused from the problem."; + } + $bgcolor=$possiblecolors{'charged_try'}; $button=0; $previousmsg=''; } elsif ($award eq 'EXACT_ANS' || $award eq 'APPROX_ANS' ) { if ($solved =~ /^incorrect/ || $solved eq '') { $message = "Incorrect"; + $bgcolor=$possiblecolors{'charged_try'}; $button=1; } else { - $message = "You are correct. Your receipt is ". - &Apache::lonnet::receipt; + $message = "You are correct."; + unless ($ENV{'course.'. + $ENV{'request.course.id'}. + '.disable_receipt_display'} eq 'yes') { + $message.=(($target eq 'web')?'
':' '). + 'Your receipt is '.&Apache::lonnet::receipt(). + (($target eq 'web')?&Apache::loncommon::help_open_topic('Receipt'):''); + } + $bgcolor=$possiblecolors{'correct'}; $button=0; $previousmsg=''; } } elsif ($award eq 'NO_RESPONSE') { $message = ''; + $bgcolor=$possiblecolors{'no_feedback'}; $button=1; } elsif ($award eq 'MISSING_ANSWER') { $message = 'Some parts were not submitted'; + $bgcolor=$possiblecolors{'not_charged_try'}; $button = 1; + } elsif ($award eq 'ERROR') { + $message = 'An error occured while grading your answer.'; + $bgcolor=$possiblecolors{'not_charged_try'}; + $button = 1; + } elsif ($award eq 'TOO_LONG') { + $message = "The submitted answer was too long."; + $bgcolor=$possiblecolors{'not_charged_try'}; + $button=1; } elsif ($award eq 'WANTED_NUMERIC') { $message = "This question expects a numeric answer"; + $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'MISORDERED_RANK') { - $message = 'You have provided an invalid ranking, please refer to '. - &Apache::loncommon::help_open_topic('Ranking_Problems','help on ranking problems').'.'; + $message = 'You have provided an invalid ranking'; + if ($target ne 'tex') { + $message.=', 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 = 'The filetype extension of the file you uploaded is not allowed.'; + $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'SIG_FAIL') { $message = "Please adjust significant figures.";# you provided %s significant figures"; + $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'UNIT_FAIL') { - $message = "Units incorrect. ". - &Apache::loncommon::help_open_topic('Physical_Units'); #Computer reads units as %s"; + $message = "Units incorrect. "; + if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} #Computer reads units as %s"; + $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'UNIT_NOTNEEDED') { $message = "Only a number required.";# Computer reads units of %s"; + $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'NO_UNIT') { - $message = "Units required". - &Apache::loncommon::help_open_topic('Physical_Units'); + $message = "Units required"; + if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units')}; + $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'BAD_FORMULA') { $message = "Unable to understand formula"; + $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'INCORRECT') { $message = "Incorrect"; + $bgcolor=$possiblecolors{'charged_try'}; $button=1; } elsif ($award eq 'SUBMITTED') { $message = "Your submission has been recorded."; + $bgcolor=$possiblecolors{'correct'}; $button=1; } elsif ($award eq 'DRAFT') { $message = "A draft copy has been saved."; + $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'ASSIGNED_SCORE') { $message = "A score has been assigned."; + $bgcolor=$possiblecolors{'correct'}; $button=0; } else { $message = "Unknown message: $award"; @@ -381,9 +456,10 @@ sub decideoutput { } if (lc($Apache::lonhomework::problemstatus) eq 'no') { $message = "Answer Submitted"; + $bgcolor=$possiblecolors{'correct'}; $button=1; } - return ($button,$message,$previousmsg); + return ($button,$bgcolor,$message,$previousmsg); } sub removealldata { @@ -404,7 +480,8 @@ sub setgradedata { $Apache::lonhomework::results{"resource.$id.afterduedate"}=$award; return ''; } elsif ( $Apache::lonhomework::history{"resource.$id.solved"} !~ - /^correct/ || $Apache::lonhomework::scantronmode) { + /^correct/ || $Apache::lonhomework::scantronmode || + lc($Apache::lonhomework::problemstatus) eq 'no') { #handle assignment of tries and solved status my $solvemsg; if ($Apache::lonhomework::scantronmode) { @@ -420,10 +497,9 @@ sub setgradedata { $Apache::lonhomework::history{"resource.$id.tries"} + 1; $Apache::lonhomework::results{"resource.$id.solved"} = $solvemsg; - my $numawards=scalar(@Apache::inputtags::responselist); - &Apache::lonxml::debug("Whaaa!"); + my $numawards=scalar(@Apache::inputtags::response); $Apache::lonhomework::results{"resource.$id.awarded"} = 0; - foreach my $res (@Apache::inputtags::responselist) { + foreach my $res (@Apache::inputtags::response) { $Apache::lonhomework::results{"resource.$id.awarded"}+= $Apache::lonhomework::results{"resource.$id.$res.awarded"}; } @@ -456,13 +532,19 @@ sub setgradedata { } else { $Apache::lonhomework::results{"resource.$id.solved"} = 'incorrect_attempted'; + if (lc($Apache::lonhomework::problemstatus) eq 'no') { + $Apache::lonhomework::results{"resource.$id.tries"} = + $Apache::lonhomework::history{"resource.$id.tries"} + 1; + } } # 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') { - delete($Apache::lonhomework::results{"resource.$id.tries"}); - $Apache::lonhomework::results{"resource.$id.previous"} = '1'; + if (lc($Apache::lonhomework::problemstatus) ne 'no') { + delete($Apache::lonhomework::results{"resource.$id.tries"}); + $Apache::lonhomework::results{"resource.$id.previous"} = '1'; + } } elsif ( $previously_used eq 'PREVIOUSLY_LAST') { #delete all data as they student didn't do anything, but save #the list of collaborators. @@ -488,7 +570,7 @@ sub grade { my $response=''; if ( defined $ENV{'form.submitted'}) { my @awards = (); - foreach $response (@Apache::inputtags::responselist) { + foreach $response (@Apache::inputtags::response) { &Apache::lonxml::debug("looking for response.$id.$response.awarddetail"); my $value=$Apache::lonhomework::results{"resource.$id.$response.awarddetail"}; &Apache::lonxml::debug("keeping $value from $response for $id"); @@ -524,6 +606,7 @@ sub grade { sub gradestatus { my ($id,$target) = @_; my $showbutton = 1; + my $bgcolor = ''; my $message = ''; my $latemessage = ''; my $trystr=''; @@ -537,16 +620,16 @@ sub gradestatus { my $solved = $Apache::lonhomework::history{"resource.$id.solved"}; my $previous = $Apache::lonhomework::history{"resource.$id.previous"}; &Apache::lonxml::debug("Found Award |$award|$solved|"); - if ( $award ne '' ) { + if ( $award ne '' || $solved ne '') { &Apache::lonxml::debug('Getting message'); - ($showbutton,$message,$previousmsg) = + ($showbutton,$bgcolor,$message,$previousmsg) = &decideoutput($award,$solved,$previous,$target); if ($target eq 'tex') { $message=' '.$message.' '; } else { - $message="$message"; + $message="$message"; if ($previousmsg) { - $previousmsg="$previousmsg"; + $previousmsg="$previousmsg"; } } }