--- loncom/homework/bridgetask.pm	2007/02/23 17:14:20	1.228
+++ loncom/homework/bridgetask.pm	2007/08/02 00:42:35	1.235
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: bridgetask.pm,v 1.228 2007/02/23 17:14:20 albertel Exp $
+# $Id: bridgetask.pm,v 1.235 2007/08/02 00:42:35 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -38,7 +38,6 @@ use Apache::lonlocal;
 use Apache::lonxml;
 use Apache::slotrequest();
 use Time::HiRes qw( gettimeofday tv_interval );
-use lib '/home/httpd/lib/perl/';
 use LONCAPA;
  
 
@@ -245,7 +244,9 @@ sub add_grading_button {
     my $result="\n\t".'<input type="submit" name="gradeasubmission" value="'.
 	&mt("Get a submission to grade").'" />';
     $result.="\n\t".'<input type="hidden" name="grade_target" value="webgrade" />';
-    if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
+    if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})
+	|| &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})
+	) {
 	my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');
 	$result.="\n\t".'<table>'."\n\t\t".'<tr>';
 	$result.="\n\t\t\t".'<td rowspan="4">Specify a section: </td>'.
@@ -488,6 +489,7 @@ sub webgrade_standard_info {
 	    'stop'   => 'Quit Grading',
 	    'fail'   => 'Fail Rest',
 	    'cancel' => 'Cancel',
+	    'submit' => 'Submit Grades',
 	    );
     %lt=&Apache::lonlocal::texthash(%lt);
 
@@ -495,26 +497,35 @@ sub webgrade_standard_info {
   <div class="LC_GRADING_maincontrols">
 INFO
 
-    if (&grade_mode() eq 'regrade') {
+    if ($env{'request.state'} eq 'construct') {
 	$result.=<<INFO;
+    <input type="submit" name="next" value="$lt{'submit'}" />
+INFO
+    } else {
+	if (&grade_mode() eq 'regrade' && $env{'request.state'} ne 'construct') {
+	    $result.=<<INFO;
     <input type="submit" name="cancel" value="$lt{'cancel'}" />
 INFO
-    }
+        }
 
-    $result.=<<INFO;
+	$result.=<<INFO;
     <input type="submit" name="next" value="$lt{'done'}" />
     <input type="submit" name="stop" value="$lt{'stop'}" />
+INFO
+    }
+    $result.=<<INFO;
     <input type="button" name="fail" value="$lt{'fail'}" 
            onclick="javascript:onFailRest()" />
   </div>
   $file_list
 INFO
     return $result;
+
 }
 
 sub done_screen {
     my ($version) = @_;
-    my $title=&Apache::lonnet::gettitle();
+    my $title=&Apache::lonnet::gettitle($env{'request.uri'});
     my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});
     my (undef,undef,$domain,$user)= &Apache::lonnet::whichuser();
     my $files = '<ul>';
@@ -601,7 +612,8 @@ sub start_Task {
 	    if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
 	    $result.=$uri.'">'.&add_grading_button()."</form>\n";
 	    my $symb=&Apache::lonnet::symbread();
-	    if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
+	    if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})
+		|| &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
 		$result.='<form method="post" name="slotrequest" action="/adm/slotrequest">'.
 		    '<input type="hidden" name="symb" value="'.$symb.'" />'.
 		    '<input type="hidden" name="command" value="showslots" />'.
@@ -620,7 +632,7 @@ sub start_Task {
 	    }
 	}
     }
