version 1.66.2.1, 2003/03/17 19:12:56
|
version 1.70, 2003/02/28 21:06:28
|
Line 31
|
Line 31
|
# 8/20 Gerd Kortemeyer |
# 8/20 Gerd Kortemeyer |
# Year 2002 |
# Year 2002 |
# June-August H.K. Ng |
# June-August H.K. Ng |
|
# Year 2003 |
|
# February H.K. Ng |
# |
# |
|
|
package Apache::grades; |
package Apache::grades; |
Line 39 use Apache::style;
|
Line 41 use Apache::style;
|
use Apache::lonxml; |
use Apache::lonxml; |
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::loncommon; |
use Apache::loncommon; |
|
use Apache::lonnavmaps; |
use Apache::lonhomework; |
use Apache::lonhomework; |
use Apache::loncoursedata; |
use Apache::loncoursedata; |
use Apache::lonmsg qw(:user_normal_msg); |
use Apache::lonmsg qw(:user_normal_msg); |
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common); |
|
|
# ----- These first few routines are general use routines.----- |
# ----- These first few routines are general use routines.---- |
# |
# |
# --- Retrieve the parts that matches stores_\d+ from the metadata file.--- |
# --- Retrieve the parts that matches stores_\d+ from the metadata file.--- |
sub getpartlist { |
sub getpartlist { |
Line 269 sub verifyreceipt {
|
Line 272 sub verifyreceipt {
|
return $string.&show_grading_menu_form($symb,$url); |
return $string.&show_grading_menu_form($symb,$url); |
} |
} |
|
|
|
# |
|
# Pick student and page/sequence for manual grading |
|
|
|
|
#--- This is called by a number of programs. |
#--- This is called by a number of programs. |
#--- Called from the Grading Menu - View/Grade an individual student |
#--- Called from the Grading Menu - View/Grade an individual student |
#--- Also called directly when one clicks on the subm button |
#--- Also called directly when one clicks on the subm button |
Line 293 sub listStudents {
|
Line 300 sub listStudents {
|
} |
} |
$result.='</table>'; |
$result.='</table>'; |
|
|
my $viewgrade; |
my $viewgrade = $ENV{'form.handgrade'} eq 'yes' ? 'View/Grade' : 'View'; |
if ($ENV{'form.handgrade'} eq 'yes') { |
|
$viewgrade = 'View/Grade'; |
|
} else { |
|
$viewgrade = 'View'; |
|
} |
|
|
|
$result='<h3><font color="#339933"> '. |
$result='<h3><font color="#339933"> '. |
$viewgrade. |
$viewgrade. |
Line 675 sub sub_page_js {
|
Line 677 sub sub_page_js {
|
pWin.document.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"60\\" maxlength=\\"80\\"></td></tr>"); |
pWin.document.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"60\\" maxlength=\\"80\\"></td></tr>"); |
} |
} |
|
|
function displaySavedMsg(ctr,msg,shwsel) { |
function displaySavedMsg(ctr,msg,shwsel) { |
pWin.document.write("<tr bgcolor=\\"#ffffdd\\">"); |
pWin.document.write("<tr bgcolor=\\"#ffffdd\\">"); |
pWin.document.write("<td align=\\"center\\">"+ctr+"</td>"); |
pWin.document.write("<td align=\\"center\\">"+ctr+"</td>"); |
pWin.document.write("<td align=\\"center\\"><input name=\\"msgn"+ctr+"\\" type=\\"checkbox\\"" +shwsel+"></td>"); |
pWin.document.write("<td align=\\"center\\"><input name=\\"msgn"+ctr+"\\" type=\\"checkbox\\"" +shwsel+"></td>"); |
pWin.document.write("<td><textarea name=\\"msg"+ctr+"\\" cols=\\"60\\" rows=\\"3\\">"+msg+"</textarea></td></tr>"); |
pWin.document.write("<td><input name=\\"msg"+ctr+"\\" type=\\"text\\" value=\\""+msg+"\\" size=\\"60\\" maxlength=\\"80\\"></td></tr>"); |
} |
} |
|
|
function newMsg(newmsg,shwsel) { |
function newMsg(newmsg,shwsel) { |
pWin.document.write("<tr bgcolor=\\"#ffffdd\\">"); |
pWin.document.write("<tr bgcolor=\\"#ffffdd\\">"); |
pWin.document.write("<td align=\\"center\\">New</td>"); |
pWin.document.write("<td align=\\"center\\">New</td>"); |
pWin.document.write("<td align=\\"center\\"><input name=\\"newmsgchk\\" type=\\"checkbox\\"" +shwsel+"></td>"); |
pWin.document.write("<td align=\\"center\\"><input name=\\"newmsgchk\\" type=\\"checkbox\\"" +shwsel+"></td>"); |
pWin.document.write("<td><textarea name=\\"newmsg\\" cols=\\"60\\" rows=\\"3\\" onchange=\\"javascript:this.form.newmsgchk.checked=true\\" >"+newmsg+"</textarea></td></tr>"); |
pWin.document.write("<td><input name=\\"newmsg\\" type=\\"text\\" onchange=\\"javascript:this.form.newmsgchk.checked=true\\" value=\\""+newmsg+"\\" size=\\"60\\" maxlength=\\"80\\"></td></tr>"); |
} |
} |
|
|
function msgTail() { |
function msgTail() { |
Line 1021 KEYWORDS
|
Line 1023 KEYWORDS
|
my ($ressub,$subval) = split(/:/,$_,2); |
my ($ressub,$subval) = split(/:/,$_,2); |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
$partid.'</b> <font color="#999999">( ID '.$respid. |
$partid.'</b> <font color="#999999">( ID '.$respid. |
' )</font> <b>Answer: </b>'. |
' )</font> '. |
|
($record{"resource.$partid.$respid.uploadedurl"}? |
|
'<a href="'. |
|
&Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}). |
|
'"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> <font color="red" size="1">Like all files provided by users, this file may contain virusses</font><br />':''). |
|
'<b>Answer: </b>'. |
&keywords_highlight($subval).'</td></tr>'."\n" |
&keywords_highlight($subval).'</td></tr>'."\n" |
if ($ENV{'form.lastSub'} eq 'lastonly' || |
if ($ENV{'form.lastSub'} eq 'lastonly' || |
($ENV{'form.lastSub'} eq 'hdgrade' && |
($ENV{'form.lastSub'} eq 'hdgrade' && |
Line 1073 KEYWORDS
|
Line 1080 KEYWORDS
|
$seen{$partid}++; |
$seen{$partid}++; |
next if ($$handgrade{$_} =~ /:no$/); |
next if ($$handgrade{$_} =~ /:no$/); |
push @partlist,$partid; |
push @partlist,$partid; |
my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb,$udom,$uname); |
|
my $wgtmsg = ($wgt > 0 ? '(problem weight)' : |
|
'<font color="red">problem weight assigned by computer</font>'); |
|
$wgt = ($wgt > 0 ? $wgt : '1'); |
|
my $score = ($record{'resource.'.$partid.'.awarded'} eq '' ? |
|
'' : $record{'resource.'.$partid.'.awarded'}*$wgt); |
|
$result='<input type="hidden" name="WGT'.$counter.'_'.$partid.'" value="'.$wgt.'" />'; |
|
$result.='<table border="0"><tr><td><b>Part </b>'.$partid.' <b>Points: </b></td><td>'; |
|
|
|
my $ctr = 0; |
$result=&gradeBox($symb,$uname,$udom,$counter,$partid,\%record); |
$result.='<table border="0"><tr>'; # display radio buttons in a nice table 10 across |
|
while ($ctr<=$wgt) { |
|
$result.= '<td><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '. |
|
'onclick="javascript:writeBox(this.form.GD_BOX'.$counter.'_'.$partid. |
|
',this.form.GD_SEL'.$counter.'_'.$partid.','.$ctr. |
|
',this.form.stores'.$counter.'_'.$partid.')" '. |
|
($score eq $ctr ? 'checked':'').' /> '.$ctr."</td>\n"; |
|
$result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : ''); |
|
$ctr++; |
|
} |
|
$result.='</tr></table>'; |
|
|
|
$result.='</td><td> <b>or</b> </td>'; |
|
$result.='<td><input type="text" name="GD_BOX'.$counter.'_'.$partid.'"'. |
|
($score ne ''? ' value = "'.$score.'"':'').' size="4" '. |
|
'onChange="javascript:updateRadio(this.form.RADVAL'.$counter.'_'.$partid. |
|
',this.form.GD_BOX'.$counter.'_'.$partid. |
|
',this.form.GD_SEL'.$counter.'_'.$partid. |
|
',this.form.stores'.$counter.'_'.$partid. |
|
','.$wgt.')" /></td>'."\n"; |
|
$result.='<td>/'.$wgt.' '.$wgtmsg.' </td><td>'; |
|
|
|
$result.='<select name="GD_SEL'.$counter.'_'.$partid.'" '. |
|
'onChange="javascript:clearRadBox(this.form.RADVAL'.$counter.'_'.$partid. |
|
',this.form.GD_BOX'.$counter.'_'.$partid. |
|
',this.form.GD_SEL'.$counter.'_'.$partid. |
|
',this.form.stores'.$counter.'_'.$partid.')" >'."\n"; |
|
if ($record{'resource.'.$partid.'.solved'} eq 'excused') { |
|
$result.='<option> </option>'. |
|
'<option selected="on">excused</option></select>'; |
|
} else { |
|
$result.='<option selected="on"> </option>'. |
|
'<option>excused</option></select>'; |
|
} |
|
$result.="  \n"; |
|
$result.='<input type="hidden" name="stores'.$counter.'_'.$partid.'" value="0" />'; |
|
$result.='</td></tr></table>'."\n"; |
|
$request->print($result); |
$request->print($result); |
} |
} |
$result='<input type="hidden" name="partlist'.$counter. |
$result='<input type="hidden" name="partlist'.$counter. |
Line 1232 sub processHandGrade {
|
Line 1195 sub processHandGrade {
|
foreach (@msgnum) { |
foreach (@msgnum) { |
$message.=$ENV{'form.'.$_} if ($_ =~ /savemsg|newmsg/ && $_ ne ''); |
$message.=$ENV{'form.'.$_} if ($_ =~ /savemsg|newmsg/ && $_ ne ''); |
} |
} |
#$message =~ s/\s+/ /g; |
$message =~ s/\s+/ /g; |
$msgstatus = &Apache::lonmsg::user_normal_msg ($uname,$udom, |
$msgstatus = &Apache::lonmsg::user_normal_msg ($uname,$udom, |
$ENV{'form.msgsub'},$message); |
$ENV{'form.msgsub'},$message); |
} |
} |
Line 2193 sub gradingmenu {
|
Line 2156 sub gradingmenu {
|
$result.=&view_edit_entire_class_form($symb,$url).'<br />'; |
$result.=&view_edit_entire_class_form($symb,$url).'<br />'; |
$result.=&upcsvScores_form($symb,$url).'<br />'; |
$result.=&upcsvScores_form($symb,$url).'<br />'; |
$result.=&viewGradeaStu_form($symb,$url,$resptype,$hdgrade).'<br />'; |
$result.=&viewGradeaStu_form($symb,$url,$resptype,$hdgrade).'<br />'; |
|
$result.=&gradeByPage_form($symb,$url,$resptype,$hdgrade).'<br />'; |
$result.=&verifyReceipt_form($symb,$url) |
$result.=&verifyReceipt_form($symb,$url) |
if ((&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) && ($symb)); |
if ((&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) && ($symb)); |
|
|
Line 2264 sub viewGradeaStu_form {
|
Line 2228 sub viewGradeaStu_form {
|
my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n"; |
my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n"; |
$result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n"; |
$result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n"; |
$result.=' <b>'; |
$result.=' <b>'; |
if ($handgrade eq 'yes') { |
$result.=($handgrade eq 'yes' ? 'View/Grade' : 'View').' an Individual Student\'s Submission</b></td></tr>'."\n"; |
$result.="View/Grade "; |
|
} else { |
|
$result.="View "; |
|
} |
|
$result.='an Individual Student\'s Submission</b></td></tr>'."\n"; |
|
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
$result.='<form action="/adm/grades" method="post">'."\n". |
$result.='<form action="/adm/grades" method="post">'."\n". |
'<input type="hidden" name="symb" value="'.$symb.'" />'."\n". |
'<input type="hidden" name="symb" value="'.$symb.'" />'."\n". |
Line 2305 sub viewGradeaStu_form {
|
Line 2264 sub viewGradeaStu_form {
|
return $result; |
return $result; |
} |
} |
|
|
|
#--- Handgrading problems by page/sequence for each student --- |
|
sub gradeByPage_form { |
|
my ($symb,$url,$response,$handgrade) = @_; |
|
my ($classlist,$sections) = &getclasslist('all','0'); |
|
my $result.='<table width=100% border=0><tr><td bgcolor=#777777>'."\n"; |
|
$result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n"; |
|
$result.=' <b>'; |
|
$result.='Handgrade an Individual Student\'s by Page/Sequence</b></td></tr>'."\n"; |
|
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
|
$result.='<form action="/adm/grades" method="post">'."\n". |
|
'<input type="hidden" name="symb" value="'.$symb.'" />'."\n". |
|
'<input type="hidden" name="url" value="'.$url.'" />'."\n". |
|
'<input type="hidden" name="response" value="'.$response.'" />'."\n". |
|
'<input type="hidden" name="handgrade" value="'.$handgrade.'" />'."\n". |
|
'<input type="hidden" name="showgrading" value="yes" />'."\n". |
|
'<input type="hidden" name="command" value="pickStudentPage" />'."\n"; |
|
|
|
$result.=' <b>Select section:</b> <select name="section">'."\n"; |
|
if (ref($sections)) { |
|
foreach (sort (@$sections)) {$result.='<option>'.$_.'</option>'."\n";} |
|
} |
|
$result.= '<option selected="on">all</select>'."\n"; |
|
|
|
$result.='<br /> <input type="button" onClick="submit();" value="'; |
|
$result.='View/Grade'.'" />'."\n".'</form>'."\n"; |
|
$result.='</td></tr></table>'."\n"; |
|
$result.='</td></tr></table>'."\n"; |
|
return $result; |
|
} |
|
|
|
|
|
sub pickStudentPage { |
|
my ($request) = shift; |
|
|
|
$request->print(<<LISTJAVASCRIPT); |
|
<script type="text/javascript" language="javascript"> |
|
|
|
function checkPickOne(formname) { |
|
var user = radioSelection(formname.student); |
|
if (user == null) { |
|
alert("Please select the student you wish to grade."); |
|
return; |
|
} |
|
var ptr = pullDownSelection(formname.selectpage); |
|
formname.page.value = formname.eval("page"+ptr).value; |
|
formname.title.value = formname.eval("title"+ptr).value; |
|
formname.submit(); |
|
} |
|
|
|
function radioSelection(radioButton) { |
|
var selection=null; |
|
for (var i=0; i<radioButton.length; i++) { |
|
if (radioButton[i].checked) { |
|
selection=radioButton[i].value; |
|
return selection; |
|
} |
|
} |
|
return selection; |
|
} |
|
|
|
function pullDownSelection(selectOne) { |
|
var selection=null; |
|
for (var i=0; i<selectOne.length; i++) { |
|
if (selectOne[i].selected) { |
|
selection=selectOne[i].value; |
|
return selection; |
|
} |
|
} |
|
} |
|
</script> |
|
LISTJAVASCRIPT |
|
|
|
my ($symb,$url) = &get_symb_and_url(); |
|
my $cdom = $ENV{"course.$ENV{'request.course.id'}.domain"}; |
|
my $cnum = $ENV{"course.$ENV{'request.course.id'}.num"}; |
|
my $getsec = $ENV{'form.section'} eq '' ? 'all' : $ENV{'form.section'}; |
|
|
|
my $result='<h3><font color="#339933"> '. |
|
'Manual Grading by Page or Sequence</font></h3>'; |
|
|
|
my ($pagepath,$pagename,$type,$mapId) = ($symb =~ /(.*\/)(.*?\.(page|sequence))___(\d+)___/); |
|
my $curtitle = &Apache::lonnet::metadata($pagepath.$pagename,'title'); |
|
|
|
$result.='<form action="/adm/grades" method="post" name="displayPage">'."<br>\n"; |
|
$result.=' <b>Problems from:</b> <select name="selectpage">'."\n"; |
|
my ($titles,$symbx) = &getSymbMap(); |
|
# shift @$titles; # skip the top level sequence |
|
my $ctr=0; |
|
foreach (@$titles) { |
|
my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); |
|
$result.='<option value="'.$ctr.'" '. |
|
($showtitle eq $curtitle ? 'selected="on"' : '').'>'.$showtitle.'</option>'."\n"; |
|
$ctr++; |
|
} |
|
$result.= '</select>'."<br>\n"; |
|
$ctr=0; |
|
foreach (@$titles) { |
|
my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); |
|
$result.='<input type="hidden" name="page'.$ctr.'" value="'.$$symbx{$_}.'" />'."\n"; |
|
$result.='<input type="hidden" name="title'.$ctr.'" value="'.$showtitle.'" />'."\n"; |
|
$ctr++; |
|
} |
|
$result.='<input type="hidden" name="page" />'."\n"; |
|
$result.='<input type="hidden" name="title" />'."\n"; |
|
|
|
# $result.=' <b>View Problems: </b><input type="radio" name="vProb" value="no" checked /> no '."\n". |
|
# '<input type="radio" name="vProb" value="yes" /> yes '."<br>\n"; |
|
# $result.=' <b>Submission Details: </b>'. |
|
# '<input type="radio" name="lastSub" value="last" checked /> last sub only'."\n". |
|
# '<input type="radio" name="lastSub" value="all" /> all details'."\n"; |
|
$result.='<input type="hidden" name="section" value="'.$getsec.'" />'."\n". |
|
'<input type="hidden" name="command" value="displayPage" />'."\n". |
|
'<input type="hidden" name="url" value="'.$url.'" />'."\n". |
|
'<input type="hidden" name="symb" value="'.$symb.'" />'."<br><br>\n"; |
|
$request->print($result); |
|
|
|
my $studentTable.=' <b>Select a Student you wish to grade</b><br>'. |
|
'<table border="0"><tr><td bgcolor="#777777">'. |
|
'<table border="0"><tr bgcolor="#e6ffff">'. |
|
'<td><b> Fullname <font color="#999999">(username)</font></b></td>'. |
|
'<td><b> Fullname <font color="#999999">(username)</font></b></td>'. |
|
'<td><b> Fullname <font color="#999999">(username)</font></b></td>'. |
|
'<td><b> Fullname <font color="#999999">(username)</font></b></td></tr>'; |
|
|
|
my (undef,undef,$fullname) = &getclasslist($getsec,'0'); |
|
my $ptr = 1; |
|
foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) { |
|
my ($uname,$udom) = split(/:/,$student); |
|
$studentTable.=($ptr%4 == 1 ? '<tr bgcolor="#ffffe6"><td>' : '</td><td>'); |
|
$studentTable.='<input type="radio" name="student" value="'.$student.'" /> '.$$fullname{$student}. |
|
'<font color="#999999"> ('.$uname.($udom eq $cdom ? '':':'.$udom).')</font>'."\n"; |
|
$studentTable.=($ptr%4 == 0 ? '</td></tr>' : ''); |
|
$ptr++; |
|
} |
|
$studentTable.='</td><td> </td><td> </td><td> ' if ($ptr%4 == 2); |
|
$studentTable.='</td><td> </td><td> ' if ($ptr%4 == 3); |
|
$studentTable.='</td><td> ' if ($ptr%4 == 0); |
|
$studentTable.='</td></tr></table></td></tr></table>'."\n"; |
|
$studentTable.='<br /> <input type="button" '. |
|
'onClick="javascript:checkPickOne(this.form);"value="Submit" /></form>'."\n"; |
|
|
|
$studentTable.=&show_grading_menu_form($symb,$url); |
|
$request->print($studentTable); |
|
|
|
return ''; |
|
} |
|
|
|
sub getSymbMap { |
|
my $navmap = Apache::lonnavmaps::navmap-> new( |
|
$ENV{'request.course.fn'}.'.db', |
|
$ENV{'request.course.fn'}.'_parms.db',1, 1); |
|
|
|
my $res = $navmap->firstResource(); # temp resource to access constants |
|
$navmap->init(); |
|
|
|
# End navmap using boilerplate |
|
|
|
my $iterator = $navmap->getIterator(undef, undef, undef, 1); |
|
my $depth = 1; |
|
$iterator->next(); # ignore first BEGIN_MAP |
|
my $curRes = $iterator->next(); |
|
|
|
my %symbx = (); |
|
my @titles = (); |
|
my $minder=0; |
|
while ($depth > 0) { |
|
if ($curRes == $iterator->BEGIN_MAP()) {$depth++;} |
|
if ($curRes == $iterator->END_MAP()) { $depth--; } |
|
|
|
if (ref($curRes) && $curRes->is_map()) { |
|
my $title = $curRes->compTitle(); |
|
push @titles,$minder.'.'.$title; # minder, just in case two titles are identical |
|
$symbx{$minder.'.'.$title} = $curRes->symb(); |
|
$minder++; |
|
} |
|
$curRes = $iterator->next(); |
|
} |
|
|
|
$navmap->untieHashes(); |
|
return \@titles,\%symbx; |
|
} |
|
|
|
sub displayPage { |
|
my ($request) = shift; |
|
|
|
my $cdom = $ENV{"course.$ENV{'request.course.id'}.domain"}; |
|
my $cnum = $ENV{"course.$ENV{'request.course.id'}.num"}; |
|
my $getsec = $ENV{'form.section'} eq '' ? 'all' : $ENV{'form.section'}; |
|
my $pageTitle = $ENV{'form.page'}; |
|
my (undef,undef,$fullname) = &getclasslist($getsec,'0'); |
|
my ($uname,$udom) = split(/:/,$ENV{'form.student'}); |
|
my ($idx,$showtitle) = ($pageTitle =~ /(\d+)\.(.*)/); |
|
|
|
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"; |
|
|
|
my $navmap = Apache::lonnavmaps::navmap-> new( |
|
$ENV{'request.course.fn'}.'.db', |
|
$ENV{'request.course.fn'}.'_parms.db',1, 1); |
|
my ($mapUrl, $id, $resUrl) = split(/___/, $ENV{'form.page'}); |
|
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps |
|
|
|
my $iterator = $navmap->getIterator($map->map_start(), |
|
$map->map_finish()); |
|
|
|
my $depth = 1; |
|
$iterator->next(); # skip the first BEGIN_MAP |
|
my $curRes = $iterator->next(); # for "current resource" |
|
my %symbx = (); |
|
my @titles = (); |
|
my %parts = (); |
|
my $ctr=0; |
|
my $minder=0; |
|
while ($depth > 0 && $ctr < 100) { # ctr, just in case it never gets out of loop |
|
if($curRes == $iterator->BEGIN_MAP) { $depth++; } |
|
if($curRes == $iterator->END_MAP) { $depth++; } |
|
|
|
if (ref($curRes) && $curRes->is_problem() && !$curRes->randomout) { |
|
my $parts = $curRes->parts(); |
|
my $title = $curRes->compTitle(); |
|
push @titles,$minder.'.'.$title; # minder, just in case two titles are identical |
|
if (scalar(@{$parts}) > 1) { shift @{$parts}; } |
|
$parts{$minder.'.'.$title} = join '::',@{$parts}; |
|
$symbx{$minder.'.'.$title} = $curRes->symb(); |
|
$minder++; |
|
|
|
} |
|
$curRes = $iterator->next(); |
|
$ctr++; |
|
} |
|
|
|
|
|
$navmap->init(); |
|
$request->print($result); |
|
&sub_page_js($request); |
|
|
|
my $studentTable='<form action="/adm/grades" method="post" name="gradePage">'."\n". |
|
'<input type="hidden" name="command" value="gradePage" />'."\n". |
|
'<input type="hidden" name="student" value="'.$ENV{'form.student'}.'" />'."\n". |
|
'<input type="hidden" name="page" value="'.$pageTitle.'" />'."\n". |
|
'<input type="hidden" name="title" value="'.$ENV{'form.title'}.'" />'."\n"; |
|
|
|
$studentTable.= |
|
'<table border="0"><tr><td bgcolor="#777777">'. |
|
'<table border="0"><tr bgcolor="#e6ffff">'. |
|
'<td align="center"><b> No </b></td>'. |
|
'<td><b> Title</b></td>'. |
|
'<td><b> Answer</b></td>'. |
|
'<td><b> Grade</b></td></tr>'; |
|
my $question=1; |
|
foreach (@titles) { |
|
my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); |
|
my @parts = split(/::/,$parts{$_}); |
|
$studentTable.='<tr bgcolor="#ffffe6"><td align="center" valign="top" >'.$question. |
|
(scalar(@parts) == 1 ? '' : '<br>('.scalar(@parts).' parts)').'</td>'; |
|
$studentTable.='<td valign="top"> '.$showtitle.' </td>'; |
|
$studentTable.='<td> '. |
|
&Apache::loncommon::get_student_answers($symbx{$_},$uname,$udom,$ENV{'request.course.id'}).'</td>'; |
|
|
|
my %record = &Apache::lonnet::restore($symbx{$_},$ENV{'request.course.id'},$udom,$uname); |
|
$studentTable.='<td> '; |
|
foreach my $partid (@parts) { |
|
$studentTable.=&gradeBox($symbx{$_},$uname,$udom,$question,$partid,\%record); |
|
$question++; |
|
} |
|
$studentTable.='</td></tr>'; |
|
|
|
} |
|
|
|
$studentTable.='</table></td></tr></table>'; |
|
$studentTable.='</form>'; |
|
|
|
$request->print($studentTable); |
|
|
|
return ''; |
|
} |
|
|
|
sub gradeBox { |
|
my ($symb,$uname,$udom,$counter,$partid,$record) = @_; |
|
my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb,$udom,$uname); |
|
my $wgtmsg = ($wgt > 0 ? '(problem weight)' : |
|
'<font color="red">problem weight assigned by computer</font>'); |
|
$wgt = ($wgt > 0 ? $wgt : '1'); |
|
my $score = ($$record{'resource.'.$partid.'.awarded'} eq '' ? |
|
'' : $$record{'resource.'.$partid.'.awarded'}*$wgt); |
|
my $result='<input type="hidden" name="WGT'.$counter.'_'.$partid.'" value="'.$wgt.'" />'; |
|
$result.='<table border="0"><tr><td><b>Part </b>'.$partid.' <b>Points: </b></td><td>'; |
|
|
|
my $ctr = 0; |
|
$result.='<table border="0"><tr>'; # display radio buttons in a nice table 10 across |
|
while ($ctr<=$wgt) { |
|
$result.= '<td><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '. |
|
'onclick="javascript:writeBox(this.form.GD_BOX'.$counter.'_'.$partid. |
|
',this.form.GD_SEL'.$counter.'_'.$partid.','.$ctr. |
|
',this.form.stores'.$counter.'_'.$partid.')" '. |
|
($score eq $ctr ? 'checked':'').' /> '.$ctr."</td>\n"; |
|
$result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : ''); |
|
$ctr++; |
|
} |
|
$result.='</tr></table>'; |
|
$result.='</td><td> <b>or</b> </td>'; |
|
$result.='<td><input type="text" name="GD_BOX'.$counter.'_'.$partid.'"'. |
|
($score ne ''? ' value = "'.$score.'"':'').' size="4" '. |
|
'onChange="javascript:updateRadio(this.form.RADVAL'.$counter.'_'.$partid. |
|
',this.form.GD_BOX'.$counter.'_'.$partid. |
|
',this.form.GD_SEL'.$counter.'_'.$partid. |
|
',this.form.stores'.$counter.'_'.$partid. |
|
','.$wgt.')" /></td>'."\n"; |
|
$result.='<td>/'.$wgt.' '.$wgtmsg.' </td><td>'; |
|
|
|
$result.='<select name="GD_SEL'.$counter.'_'.$partid.'" '. |
|
'onChange="javascript:clearRadBox(this.form.RADVAL'.$counter.'_'.$partid. |
|
',this.form.GD_BOX'.$counter.'_'.$partid. |
|
',this.form.GD_SEL'.$counter.'_'.$partid. |
|
',this.form.stores'.$counter.'_'.$partid.')" >'."\n"; |
|
if ($$record{'resource.'.$partid.'.solved'} eq 'excused') { |
|
$result.='<option> </option>'. |
|
'<option selected="on">excused</option></select>'; |
|
} else { |
|
$result.='<option selected="on"> </option>'. |
|
'<option>excused</option></select>'; |
|
} |
|
$result.="  \n"; |
|
$result.='<input type="hidden" name="stores'.$counter.'_'.$partid.'" value="0" />'; |
|
$result.='</td></tr></table>'."\n"; |
|
return $result; |
|
} |
|
|
#--- Form to input a receipt number --- |
#--- Form to input a receipt number --- |
sub verifyReceipt_form { |
sub verifyReceipt_form { |
my ($symb,$url) = @_; |
my ($symb,$url) = @_; |
Line 2392 sub handler {
|
Line 2680 sub handler {
|
} else { |
} else { |
$Apache::grades::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}); |
$Apache::grades::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}); |
if ($command eq 'submission') { |
if ($command eq 'submission') { |
&listStudents($request) if ($ENV{'form.student'} eq ''); |
($ENV{'form.student'} eq '' ? &listStudents($request) : &submission($request,0,0)); |
&submission($request,0,0) if ($ENV{'form.student'} ne ''); |
# if ($command eq 'submission') { |
|
# &listStudents($request) if ($ENV{'form.student'} eq ''); |
|
# &submission($request,0,0) if ($ENV{'form.student'} ne ''); |
|
} elsif ($command eq 'pickStudentPage') { |
|
&pickStudentPage($request); |
|
} elsif ($command eq 'displayPage') { |
|
&displayPage($request); |
} elsif ($command eq 'processGroup') { |
} elsif ($command eq 'processGroup') { |
&processGroup($request); |
&processGroup($request); |
} elsif ($command eq 'gradingmenu') { |
} elsif ($command eq 'gradingmenu') { |