--- loncom/homework/grades.pm	2004/05/25 05:27:09	1.203
+++ loncom/homework/grades.pm	2004/09/14 19:09:55	1.211
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.203 2004/05/25 05:27:09 albertel Exp $
+# $Id: grades.pm,v 1.211 2004/09/14 19:09:55 ng Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -167,6 +167,20 @@ sub response_type {
     return \@partlist,\%handgrade,\%responseType;
 }
 
+sub get_display_part {
+    my ($partID,$url,$symb)=@_;
+    if (!defined($symb) || $symb eq '') {
+	$symb=$ENV{'form.symb'};
+	if ($symb eq '') { $symb=&Apache::lonnet::symbread($url) }
+    }
+    my $display=&Apache::lonnet::EXT('resource.'.$partID.'.display',$symb);
+    if (defined($display) and $display ne '') {
+	$display.= " (<font color=\"#999900\">id $partID</font>)";
+    } else {
+	$display=$partID;
+    }
+    return $display;
+}
 #--- Show resource title
 #--- and parts and response type
 sub showResourceInfo {
@@ -194,7 +208,8 @@ sub showResourceInfo {
 	    }
 	    $partsseen{$partID}=1;
 	}
-	$result.='<td><b>Part </b>'.$partID.' <font color="#999999">'.
+	my $display_part=&get_display_part($partID,$url);
+	$result.='<td><b>Part: </b>'.$display_part.' <font color="#999999">'.
 	    $resID.'</font></td>'.
 	    '<td><b>Type: </b>'.$responsetype.'</td></tr>';
 #	    '<td><b>Handgrade: </b>'.$handgrade.'</td></tr>';