-    if ($target eq 'web' && $env{'request.state'} eq 'construct') {
+    if ($target =~/(web|webgrade)/ && $env{'request.state'} eq 'construct') {
 	$form_tag_start.=&Apache::structuretags::problem_web_to_edit_header($env{'form.rndseed'});
     }
     if ($target eq 'web' 
@@ -724,8 +736,12 @@ sub start_Task {
 	if ($todo) {
 	    &setup_env_for_other_user($todo,$safeeval);
 	    my ($symb,$uname,$udom)=&decode_queue_key($todo);
-	    $result.="\n".'<table><tr><td>Found '.
-		&Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>';
+	    if ($env{'request.state'} eq 'construct') {
+		$symb = $env{'request.uri'};
+	    }
+	    $result.="\n".'<p>'.
+		&mt('Grading [_1] for [_2] at [_3]',
+		    &Apache::lonnet::gettitle($symb),$uname,$udom).'</p>';
 	    $form_tag_start.=
 		'<input type="hidden" name="gradingkey" value="'.
 		&escape($todo).'" />';
@@ -800,6 +816,12 @@ sub start_Task {
 		}
 	    }
 	    if ($webgrade eq 'yes') { $result.=&webgrade_standard_info(); }
+	} elsif ($target eq 'webgrade' 
+		 && $env{'request.state'} eq 'construct') {
+	    $result.=$form_tag_start;
+	    $result.='<input type="hidden" name="webgrade" value="'.
+		$webgrade.'" />';
+	    $result.=&webgrade_standard_info();
 	}
 	if ($target eq 'webgrade') {
 	    $result.="\n".'<div id="LC_GRADING_criterialist">';
@@ -847,6 +869,12 @@ sub get_key_todo {
     my ($target)=@_;
     my $todo;
 
+    if ($env{'request.state'} eq 'construct') {
+	my ($symb,$cid,$udom,$uname) = &Apache::lonnet::whichuser();
+	my $gradingkey=&encode_queue_key($symb,$udom,$uname);
+	return ($gradingkey);
+    }
+
     if (defined($env{'form.reviewasubmission'})) {
 	&Apache::lonxml::debug("review a submission....");
 	$env{'form.queue'}='reviewqueue';
@@ -1039,7 +1067,7 @@ sub end_Task {
 		}
 		if (!$previous && $status ne 'SHOW_ANSWER' &&
 		    &show_task($status,$previous)) {
-		    $result.=&Apache::inputtags::gradestatus('0');
+		    $result.=&Apache::inputtags::gradestatus('0',$target,1);
 		}
 		
 		$result.='</form>';
@@ -1057,8 +1085,7 @@ DONEBUTTON
 		if (&show_task($status,$previous) &&
 		    $Apache::lonhomework::history{"resource.$version.0.status"} =~ /^(pass|fail)$/) {
 		    my $bt_status=$Apache::lonhomework::history{"resource.$version.0.status"};
-		    my $title=&Apache::lonnet::gettitle();
-
+		    my $title=&Apache::lonnet::gettitle($env{'request.uri'});
 		    my $start_time;
 
 		    my $slot_name=
@@ -1535,19 +1562,25 @@ sub show_queue {
 	}
     }
 
+    $result .= 
+	'<p><a href="/adm/flip?postdata=return:">'.
+	&mt('Return to resource').'</a></p><hr />'.
+	"\n<h3>Current Queue - $queue</h3>";
     my $regexp="^$symb\0";
     my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
     my ($tmp)=%queue;
     if ($tmp=~/^error: 2 /) {
-	return "\n<h3>Current Queue - $queue</h3>".
+	$result.=
+	    
 	    &Apache::loncommon::start_data_table().
 	    &Apache::loncommon::start_data_table_row().
 	    '<td>'.&mt('Empty').'</td>'.
 	    &Apache::loncommon::end_data_table_row().
 	    &Apache::loncommon::end_data_table();
+	return $result;
     }
     my $title=&Apache::lonnet::gettitle($symb);
-    $result.="\n<h3>Current Queue - $title $queue </h3>".
+    $result.=
 	&Apache::loncommon::start_data_table().
 	&Apache::loncommon::start_data_table_header_row();
     if ($with_selects) { $result.="<th>Status</th><th></th>"; }
@@ -1555,7 +1588,8 @@ sub show_queue {
 	&Apache::loncommon::end_data_table_header_row();
     foreach my $key (sort(keys(%queue))) {
 	my ($symb,$uname,$udom) = &decode_queue_key($key);
-	if (!defined($classlist->{$uname.':'.$udom})) { next; }
+	next if (!defined($classlist->{$uname.':'.$udom}));
+	next if (&section_restricted($classlist->{$uname.':'.$udom}));
 	
 	my $section = $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()];
 
@@ -1641,6 +1675,18 @@ FORM
     return $result;
 }
 
+sub section_restricted {
+    my ($classlist_entry) = @_;
+    my $cid =(&Apache::lonnet::whichuser())[1];
+    if (lc($env{'course.'.$cid.'.task_grading'}) eq 'section'
+	&& $env{'request.course.sec'}
+	&& $env{'request.course.sec'} ne
+	      $classlist_entry->[&Apache::loncoursedata::CL_SECTION()]) {
+	return 1;
+    }
+    return 0;
+}
+
 sub get_queue_counts {
     my ($queue)=@_;
     my $result;
@@ -1656,11 +1702,14 @@ sub get_queue_counts {
     if ($tmp=~/^error: 2 /) {
 	return (0,0,0);
     }
+
     my ($entries,$ready_to_grade,$locks)=(0,0,0);
     my %slot_cache;
     foreach my $key (sort(keys(%queue))) {
 	my ($symb,$uname,$udom) = &decode_queue_key($key);
-	if (!defined($classlist->{$uname.':'.$udom})) { next; }
+	next if (!defined($classlist->{$uname.':'.$udom}));
+	next if (&section_restricted($classlist->{$uname.':'.$udom}));
+
 	if ($key=~/locked$/) {
 	    $locks++;
 	} elsif ($key=~/timestamp$/) {
@@ -1737,7 +1786,8 @@ sub pick_from_queue_data {
 	if ($key =~ /\0timestamp$/) { next; }
 
 	my ($symb,$uname,$udom)=&decode_queue_key($key);
-	if (!defined($classlist->{$uname.':'.$udom})) { next; }
+	next if (!defined($classlist->{$uname.':'.$udom}));
+	next if (&section_restricted($classlist->{$uname.':'.$udom}));
 
 	if ($check_section) {
 	    my $section =
@@ -1846,7 +1896,7 @@ sub lock_key {
 sub get_queue_symb_status {
     my ($queue,$symb,$cdom,$cnum) = @_;
     if (!defined($cdom) || !defined($cnum)) {
-	my (undef,$cid)=&Apache::lonnet::whichuser();
+	my (undef,$cid) =&Apache::lonnet::whichuser();
 	$cnum=$env{'course.'.$cid.'.num'};
 	$cdom=$env{'course.'.$cid.'.domain'};
     }
@@ -1862,6 +1912,7 @@ sub get_queue_symb_status {
 	next if ($key=~/timestamp$/);
 	my ($symb,$uname,$udom) = &decode_queue_key($key);
 	next if (!defined($classlist->{$uname.':'.$udom}));
+	next if (&section_restricted($classlist->{$uname.':'.$udom}));
 	push(@users,"$uname:$udom");
     }
     return @users;
@@ -2200,8 +2251,8 @@ sub start_Dimension {
 	$result.=  
 	    &Apache::edit::text_arg('Id:','id',$token,10).' '.
 	    &Apache::edit::select_arg('Passing is Mandatory:','Mandatory',
-				      [['yes', 'Yes'],
-				       ['no','No'],],
+				      [['Y', 'Yes'],
+				       ['N','No'],],
 				      $token).' <br /> '.
 	    &Apache::edit::text_arg('Required number of passed optional elements to pass the '.$token->[1].':',
 				    'OptionalRequired',$token,4).
@@ -2665,7 +2716,8 @@ sub end_Setup {
 
 sub grading_history {
     my ($version,$dim,$id) = @_;
-    if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
+    if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})
+	&& !&Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
 	return '';
     }
     my ($result,$grader);
@@ -2843,8 +2895,8 @@ sub start_Criteria {
 	$result.=  
 	    &Apache::edit::text_arg('Id:','id',$token,10).' '.
 	    &Apache::edit::select_arg('Passing is Mandatory:','Mandatory',
-				      [['yes', 'Yes'],
-				       ['no','No'],],
+				      [['Y', 'Yes'],
+				       ['N','No'],],
 				      $token)
 	    .' <br /> '.&Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row();
@@ -3015,19 +3067,43 @@ sub proctor_validation_screen {
     my ($slot) = @_;
     my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser();
     my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');
+    if ($url ne '/adm/lonKaputt/lonlogo_broken.gif') {
+	$url = "<tr><td colspan=\"2\"><img src=\"$url\" /></td></tr>";
+    } else {
+	undef($url);
+    }
+
     my $name=&Apache::loncommon::plainname($user,$domain);
     
     my $msg;
     if ($env{'form.proctorpassword'}) {
-	$msg='<p><font color="red">'.&mt("Failed to authenticate the proctor.")
-	    .'</font></p>';
+	$msg.='<p><span class="LC_warning">'
+	    .&mt("Failed to authenticate the proctor.")
+	    .'</span></p>';
+    }
+
+    my $valid;
+    my @possible_proctors=split(",",$slot->{'proctor'});
+    foreach my $proctor (@possible_proctors) {
+	if ($proctor =~ /$LONCAPA::username_re:$LONCAPA::domain_re/) {
+	    $valid = 1;
+	    last;
+	}
     }
+    if (!$valid) {
+	$msg.='<p><span class="LC_error">'
+	    .&mt("No valid poctors are defined.")
+	    .'</span></p>';
+    }
+    
     if (!$env{'form.proctordomain'}) { $env{'form.proctordomain'}=$domain; }
+    my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
+    $uri = &HTML::Entities::encode($uri,'<>&"');
     my $result= (<<ENDCHECKOUT);
 <h2>Proctor Validation</h2>
     <p>Your room's proctor needs to validate your access to this resource.</p>
     $msg
-<form name="checkout" method="post" action="$env{'request.uri'}">
+<form name="checkout" method="post" action="$uri">
 <input type="hidden" name="validate" value="yes" />
 <input type="hidden" name="submitted" value="yes" />
 <table>
@@ -3043,7 +3119,7 @@ sub proctor_validation_screen {
       <tr><td>Name:</td><td>$name</td></tr>
       <tr><td>Student 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>
+      $url
     </table>
   </tr></td>
 </table>