--- loncom/homework/bridgetask.pm	2005/05/27 21:13:46	1.33
+++ loncom/homework/bridgetask.pm	2005/08/09 16:48:15	1.39
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: bridgetask.pm,v 1.33 2005/05/27 21:13:46 albertel Exp $
+# $Id: bridgetask.pm,v 1.39 2005/08/09 16:48:15 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -36,6 +36,7 @@ use Apache::File();
 use Apache::lonmenu;
 use Apache::lonlocal;
 use Apache::lonxml;
+use Apache::slotrequest();
 use Time::HiRes qw( gettimeofday tv_interval );
 
 BEGIN {
@@ -91,6 +92,7 @@ sub proctor_check_auth {
 sub get_version {
     my ($version,$previous);
     if ($env{'form.previousversion'} && 
+	$env{'form.previousversion'} ne 'current' &&
 	defined($Apache::lonhomework::history{'resource.'.$env{'form.previousversion'}.'.status'})) {
 	$version=$env{'form.previousversion'};
 	$previous=1;
@@ -129,6 +131,7 @@ sub add_previous_version_button {
     my $list='<option>'.
 	join("</option>\n<option>",@to_show).
 	     "</option>\n";
+    $list.='<option value="current">'.&mt('Current').'</option>';
     $result.='<form name="getprevious" method="POST" action="';
     my $uri=$env{'request.uri'};
     if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
@@ -146,19 +149,46 @@ sub add_grading_button {
     $result.='<input type="hidden" name="grade_target" value="webgrade" />';
     if ( 1) {
 	#need a permissions for limitng this to 'powerful users'
-	#check if review queue has items
-	$result.=' <input type="submit" name="reviewasubmission" value="'.
-	    &mt("Select an entry from the review queue").'" />'."\n";
+
+	my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');
+	$result.='<p>'.&mt("Grading Queue has [_1] entries. [_2] of them are ready to be graded and [_3] of them are currently being graded",$entries,$ready,$locks);
+
 	$result.=' <input type="submit" name="reviewagrading" value="'.
-	    &mt("Select an entry from the grading queue").'" />'."\n";
+	    &mt("Select an entry from the grading queue").'" /> </p>'."\n";
+
+	($entries,$ready,$locks)=&get_queue_counts('reviewqueue');
+	$result.='<p>'.&mt("Review Queue has [_1] entries. [_2] of them are ready to be graded and [_3] of them are currently being graded",$entries,$ready,$locks);
+	$result.=' <input type="submit" name="reviewasubmission" value="'.
+	    &mt("Select an entry from the review queue").'" /> </p>'."\n";
     }
     return $result;
 }
 
 sub add_request_another_attempt_button {
+    my ($text)=@_;
+    if (!$text) { $text="Request another attempt"; }
     my $result;
-    $result.=' <input type="submit" name="requestattempt" value="'.
-	&mt("Request another attempt").'" />';
+    my $symb=&Apache::lonnet::symbread();
+    my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb);
+    my $action='get_reservation';
+    if ($slot_name) {
+	$text="Change reservation.";
+	$action='change_reservation';
+	my $description=&Apache::slotrequest::get_description($slot_name,
+							      $slot);
+	$result.=(<<STUFF);
+<p> Will be next available: $description </p>
+STUFF
+    }
+    
+    if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }
+    $symb=&Apache::lonnet::escape($symb);
+    $result.='<form method="POST" action="/adm/slotrequest">'.
+	'<input type="hidden" name="symb" value="'.$symb.'" />'.
+	'<input type="hidden" name="command" value="'.$action.'" />'.
+	'<input type="submit" name="requestattempt" value="'.
+	&mt($text).'" />'.
+	'</form>';
     return $result;
 }
 
@@ -194,6 +224,14 @@ sub start_Task {
 	    my $uri=$env{'request.uri'};
 	    if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
 	    $body_tag_start.=$uri.'">'.&add_grading_button()."</form>";
+	    my $symb=&Apache::lonnet::symbread();
+	    $body_tag_start.='<form method="POST" action="/adm/slotrequest">'.
+		'<input type="hidden" name="symb" value="'.$symb.'" />'.
+		'<input type="hidden" name="command" value="showslots" />'.
+		'<input type="submit" name="requestattempt" value="'.
+		&mt('Show Slot list').'" />'.
+		'</form>';
+
 	}
     }
     if ($target eq 'web' || ($target eq 'grade' && !$env{'form.webgrade'}) || $target eq 'answer' ||
@@ -224,6 +262,7 @@ sub start_Task {
 		    $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
 		} elsif ($status eq 'NOT_IN_A_SLOT') {
 		    $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>';
+		    $msg.=&add_request_another_attempt_button("Sign up for time to work.");
 		} elsif ($status eq 'NEEDS_CHECKIN') {
 		    $msg.='<h1>'.&mt('You need the Proctor to validate you.').
 			'</h1>'.&proctor_validation_screen($slot);
@@ -258,9 +297,8 @@ sub start_Task {
 	} elsif ($target eq 'web') {
 	    my $name= &Apache::structuretags::get_resource_name($parstack,$safeeval);
 	    $result.="$head_tag_start<title>$name</title></head>
-              $body_tag_start \n $form_tag_start".	
-	      '<input type="hidden" name="submitted" value="yes" />';
-	    $result.=&preserve_grade_info();
+              $body_tag_start \n";
+	    
 	    my ($version,$previous)=&get_version();
 	    if ($Apache::lonhomework::history{"resource.$version.status"} eq 'fail') {
 		$result.='<h1><font color="red">'.&mt('Did not pass').'</font></h1>';
@@ -271,6 +309,10 @@ sub start_Task {
 	    if ($Apache::lonhomework::history{"resource.$version.status"} eq 'pass') {
 		$result.='<h1><font color="green">'.&mt('Passed').'</font></h1>';
 	    }
+	    $result.=$form_tag_start.
+		'<input type="hidden" name="submitted" value="yes" />';
+	    $result.=&preserve_grade_info();
+
 	}
     } elsif ( ($target eq 'grade' && $env{'form.webgrade'}) ||
 	      $target eq 'webgrade') {
@@ -509,13 +551,31 @@ sub end_Task {
 		$Apache::lonhomework::results{"resource.$version.0.solved"}='incorrect_by_override';
 		$Apache::lonhomework::results{"resource.$version.0.award"}='INCORRECT';
 		$Apache::lonhomework::results{"resource.$version.0.awarded"}='0';
-		&remove_from_queue($env{'form.queue'});
+		&remove_from_queue($env{'form.queue'}); 
+
+		my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
+		$Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}=
+		    $Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"};
+		&Apache::grades::version_portfiles(
+					\%Apache::lonhomework::results,
+					 ["$version.0.bridgetask"],$courseid,
+					 $symb,$udom,$uname,
+					 ["$version.0.bridgetask"]);
 	    } else {
 		$Apache::lonhomework::results{"resource.$version.status"}='pass';
 		$Apache::lonhomework::results{"resource.$version.0.solved"}='correct_by_override';
 		$Apache::lonhomework::results{"resource.$version.0.award"}='EXACT_ANS';
 		$Apache::lonhomework::results{"resource.$version.0.awarded"}='1';
 		&remove_from_queue($env{'form.queue'});
+
+		my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
+		$Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}=
+		    $Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"};
+		&Apache::grades::version_portfiles(
+					\%Apache::lonhomework::results,
+					 ["$version.0.bridgetask"],$courseid,
+					 $symb,$udom,$uname,
+					 ["$version.0.bridgetask"]);
 	    }
 	    $Apache::lonhomework::results{"resource.status"}=
 		$Apache::lonhomework::results{"resource.$version.status"};
@@ -655,6 +715,8 @@ sub show_queue {
 	    my ($symb,$uname,$udom) = &decode_queue_key($key);
 	    my $title=&Apache::lonnet::gettitle($symb);
 	    $result.="<tr>";
+	    my $slot=$queue{$key}->[0];
+	    my %slot_data=&Apache::lonnet::get_slot($slot);
 	    if ($with_selects) {
 		my $ekey=&Apache::lonnet::escape($key);
 		my ($action,$description)=('select',&mt('Select'));
@@ -666,7 +728,8 @@ sub show_queue {
 			($action,$description)=('unlock',&mt('Unlock'));
 		    }
 		}
-		$result.=(<<FORM);
+		if (time > $slot_data{'endtime'}) {
+		    $result.=(<<FORM);
 <td>
 <form method="POST">
  <input type="hidden" name="gradingkey" value="$ekey" />
@@ -678,10 +741,12 @@ sub show_queue {
 </form>
 </td>
 FORM
+
+                } else {
+		    $result.='<td>'.&mt("In Progress").'</td>'
+		}
 	    }
 	    $result.="<td>$title</td><td>$uname</td>";
-	    my $slot=$queue{$key}->[0];
-	    my %slot_data=&Apache::lonnet::get_slot($slot);
 	    $result.='<td>queue entry</td><td>Slot: '.$slot.' End time: '.
 		&Apache::lonlocal::locallocaltime($slot_data{'endtime'}).
 		"</td></tr>";
@@ -691,6 +756,37 @@ FORM
     return $result;
 }
 
+sub get_queue_counts {
+    my ($queue)=@_;
+    my $result;
+    my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
+    my $cnum=$env{'course.'.$cid.'.num'};
+    my $cdom=$env{'course.'.$cid.'.domain'};
+    my $regexp="^$symb\0";
+    my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
+    my ($tmp)=%queue;
+    if ($tmp=~/^error: 2 /) {
+	return (0,0,0);
+    }
+    my ($entries,$ready_to_grade,$locks)=(0,0,0);
+    foreach my $key (sort(keys(%queue))) {
+	if ($key=~/locked$/) {
+	    $locks++;
+	} elsif ($key=~/timestamp$/) {
+	    #ignore
+	} elsif ($key!~/(timestamp|locked)$/) {
+	    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'}) {
+		$ready_to_grade++;
+	    }
+	}
+    }
+    return ($entries,$ready_to_grade,$locks);
+}
+
 sub decode_queue_key {
     my ($key)=@_;
     my ($symb,undef,$user) = split("\0",$key);