--- loncom/homework/grades.pm 2003/07/28 18:04:39 1.126 +++ loncom/homework/grades.pm 2003/08/07 14:33:15 1.131 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.126 2003/07/28 18:04:39 ng Exp $ +# $Id: grades.pm,v 1.131 2003/08/07 14:33:15 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -96,6 +96,18 @@ sub get_fullname { return $fullname; } +#--- Format fullname, username:domain if different for display +#--- Use anywhere where the student names are listed +sub nameUserString { + my ($type,$fullname,$uname,$udom) = @_; + if ($type eq 'header') { + return '<b> Fullname </b><font color="#999999">(Username)</font> '; + } else { + return ' '.$fullname.'<font color="#999999"> ('.$uname. + ($ENV{'user.domain'} eq $udom ? '' : ' ('.$udom.')').')</font>'; + } +} + #--- Get the partlist and the response type for a given problem. --- #--- Indicate if a response type is coded handgraded or not. --- sub response_type { @@ -109,9 +121,8 @@ sub response_type { my ($responsetype,$part) = split(/_/,$_,2); my ($partid,$respid) = split(/_/,$part); $responsetype =~ s/response$//; # make it compatible w/ navmaps - should move to that!! -# my ($value) = &Apache::lonnet::EXT('resource.'.$part.'.handgrade',$symb); -# $handgrade{$part} = $responsetype.':'.($value eq 'yes' ? 'yes' : 'no'); #a bug $value is 'yes' regardless - $handgrade{$part} = $responsetype.':'.(($allkeys =~ /parameter_$part\_handgrade/) ? 'yes' : 'no'); + my ($value) = &Apache::lonnet::EXT('resource.'.$part.'.handgrade',$symb); + $handgrade{$part} = $responsetype.':'.($value eq 'yes' ? 'yes' : 'no'); next if ($seen{$partid} > 0); $seen{$partid}++; push @partlist,$partid; @@ -299,7 +310,7 @@ sub student_gradeStatus { my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); my %partstatus = (); foreach (@$partlist) { - my ($status,$foo) = split(/_/,$record{"resource.$_.solved"},2); + my ($status,undef) = split(/_/,$record{"resource.$_.solved"},2); $status = 'nothing' if ($status eq ''); $partstatus{$_} = $status; my $subkey = "resource.$_.submitted_by"; @@ -540,8 +551,7 @@ LISTJAVASCRIPT my $loop = 0; while ($loop < 2) { $gradeTable.='<td><b> No.</b> </td><td><b> Select </b></td>'. - '<td><b> Fullname </b>'. - '<font color="#999999">(Username)</font> </td>'; + '<td>'.&nameUserString('header').'</td>'; if ($ENV{'form.showgrading'} eq 'yes' && $submitonly ne 'all') { foreach (sort(@$partlist)) { $gradeTable.='<td><b> Part '.(split(/_/))[0].' Status </b></td>'; @@ -578,8 +588,7 @@ LISTJAVASCRIPT $gradeTable.='<td align="right">'.$ctr.' </td>'. '<td align="center"><input type=checkbox name="stuinfo" value="'. $student.':'.$$fullname{$student}.' "></td>'."\n". - '<td> '.$$fullname{$student}.' '."\n". - '<font color="#999999">('.$uname.')</font></td>'."\n"; + '<td>'.&nameUserString(undef,$$fullname{$student},$uname,$udom).'</td>'."\n"; if ($ENV{'form.showgrading'} eq 'yes' && $submitonly ne 'all') { foreach (sort keys(%status)) { @@ -755,12 +764,13 @@ sub sub_page_js { for (i=0;i<=total;i++) { for (j=0;j<parttot;j++) { var partid = formname["partid"+i+"_"+j].value; - var selopt = formname["GD_SEL"+i+"_"+partid]; - if (selopt[0].selected) { + if (formname["GD_SEL"+i+"_"+partid][0].selected) { var points = formname["GD_BOX"+i+"_"+partid].value; if (points == "") { var name = formname["name"+i].value; - var resp = confirm("You did not assign a score for "+name+", part "+partid+". Continue?"); + var studentID = (name != '' ? name : formname["unamedom"+i].value); + var resp = confirm("You did not assign a score for "+studentID+ + ", part "+partid+". Continue?"); if (resp == false) { formname["GD_BOX"+i+"_"+partid].focus(); return false; @@ -788,8 +798,7 @@ sub sub_page_js { var ptr = 0; for (i=1;i<total;i++) { var partid = formname["q_"+i].value; - var selopt = formname["GD_SEL"+i+"_"+partid]; - if (selopt[0].selected) { + if (formname["GD_SEL"+i+"_"+partid][0].selected) { var points = formname["GD_BOX"+i+"_"+partid].value; var status = formname["solved"+i+"_"+partid].value; if (points == "" && status != "correct_by_student") { @@ -837,8 +846,8 @@ sub sub_page_kw_js { if (nret==null) return; formname.keywords.value = nret; - formname.refresh.value = "on"; if (formname.keywords.value != "") { + formname.refresh.value = "on"; formname.submit(); } return; @@ -865,10 +874,9 @@ sub sub_page_kw_js { } var nret = prompt("Add selection to keyword list? Edit if desired.",cleantxt); if (nret==null) return; - var curlist = document.SCORE.keywords.value; - document.SCORE.keywords.value = curlist+" "+nret; - document.SCORE.refresh.value = "on"; + document.SCORE.keywords.value = document.SCORE.keywords.value+" "+nret; if (document.SCORE.keywords.value != "") { + document.SCORE.refresh.value = "on"; document.SCORE.submit(); } return; @@ -885,8 +893,7 @@ sub sub_page_kw_js { var Nmsg = msgform.savemsgN.value; savedMsgHeader(Nmsg,usrctr,fullname); var subject = msgform.msgsub.value; - var rtrchk = document.SCORE["includemsg"+usrctr]; - var msgchk = rtrchk.value; + var msgchk = document.SCORE["includemsg"+usrctr].value; re = /msgsub/; var shwsel = ""; if (re.test(msgchk)) { shwsel = "checked" } @@ -934,7 +941,6 @@ sub sub_page_kw_js { height = 600; scrollbar = "yes"; } -// if (window.pWin) {window.pWin.close(); window.pWin=null} var xpos = (screen.width-600)/2; xpos = (xpos < 0) ? '0' : xpos; var ypos = (screen.height-height)/2-30; @@ -943,6 +949,7 @@ sub sub_page_kw_js { pWin = window.open('', 'MessageCenter', 'toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=600,height='+height); pWin.focus(); pDoc = pWin.document; + pDoc.open('text/html','replace'); pDoc.write("<html><head>"); pDoc.write("<title>Message Central</title>"); @@ -1029,6 +1036,7 @@ sub sub_page_kw_js { pDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onClick=\\"self.close()\\"><br><br>"); pDoc.write("</form>"); pDoc.write("</body></html>"); + pDoc.close(); } //====================== Script for keyword highlight options ============== @@ -1072,6 +1080,7 @@ sub sub_page_kw_js { hwdWin = window.open('', 'KeywordHighlightCentral', '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'); hDoc.write("<html><head>"); hDoc.write("<title>Highlight Central</title>"); @@ -1120,6 +1129,7 @@ sub sub_page_kw_js { hDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onClick=\\"self.close()\\"><br><br>"); hDoc.write("</form>"); hDoc.write("</body></html>"); + hDoc.close(); } </script> @@ -1353,9 +1363,7 @@ KEYWORDS my $result='<table border="0" width=100%><tr><td bgcolor="#777777">'."\n". '<table border="0" width=100%><tr bgcolor="#edffff"><td>'."\n"; - $result.='<b>Fullname: </b>'.$ENV{'form.fullname'}. - '<font color="#999999"> Username: '.$uname. - ($ENV{'user.domain'} eq $udom ? '' : ' ('.$udom.')').'</font><br />'."\n"; + $result.='<b>Fullname: </b>'.&nameUserString(undef,$ENV{'form.fullname'},$uname,$udom).'<br />'."\n"; $result.='<input type="hidden" name="name'.$counter. '" value="'.$ENV{'form.fullname'}.'" />'."\n"; @@ -1533,17 +1541,21 @@ KEYWORDS my %seen = (); my @partlist; + my @gradePartRespid; for (sort keys(%$handgrade)) { my ($partid,$respid) = split(/_/); next if ($seen{$partid} > 0); $seen{$partid}++; next if ($$handgrade{$_} =~ /:no$/ && $ENV{'form.lastSub'} =~ /^(hdgrade)$/); push @partlist,$partid; + push @gradePartRespid,$partid.'.'.$respid; $request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record)); } $result='<input type="hidden" name="partlist'.$counter. '" value="'.(join ":",@partlist).'" />'."\n"; + $result.='<input type="hidden" name="gradePartRespid'. + '" value="'.(join ":",@gradePartRespid).'" />'."\n" if ($counter == 0); my $ctr = 0; while ($ctr < scalar(@partlist)) { $result.='<input type="hidden" name="partid'.$counter.'_'.$ctr.'" value="'. @@ -1769,21 +1781,19 @@ sub processHandGrade { } } $ctr = 0; - my ($partlist,$handgrade) = &response_type($ENV{'form.url'},$symb); @parsedlist = reverse @parsedlist if ($button eq 'Previous'); foreach my $student (@parsedlist) { my ($uname,$udom) = split(/:/,$student); if ($ENV{'form.submitonly'} eq 'yes') { - my (%status) = &student_gradeStatus($ENV{'form.url'},$symb,$udom,$uname,$partlist) ; + my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); my $statusflg = ''; - foreach (keys(%status)) { - $statusflg = 1 if ($status{$_} ne 'nothing'); - my ($foo,$partid,$foo1) = split(/\./); - $statusflg = '' if ($status{'resource.'.$partid.'.submitted_by'} ne ''); + foreach (split(/:/,$ENV{'form.gradePartRespid'})){ + $statusflg = 1 if (exists ($record{'resource.'.$_.'.submission'})); } next if ($statusflg eq ''); } push @nextlist,$student if ($ctr < $ntstu); + last if ($ctr == $ntstu); $ctr++; } @@ -2121,7 +2131,7 @@ sub viewgrades { $result.= '<h3>Assign Grade to Specific Students in '.$sectionClass; $result.= '<table border=0><tr><td bgcolor="#777777">'."\n". '<table border=0><tr bgcolor="#deffff"><td> <b>No.</b> </td>'. - '<td> <b>Fullname</b> <font color="#999999">(Username)</font></td>'."\n"; + '<td>'.&nameUserString('header')."</td>\n"; my (@parts) = sort(&getpartlist($url)); foreach my $part (@parts) { my $display=&Apache::lonnet::metadata($url,$part.'.display'); @@ -2165,7 +2175,7 @@ sub viewgrades { #--- call by previous routine to display each student sub viewstudentgrade { - my ($$url,$symb,$courseid,$student,$fullname,$parts,$weight,$ctr) = @_; + my ($url,$symb,$courseid,$student,$fullname,$parts,$weight,$ctr) = @_; my ($uname,$udom) = split(/:/,$student); $student=~s/:/_/; my %record=&Apache::lonnet::restore($symb,$courseid,$udom,$uname); @@ -2221,8 +2231,9 @@ sub editgrades { $title.='<font size=+1><b>Section: </b>'.$ENV{'form.section'}.'</font>'."\n"; my $result= '<table border="0"><tr><td bgcolor="#777777">'."\n"; - $result.= '<table border="0"><tr bgcolor="#deffff"><td rowspan=2> <b>No.</b> </td>'. - '<td rowspan=2> <b>Fullname</b> <font color="#999999">(username)</font></td>'."\n"; + $result.= '<table border="0"><tr bgcolor="#deffff">'. + '<td rowspan=2 valign="center"> <b>No.</b> </td>'. + '<td rowspan=2 valign="center">'.&nameUserString('header')."</td>\n"; my %scoreptr = ( 'correct' =>'correct_by_override', @@ -2281,8 +2292,7 @@ sub editgrades { my ($uname,$udom)=split(/_/,$user); my %newrecord; my $updateflag = 0; - $line .= '<td> '.$$fullname{$usercolon}. - ' <font color="#999999">('.$uname.($udom eq $ENV{'user.domain'} ? '' : '$udom').')</font></td>'; + $line .= '<td>'.&nameUserString(undef,$$fullname{$usercolon},$uname,$udom).'</td>'; my $usec=$classlist->{"$uname:$udom"}[5]; if (!&canmodify($usec)) { my $numcols=scalar(@partid)*4+2; @@ -2761,9 +2771,9 @@ LISTJAVASCRIPT '<table border="0"><tr><td bgcolor="#777777">'. '<table border="0"><tr bgcolor="#e6ffff">'. '<td align="right"> <b>No.</b></td>'. - '<td><b> Fullname <font color="#999999">(username)</font></b></td>'. + '<td>'.&nameUserString('header').'</td>'. '<td align="right"> <b>No.</b></td>'. - '<td><b> Fullname <font color="#999999">(username)</font></b></td></tr>'; + '<td>'.&nameUserString('header').'</td></tr>'; my (undef,undef,$fullname) = &getclasslist($getsec,'1'); my $ptr = 1; @@ -2771,8 +2781,8 @@ LISTJAVASCRIPT my ($uname,$udom) = split(/:/,$student); $studentTable.=($ptr%2 == 1 ? '<tr bgcolor="#ffffe6">' : '</td>'); $studentTable.='<td align="right">'.$ptr.' </td>'; - $studentTable.='<td> <input type="radio" name="student" value="'.$student.'" /> '.$$fullname{$student}. - '<font color="#999999"> ('.$uname.($udom eq $cdom ? '':':'.$udom).')</font>'."\n"; + $studentTable.='<td> <input type="radio" name="student" value="'.$student.'" /> ' + .&nameUserString(undef,$$fullname{$student},$uname,$udom)."\n"; $studentTable.=($ptr%2 == 0 ? '</td></tr>' : ''); $ptr++; } @@ -2831,9 +2841,8 @@ sub displayPage { return; } my $result='<h3><font color="#339933"> '.$ENV{'form.title'}.'</font></h3>'; - $result.='<h3> Student: '.$$fullname{$ENV{'form.student'}}. - '<font color="#999999"> ('.$uname.($udom eq $cdom ? '':':'.$udom).')</font></h3>'."\n"; - + $result.='<h3> Student: '.&nameUserString(undef,$$fullname{$ENV{'form.student'}},$uname,$udom). + '</h3>'."\n"; &sub_page_js($request); $request->print($result); @@ -2995,8 +3004,8 @@ sub updateGradeByPage { return; } my $result='<h3><font color="#339933"> '.$ENV{'form.title'}.'</font></h3>'; - $result.='<h3> Student: '.$ENV{'form.fullname'}. - '<font color="#999999"> ('.$uname.($udom eq $cdom ? '':':'.$udom).')</font></h3>'."\n"; + $result.='<h3> Student: '.&nameUserString(undef,$ENV{'form.fullname'},$uname,$udom). + '</h3>'."\n"; $request->print($result); @@ -3320,7 +3329,7 @@ sub scantron_process_students { my @scanlines=<$scanlines>; my $classlist=&Apache::loncoursedata::get_classlist(); my %idmap=&username_to_idmap($classlist); - my $navmap=Apache::lonnavmaps::navmap->new($ENV{'request.course.fn'}.'.db',$ENV{'request.course.fn'}.'_parms.db',1, 1); + my $navmap=Apache::lonnavmaps::navmap->new(1, 1); my $map=$navmap->getResourceByUrl($sequence); my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); $r->print("geto ".scalar(@resources)."<br />");