--- loncom/homework/bridgetask.pm	2005/05/27 21:13:46	1.33
+++ loncom/homework/bridgetask.pm	2005/09/07 22:20:33	1.44
@@ -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.44 2005/09/07 22:20:33 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); }
@@ -144,21 +147,46 @@ sub add_grading_button {
     my $result=' <input type="submit" name="gradeasubmission" value="'.
 	&mt("Get a submission to grade").'" />';
     $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";
+    if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
+	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 +222,15 @@ 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();
+	    if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
+		$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 +261,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);
@@ -245,22 +283,14 @@ sub start_Task {
 		}
 	    } elsif ($target eq 'grade' && !$env{'form.webgrade'}) {
 		if ($status eq 'NEEDS_CHECKIN') {
-		    if (&proctor_check_auth($slot_name,$slot)) {
-			#FIXME immeadiatly add this to the grading queue
-                        #      with slot->{'endtime'} for when grading can 
-                        #      begin on this resource
-			# FIXME I think the above is done by default,
-                        #        need to check that
-                        #        failure doesn't do this.
- 		    }
+		    &proctor_check_auth($slot_name,$slot);
 		}
 	    }
 	} 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 +301,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') {
@@ -497,7 +531,6 @@ sub end_Task {
 		}
 	    } elsif ($ungraded) {
 		$Apache::lonhomework::results{"resource.$version.status"}='ungraded';
-		# FIXME if in review queue need to move back to grading queue
 		if ($env{'form.queue'} eq 'reviewqueue') {
 		    &Apache::lonxml::debug("moving back.");
 		    &move_between_queues('reviewqueue','gradingqueue');
@@ -509,13 +542,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 +706,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 +719,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 +732,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 +747,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);
@@ -949,7 +1036,7 @@ sub get_instance {
 		$result.='<tr><td colspan="4">';
 		my (undef,undef,$udom,$uname) = &Apache::lonxml::whichuser();
 		my $file_url = '/uploaded/'.$udom.'/'.$uname.'/portfolio';
-		foreach my $partial_file (split(',',$Apache::lonhomework::history{"resource.$version.bridgetask.portfiles"})) {
+		foreach my $partial_file (split(',',$Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"})) {
 		    my $file=$file_url.$partial_file;
 		    &Apache::lonnet::allowuploaded('/adm/bridgetask',$file);
 		    $result.='<a href="'.$file.'" target="lonGRDs"><img src="'.
@@ -1083,7 +1170,8 @@ sub proctor_validation_screen {
     my ($slot) = @_;
     my (undef,undef,$domain,$user) = &Apache::lonxml::whichuser();
     my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');
-    $user=$env{'form.proctorname'};
+    my $name=&Apache::loncommon::plainname($user,$domain);
+    
     if ($env{'form.proctordomain'}) { $domain=$env{'form.proctordomain'}; }
     my $msg;
     if ($env{'form.proctorpassword'}) {
@@ -1098,13 +1186,22 @@ sub proctor_validation_screen {
 <input type="hidden" name="validate" value="yes" />
 <input type="hidden" name="submitted" value="yes" />
 <table>
-  <tr><td>Proctor's Username:</td><td><input type="string" name="proctorname" value="$user" /></td></tr>
+  <tr><td>Proctor's Username:</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" /></td></tr>
   <tr><td>Password:</td><td><input type="password" name="proctorpassword" value="" /></td></tr>
   <tr><td>Proctor's Domain:</td><td><input type="string" name="proctordomain" value="$domain" /></td></tr>
 </table>
 <input type="submit" name="checkoutbutton" value="Validate"  /><br />
-Student who should be logged in is:<br />
-<img src="$url" /><br />
+<table border="1">
+  <tr><td>
+    <table>
+      <tr><td colspan="2">Student who should be logged in is:</td></tr>
+      <tr><td>Name:</td><td>$name</td></tr>
+      <tr><td>Studnet ID:</td><td>$env{'environment.id'}</td></tr>
+      <tr><td>Usename</td><td>$user\@$domain</td></tr>
+      <tr><td colspan="2"><img src="$url" /></td></tr>
+    </table>
+  </tr></td>
+</table>
 </form>
 ENDCHECKOUT
     return $result;