--- loncom/homework/bridgetask.pm	2007/04/07 00:12:43	1.231
+++ loncom/homework/bridgetask.pm	2007/08/09 01:05:15	1.238
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: bridgetask.pm,v 1.231 2007/04/07 00:12:43 albertel Exp $
+# $Id: bridgetask.pm,v 1.238 2007/08/09 01:05:15 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -244,11 +244,20 @@ 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'})) {
+    my $see_all = &Apache::lonnet::allowed('mgq',$env{'request.course.id'});
+    my $see_sec = &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.
+					   '/'.$env{'request.course.sec'});
+
+    if ($see_all || $see_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>'.
-	    "\n\t\t\t".'<td rowspan="4">'.$sec_select."\n\t\t\t".'</td>';
+	if ($see_all || (!&section_restricted())) {
+	    $result.="\n\t\t\t".'<td rowspan="4">Specify a section: </td>'.
+		"\n\t\t\t".'<td rowspan="4">'.$sec_select."\n\t\t\t".'</td>';
+	} else {
+	    $result.="\n\t\t\t".'<td rowspan="4">Grading section: </td>'.
+		"\n\t\t\t".'<td rowspan="4">'.$env{'request.course.sec'}."\n\t\t\t".'</td>';
+	}
 	$result.="\n\t\t\t".'<td>'.'<input type="submit" name="reviewagrading" value="'.
 	    &mt("Select an entry from the grading queue:").'" /> ';
 
@@ -610,7 +619,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,12 +630,14 @@ sub start_Task {
 		my $target_id = 
 		    &Apache::lonstathelpers::make_target_id({symb => $symb,
 							     part => '0'});
-		$result.='<form method="post" name="gradingstatus" action="/adm/statistics">'.
-		    '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.
-		    '<input type="hidden" name="reportSelected" value="grading_analysis" />'.
-		    '<input type="submit" name="grading" value="'.
-		    &mt('Show Grading Status').'" />'.
-		    '</form>';
+		if (!&section_restricted()) {
+		    $result.='<form method="post" name="gradingstatus" action="/adm/statistics">'.
+			'<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.
+			'<input type="hidden" name="reportSelected" value="grading_analysis" />'.
+			'<input type="submit" name="grading" value="'.
+			&mt('Show Grading Status').'" />'.
+			'</form>';
+		}
 	    }
 	}
     }
@@ -804,9 +816,8 @@ sub start_Task {
 		$result.='<input type="hidden" name="regrade" value="'.
 		    $env{'form.regrade'}.'" />';
 	    }