@@ -349,27 +364,36 @@ sub getclasslist {
     #
     my %sections;
     my %fullnames;
-    foreach (keys(%$classlist)) {
-        # the following undefs are for 'domain', and 'username' respectively.
-	my (undef,undef,$end,$start,$id,$section,$fullname,$status)=
-            @{$classlist->{$_}};
+    foreach my $student (keys(%$classlist)) {
+        my $end      = 
+            $classlist->{$student}->[&Apache::loncoursedata::CL_END()];
+        my $start    = 
+            $classlist->{$student}->[&Apache::loncoursedata::CL_START()];
+        my $id       = 
+            $classlist->{$student}->[&Apache::loncoursedata::CL_ID()];
+        my $section  = 
+            $classlist->{$student}->[&Apache::loncoursedata::CL_SECTION()];
+        my $fullname = 
+            $classlist->{$student}->[&Apache::loncoursedata::CL_FULLNAME()];
+        my $status   = 
+            $classlist->{$student}->[&Apache::loncoursedata::CL_STATUS()];
 	# filter students according to status selected
 	if ($filterlist && $ENV{'form.Status'} ne 'Any') {
 	    if ($ENV{'form.Status'} ne $status) {
-		delete ($classlist->{$_});
+		delete ($classlist->{$student});
 		next;
 	    }
 	}
-	$section = ($section ne '' ? $section : 'no');
+	$section = ($section ne '' ? $section : 'none');
 	if (&canview($section)) {
 	    if ($getsec eq 'all' || $getsec eq $section) {
 		$sections{$section}++;
-		$fullnames{$_}=$fullname;
+		$fullnames{$student}=$fullname;
 	    } else {
-		delete($classlist->{$_});
+		delete($classlist->{$student});
 	    }
 	} else {
-	    delete($classlist->{$_});
+	    delete($classlist->{$student});
 	}
     }
     my %seen = ();
@@ -682,7 +706,9 @@ LISTJAVASCRIPT
 	    '<td>'.&nameUserString('header').'</td>';
 	if ($ENV{'form.showgrading'} eq 'yes' && $submitonly ne 'all') {
 	    foreach (sort(@$partlist)) {
-		$gradeTable.='<td><b>&nbsp;Part '.(split(/_/))[0].' Status&nbsp;</b></td>';
+		my $display_part=&get_display_part((split(/_/))[0],$url,$symb);
+		$gradeTable.='<td><b>&nbsp;Part: '.$display_part.
+		    ' Status&nbsp;</b></td>';
 	    }
 	}
 	$loop++;
@@ -1084,7 +1110,7 @@ sub sub_page_kw_js {
     var ypos = (screen.height-height)/2-30;
     ypos = (ypos < 0) ? '0' : ypos;
 
-    pWin = window.open('', 'MessageCenter', 'toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=600,height='+height);
+    pWin = window.open('', 'MessageCenter', 'resizable=yes,toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=600,height='+height);
     pWin.focus();
     pDoc = pWin.document;
     pDoc.open('text/html','replace');
@@ -1215,7 +1241,7 @@ sub sub_page_kw_js {
     var ypos = (screen.height-330)/2-30;
     ypos = (ypos < 0) ? '0' : ypos;
 
-    hwdWin = window.open('', 'KeywordHighlightCentral', 'toolbar=no,location=no,scrollbars=no,width=400,height=300,screenx='+xpos+',screeny='+ypos);
+    hwdWin = window.open('', 'KeywordHighlightCentral', 'resizeable=yes,toolbar=no,location=no,scrollbars=no,width=400,height=300,screenx='+xpos+',screeny='+ypos);
     hwdWin.focus();
     var hDoc = hwdWin.document;
     hDoc.open('text/html','replace');
@@ -1289,8 +1315,9 @@ sub gradeBox {
 		  '' : $$record{'resource.'.$partid.'.awarded'}*$wgt);
     my $result='<input type="hidden" name="WGT'.$counter.'_'.$partid.'" value="'.$wgt.'" />'."\n";
 
+    my $display_part=&get_display_part($partid,undef,$symb);
     $result.='<table border="0"><tr><td>'.
-	'<b>Part </b>'.$partid.' <b>Points: </b></td><td>'."\n";
+	'<b>Part: </b>'.$display_part.' <b>Points: </b></td><td>'."\n";
 
     my $ctr = 0;
     $result.='<table border="0"><tr>'."\n";  # display radio buttons in a nice table 10 across
@@ -1622,11 +1649,12 @@ KEYWORDS
 	    my %seenparts;
 	    for my $part (sort keys(%$handgrade)) {
 		my ($partid,$respid) = split(/_/,$part);
+		my $display_part=&get_display_part($partid,$url,$symb);
 		if ($ENV{"form.$uname:$udom:$partid:submitted_by"}) {
 		    if (exists($seenparts{$partid})) { next; }
 		    $seenparts{$partid}=1;
-		    my $submitby='<b>Part '.$partid.
-			' Collaborative submission by: </b>'.
+		    my $submitby='<b>Part:</b> '.$display_part.
+			' <b>Collaborative submission by:</b> '.
 			'<a href="javascript:viewSubmitter(\''.
 			$ENV{"form.$uname:$udom:$partid:submitted_by"}.
 			'\')"; TARGET=_self>'.
@@ -1636,8 +1664,8 @@ KEYWORDS
 		}
 		my $responsetype = $responseType->{$partid}->{$respid};
 		if (!exists($record{"resource.$partid.$respid.submission"})) {
-		    $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.
-			$partid.'</b> <font color="#999999">( ID '.$respid.
+		    $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part:</b> '.
+			$display_part.' <font color="#999999">( ID '.$respid.
 			' )</font>&nbsp; &nbsp;'.
 			'<font color="red">Nothing submitted - no attempts</font><br /><br />';
 		    next;
@@ -1665,8 +1693,9 @@ KEYWORDS
 		    if ($ENV{'form.lastSub'} eq 'lastonly' || 
 			($ENV{'form.lastSub'} eq 'hdgrade' && 
 			 $$handgrade{$part} eq 'yes')) {
-			$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.
-			    $partid.'</b> <font color="#999999">( ID '.$respid.
+			my $display_part=&get_display_part($partid,$url,$symb);
+			$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part:</b> '.
+			    $display_part.' <font color="#999999">( ID '.$respid.
 			    ' )</font>&nbsp; &nbsp;';
 			if ($record{"resource.$partid.$respid.uploadedurl"}) {
 			    &Apache::lonnet::allowuploaded('/adm/grades',
@@ -2299,7 +2328,7 @@ sub viewgrades {
     my $sectionClass;
     if ($ENV{'form.section'} eq 'all') {
 	$sectionClass='Class </h3>';
-    } elsif ($ENV{'form.section'} eq 'no') {
+    } elsif ($ENV{'form.section'} eq 'none') {
 	$sectionClass='Students in no Section </h3>';
     } else {
 	$sectionClass='Students in Section '.$ENV{'form.section'}.'</h3>';
@@ -2326,7 +2355,8 @@ sub viewgrades {
 	    $ctsparts.'" value="'.$partid.'" />'."\n";
 	$result.='<input type="hidden" name="weight_'.
 	    $partid.'" value="'.$weight{$partid}.'" />'."\n";
-	$result.='<tr><td><b>Part  '.$partid.'&nbsp; &nbsp;Point:</b> </td><td>';
+	my $display_part=&get_display_part($partid,$url,$symb);
+	$result.='<tr><td><b>Part:</b> '.$display_part.'&nbsp; &nbsp;<b>Point:</b> </td><td>';
 	$result.='<table border="0"><tr>';  
 	my $ctr = 0;
 	while ($ctr<=$weight{$partid}) { # display radio buttons in a nice table 10 across
@@ -2365,14 +2395,17 @@ sub viewgrades {
 	my $display=&Apache::lonnet::metadata($url,$part.'.display');
 	$display =~ s|^Number of Attempts|Tries<br />|; # makes the column narrower
 	if  (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }
+	my ($partid) = &split_part_type($part);
+	my $display_part=&get_display_part($partid,$url,$symb);
 	if ($display =~ /^Partial Credit Factor/) {
-	    my ($partid) = &split_part_type($part);
-	    $result.='<td><b>Score Part '.$partid.'<br />(weight = '.
-		$weight{$partid}.')</b></td>'."\n";
+	    $result.='<td><b>Score Part:</b> '.$display_part.
+		' <br /><b>(weight = '.$weight{$partid}.')</b></td>'."\n";
 	    next;
+	} else {
+	    $display =~s/\[Part: \Q$partid\E\]/Part:<\/b> $display_part/;
 	}
 	$display =~ s|Problem Status|Grade Status<br />|;
-	$result.='<td><b>'.$display.'</b></td>'."\n";
+	$result.='<td><b>'.$display.'</td>'."\n";
     }
     $result.='</tr>';
 
@@ -2502,9 +2535,10 @@ sub editgrades {
 	}
     }
     foreach my $partid (@partid) {
+	my $display_part=&get_display_part($partid,$url,$symb);
 	$result .= '<td colspan="'.$columns{$partid}.
-	    '" align="center"><b>Part '.$partid.
-	    '</b> (Weight = '.$weight{$partid}.')</td>';
+	    '" align="center"><b>Part:</b> '.$display_part.
+	    ' (Weight = '.$weight{$partid}.')</td>';
 
     }
     $result .= '</tr><tr bgcolor="#deffff">';
@@ -2598,7 +2632,7 @@ sub editgrades {
     if ($noupdate) {
 #	my $numcols=(scalar(@partid)*(scalar(@parts)-1)*2)+3;
 	my $numcols=scalar(@partid)*4+2;
-	$result .= '<tr bgcolor="#ffffff"><td align="center" colspan="'.$numcols.'">No Changes Occurred For the Students Below</td></tr>'.$noupdate;
+	$result .= '<tr bgcolor="#ffffff"><td align="center" colspan="'.$numcols.'">No Changes Occurred For the Students Below</td></tr><tr bgcolor="#ffffde">'.$noupdate;
     }
     $result .= '</table></td></tr></table>'."\n".
 	&show_grading_menu_form ($symb,$url);
@@ -3213,13 +3247,14 @@ sub displaySubByDates {
 	foreach my $partid (@{$parts}) {
 	    my @matchKey = sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys);
 #	    next if ($$record{"$version:resource.$partid.solved"} eq '');
+	    my $display_part=&get_display_part($partid,undef,$symb);
 	    foreach my $matchKey (@matchKey) {
 		if (exists($$record{$version.':'.$matchKey}) &&
 		    $$record{$version.':'.$matchKey} ne '') {
 		    my ($responseId)=($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/);
-		    $displaySub[0].='<b>Part&nbsp;'.$partid.'&nbsp;';
+		    $displaySub[0].='<b>Part:</b>&nbsp;'.$display_part.'&nbsp;';
 		    $displaySub[0].='<font color="#999999">(ID&nbsp;'.
-			$responseId.')</font>&nbsp;';
+			$responseId.')</font>&nbsp;<b>';
 		    if ($$record{"$version:resource.$partid.tries"} eq '') {
 			$displaySub[0].='Trial&nbsp;not&nbsp;counted';
 		    } else {
@@ -3237,14 +3272,14 @@ sub displaySubByDates {
 		}
 	    }
 	    if (exists $$record{"$version:resource.$partid.award"}) {
-		$displaySub[1].='<b>Part&nbsp;'.$partid.'</b> &nbsp;'.
+		$displaySub[1].='<b>Part:</b>&nbsp;'.$display_part.' &nbsp;'.
 		    lc($$record{"$version:resource.$partid.award"}).' '.
 		    $mark{$$record{"$version:resource.$partid.solved"}}.
 		    '<br />';
 	    }
 	    if (exists $$record{"$version:resource.$partid.regrader"}) {
 		$displaySub[2].=$$record{"$version:resource.$partid.regrader"}.
-		    ' (<b>'.&mt('Part').':</b> '.$partid.')';
+		    ' (<b>'.&mt('Part').':</b> '.$display_part.')';
 	    }
 	}
 	# needed because old essay regrader has not parts info
@@ -3341,12 +3376,13 @@ sub updateGradeByPage {
 		    $changeflag++;
 		    $newpts = '';
 		}
-
+		my $display_part=&get_display_part($partid,undef,
+						   $curRes->symb());
 		my $oldstatus = $ENV{'form.solved'.$question.'_'.$partid};
-		$displayPts[0].='&nbsp;<b>Part</b> '.$partid.' = '.
+		$displayPts[0].='&nbsp;<b>Part:</b> '.$display_part.' = '.
 		    (($oldstatus eq 'excused') ? 'excused' : $oldpts).
 		    '&nbsp;<br>';
-		$displayPts[1].='&nbsp;<b>Part</b> '.$partid.' = '.
+		$displayPts[1].='&nbsp;<b>Part:</b> '.$display_part.' = '.
 		     (($score eq 'excused') ? 'excused' : $newpts).
 		    '&nbsp;<br>';
 
@@ -3436,10 +3472,11 @@ sub scantron_filenames {
 }
 
 sub scantron_uploads {
+    my ($file2grade) = @_;
     my $result=	'<select name="scantron_selectfile">';
     $result.="<option></option>";
     foreach my $filename (sort(&scantron_filenames())) {
-	$result.="<option>$filename</option>\n";
+	$result.="<option".($filename eq $file2grade ? ' selected="on"':'').">$filename</option>\n";
     }
     $result.="</select>";
     return $result;
@@ -3485,13 +3522,13 @@ sub scantron_CODEunique {
 }
 
 sub scantron_selectphase {
-    my ($r) = @_;
+    my ($r,$file2grade) = @_;
     my ($symb,$url)=&get_symb_and_url($r);
     if (!$symb) {return '';}
     my $sequence_selector=&getSequenceDropDown($r,$symb);
     my $default_form_data=&defaultFormData($symb,$url);
     my $grading_menu_button=&show_grading_menu_form($symb,$url);
-    my $file_selector=&scantron_uploads();
+    my $file_selector=&scantron_uploads($file2grade);
     my $format_selector=&scantron_scantab();
     my $CODE_selector=&scantron_CODElist();
     my $CODE_unique=&scantron_CODEunique();
@@ -4682,7 +4719,8 @@ sub scantron_upload_scantron_data_save {
 	}
 	return '';
     }
-    $r->print("Doing upload to ".$ENV{'form.courseid'}." <br />");
+    my %coursedata=&Apache::lonnet::coursedescription($ENV{'form.domainid'}.'_'.$ENV{'form.courseid'});
+    $r->print("Doing upload to ".$coursedata{'description'}." <br />");
     my $home=&Apache::lonnet::homeserver($ENV{'form.courseid'},
 					 $ENV{'form.domainid'});
     my $fname=$ENV{'form.upfile.filename'};
@@ -4699,6 +4737,7 @@ sub scantron_upload_scantron_data_save {
     $fname=~s/[^\w\.\-]//g;
     # See if there is anything left
     unless ($fname) { return 'error: no uploaded file'; }
+    my $uploadedfile=$fname;
     $fname='scantron_orig_'.$fname;
     if (length($ENV{'form.upfile'}) < 2) {
 	$r->print("<font color='red'>Error:</font> The file you attempted to upload, <tt>".&HTML::Entities::encode($ENV{'form.upfile.filename'},'<>&"')."</tt>, contained no information. Please check that you entered the correct filename.");
@@ -4707,11 +4746,11 @@ sub scantron_upload_scantron_data_save {
 	if ($result =~ m|^/uploaded/|) {
 	    $r->print("<font color='green'>Success:</font> Successfully uploaded ".(length($ENV{'form.upfile'})-1)." bytes of data into location <tt>".$result."</tt>");
 	} else {
-	    $r->print("<font color='red'>Error:</font> An error (".$result.") occured when attempting to upload the file, <tt>".&HTML::Entities::encode($ENV{'form.upfile.filename'},'<>&"')."</tt>");
+	    $r->print("<font color='red'>Error:</font> An error (".$result.") occurred when attempting to upload the file, <tt>".&HTML::Entities::encode($ENV{'form.upfile.filename'},'<>&"')."</tt>");
 	}
     }
     if ($symb) {
-	$r->print(&show_grading_menu_form($symb,$url));
+	$r->print(&scantron_selectphase($r,$uploadedfile));
     } else {
 	$r->print($doanotherupload);
     }
@@ -4876,9 +4915,6 @@ GRADINGMENUJS
 
     $result.=&mt('Student Status').':</b>'.&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,1,undef);
 
-    if (ref($sections) && (grep /no/,@$sections)) {
-	$result.='&nbsp;(Section "no" implies the students were not assigned a section.)<br />';
-    }
     $result.='</td></tr>';
 
     $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.