--- loncom/homework/bridgetask.pm 2005/12/20 18:09:49 1.89 +++ loncom/homework/bridgetask.pm 2006/01/21 08:03:27 1.96 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.89 2005/12/20 18:09:49 albertel Exp $ +# $Id: bridgetask.pm,v 1.96 2006/01/21 08:03:27 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -80,21 +80,28 @@ sub proctor_check_auth { } } if ($authenticated && $type eq 'Task') { + # increment version my $version= - $Apache::lonhomework::results{'resource.0.version'}= - ++$Apache::lonhomework::history{'resource.0.version'}; - $Apache::lonhomework::results{"resource.$version.0.checkedin"}= - $user.'@'.$domain; - $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}= - $slot_name; + $Apache::lonhomework::history{'resource.0.version'}; + $version++; + + #clean out all current results foreach my $key (keys(%Apache::lonhomework::history)) { if ($key=~/^resource\.0\./) { $Apache::lonhomework::results{$key}=''; } } + + #setup new version and who did it + $Apache::lonhomework::results{'resource.0.version'}=$version; + $Apache::lonhomework::results{"resource.$version.0.checkedin"}= + $user.'@'.$domain; + $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}= + $slot_name; + return 1; } elsif ($authenticated && $type eq 'problem') { - &Apache::lonxml::debug("authed #slot_name"); + &Apache::lonxml::debug("authed $slot_name"); $Apache::lonhomework::results{"resource.0.checkedin"}= $user.'@'.$domain; $Apache::lonhomework::results{"resource.0.checkedin.slot"}= @@ -547,6 +554,8 @@ DONESCREEN $result.=&show_queue($env{'form.queue'},1); } elsif ($status_code eq 'select_user') { $result.=&select_user(); + } elsif ($status_code eq 'unable') { + $result.=''.&mt("Unable to aqcuire a user to grade.").''.$back; } else { $result.=''.&mt("No user to be graded.").''.$back; } @@ -682,6 +691,17 @@ sub get_key_todo { } return (undef,undef) } + +sub minimize_storage { + foreach my $key (keys(%Apache::lonhomework::results)) { + if ($key =~ /regrader$/) { next; } + if ($Apache::lonhomework::results{$key} eq + $Apache::lonhomework::history{$key}) { + delete($Apache::lonhomework::results{$key}); + } + } +} + sub end_Task { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $result=''; @@ -757,7 +777,7 @@ DONEBUTTON my $opt_req=&Apache::lonxml::get_param('OptionalRequired', $parstack,$safeeval); if ($opt_req !~ /\S/) { $opt_req='0'; } - $status.="\n
".&mt('You needed to pass all of the [_1] mandatory components and [_2] of the [_3] optional components on the bridge task.',$man_count,$opt_req,$opt_count)."
\n"; + $status.="\n".&mt('You needed to pass all of the [_1] mandatory components and [_2] of the [_3] optional components, of which you were required to pass [_4] on the bridge task.',$man_count,$opt_passed,$opt_count,$opt_req)."
\n"; my $internal_location=&internal_location(); $result=~s/\Q$internal_location\E/$status/; @@ -890,6 +910,7 @@ DONEBUTTON $Apache::lonhomework::results{"resource.0.solved"}= $Apache::lonhomework::results{"resource.$version.0.solved"}; } + &minimize_storage(); &Apache::structuretags::finalize_storage(); } } elsif ($target eq 'webgrade') { @@ -1159,6 +1180,7 @@ sub get_queue_counts { return (0,0,0); } my ($entries,$ready_to_grade,$locks)=(0,0,0); + my %slot_cache; foreach my $key (sort(keys(%queue))) { if ($key=~/locked$/) { $locks++; @@ -1168,8 +1190,11 @@ sub get_queue_counts { my ($symb,$uname,$udom) = &decode_queue_key($key); $entries++; my $slot=$queue{$key}->[0]; - my %slot_data=&Apache::lonnet::get_slot($slot); - if (time > $slot_data{'endtime'}) { + if (!exists($slot_cache{$slot})) { + my %slot_data=&Apache::lonnet::get_slot($slot); + $slot_cache{$slot} = \%slot_data; + } + if (time > $slot_cache{$slot}{'endtime'}) { $ready_to_grade++; } } @@ -1298,7 +1323,12 @@ sub get_from_queue { my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum); &Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo))); if ($todo) { return $todo; } + my $attempts=0; while (1) { + if ($attempts > 2) { + # tried twice to get a queue entry, giving up + return (undef,'unable'); + } my $starttime=time; &Apache::lonnet::cput($queue,{"$symb\0timestamp"=>$starttime}, $cdom,$cnum); @@ -1325,7 +1355,10 @@ sub get_from_queue { &Apache::lonxml::debug("got $todo"); # otherwise found someone so lets try to lock them # unless someone else already picked them - if (!&lock_key($queue,$todo)) { next; } + if (!&lock_key($queue,$todo)) { + $attempts++; + next; + } my (undef,$endtime)= &Apache::lonnet::get($queue,["$symb\0timestamp"], $cdom,$cnum); @@ -1344,6 +1377,7 @@ sub get_from_queue { &Apache::lonnet::del($queue,["$todo\0locked"], $cdom,$cnum); &Apache::lonxml::debug("del"); + $attempts++; next; } } @@ -1708,7 +1742,7 @@ sub get_instance { $Apache::lonhomework::results{"resource.$version.0.$dim.status"}= 'fail'; } else { - $Apache::lonhomework::results{"resource.$version.$dim.status"}= + $Apache::lonhomework::results{"resource.$version.0.$dim.status"}= 'pass'; } } else {