-	    if ($env{'form.chosensections'}) {
-		my @chosen_sections=
-		    &Apache::loncommon::get_env_multiple('form.chosensections');
+	    if ($env{'form.chosensections'} || &section_restricted()) {
+		my @chosen_sections = &get_allowed_sections();
 		foreach my $sec (@chosen_sections) {
 		    $result.='<input type="hidden" name="chosensections" 
                                value="'.$sec.'" />';
@@ -902,7 +913,14 @@ sub get_key_todo {
 	my $cdom  = $env{'course.'.$cid.'.domain'};
 	my $uname = &LONCAPA::clean_username($env{'form.gradinguser'});
 	my $udom  = &LONCAPA::clean_domain($env{'form.gradingdomain'});
-
+	
+	if (&section_restricted()) {
+	    my $classlist=&get_limited_classlist();
+	    if (!&allow_grade_user($classlist->{$uname.':'.$udom})) {
+		return (undef,'not_allowed',
+			&mt('Requested student ([_1]) is in a section you aren\'t allowed to grade.',$uname.':'.$udom));
+	    }
+	}
 	my $gradingkey=&encode_queue_key($symb,$udom,$uname);
 
 	my $queue;
@@ -1064,7 +1082,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>';
@@ -1518,11 +1536,11 @@ sub get_limited_classlist {
        	}
     }
 
-    if (ref($sections) && !grep('all',@{ $sections })) {
+    if (ref($sections) && !grep {$_ eq 'all'} (@{ $sections })) {
 	foreach my $student (keys(%$classlist)) {
 	    my $section  = 
 		$classlist->{$student}[&Apache::loncoursedata::CL_SECTION()];
-	    if (! grep($section,@{ $sections })) {
+	    if (! grep {$_ eq $section} (@{ $sections })) {
 		delete($classlist->{$student});
 	    }
 	}
@@ -1538,8 +1556,7 @@ sub show_queue {
     my $cnum=$env{'course.'.$cid.'.num'};
     my $cdom=$env{'course.'.$cid.'.domain'};
 
-    my @chosen_sections=
-	&Apache::loncommon::get_env_multiple('form.chosensections');
+    my @chosen_sections = &get_allowed_sections();
 
     my $classlist = &get_limited_classlist(\@chosen_sections);
 
@@ -1559,19 +1576,24 @@ 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>"; }
@@ -1579,7 +1601,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 (!&allow_grade_user($classlist->{$uname.':'.$udom}));
 	
 	my $section = $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()];
 
@@ -1665,6 +1688,35 @@ FORM
     return $result;
 }
 
+sub get_allowed_sections {
+    my @chosen_sections;
+    if (&section_restricted()) {
+	@chosen_sections = ($env{'request.course.sec'});
+    } else {
+	@chosen_sections =
+	    &Apache::loncommon::get_env_multiple('form.chosensections');
+    }
+
+    return @chosen_sections;
+}
+
+sub section_restricted {
+    my $cid =(&Apache::lonnet::whichuser())[1];
+    return (lc($env{'course.'.$cid.'.task_grading'}) eq 'section'
+	    && $env{'request.course.sec'} ne '' );
+}
+
+sub allow_grade_user {
+    my ($classlist_entry) = @_;
+
+    if (&section_restricted()
+	&& $env{'request.course.sec'} ne
+	      $classlist_entry->[&Apache::loncoursedata::CL_SECTION()]) {
+	return 0;
+    }
+    return 1;
+}
+
 sub get_queue_counts {
     my ($queue)=@_;
     my $result;
@@ -1680,11 +1732,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 (!&allow_grade_user($classlist->{$uname.':'.$udom}));
+
 	if ($key=~/locked$/) {
 	    $locks++;
 	} elsif ($key=~/timestamp$/) {
@@ -1761,7 +1816,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 (!&allow_grade_user($classlist->{$uname.':'.$udom}));
 
 	if ($check_section) {
 	    my $section =
@@ -1870,7 +1926,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'};
     }
@@ -1886,6 +1942,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 (!&allow_grade_user($classlist->{$uname.':'.$udom}));
 	push(@users,"$uname:$udom");
     }
     return @users;
@@ -1972,9 +2029,7 @@ sub get_from_queue {
 sub select_user {
     my ($symb,$cid)=&Apache::lonnet::whichuser();
 
-    my @chosen_sections=
-	&Apache::loncommon::get_env_multiple('form.chosensections');
-
+    my @chosen_sections = &get_allowed_sections();
     my $classlist = &get_limited_classlist(\@chosen_sections);
     
     my $result;
@@ -2027,7 +2082,7 @@ sub select_user {
       <input type="submit" name="submit" value="Regrade" />
       $seclist
     </form>
-  <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt></td>
+  <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt> Sec: $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()]</td>
   <td>
 RESULT
         }
@@ -2134,9 +2189,7 @@ sub get_dim_id {
 
 sub get_id {
     my ($parstack,$safeeval)=@_;
-    my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval);
-    if (!$id) { $id=$Apache::lonxml::curdepth; }
-    return $id;
+    return &Apache::lonxml::get_id($parstack,$safeeval);
 }
 
 sub start_Setup {
@@ -2224,8 +2277,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).
@@ -2689,7 +2742,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);
@@ -2867,8 +2921,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();