--- loncom/homework/grades.pm 2003/09/19 21:54:07 1.140 +++ loncom/homework/grades.pm 2003/10/28 23:20:03 1.145 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.140 2003/09/19 21:54:07 albertel Exp $ +# $Id: grades.pm,v 1.145 2003/10/28 23:20:03 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -185,7 +185,7 @@ sub cleanRecord { $ENV{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; $ENV{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob. } - return '<br /><br /><blockquote>'.&keywords_highlight($answer).'</blockquote>'; + return '<br /><br /><blockquote><pre>'.&keywords_highlight($answer).'</pre></blockquote>'; } return $answer; } @@ -507,9 +507,12 @@ LISTJAVASCRIPT my $checkhdgrade = ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked' : ''; my $checklastsub = $checkhdgrade eq '' ? 'checked' : ''; my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n". - ' <b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked /> no '."\n". + ' <b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked="on" /> no '."\n". '<input type="radio" name="vProb" value="yes" /> one student '."\n". '<input type="radio" name="vProb" value="all" /> all students <br />'."\n". + ' <b>View Answer: </b><input type="radio" name="vAns" value="no" /> no '."\n". + '<input type="radio" name="vAns" value="yes" /> one student '."\n". + '<input type="radio" name="vAns" value="all" checked="on" /> all students <br />'."\n". ' <b>Submissions: </b>'."\n"; if ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { $gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only'."\n"; @@ -569,18 +572,21 @@ LISTJAVASCRIPT my %status = (); if ($ENV{'form.showgrading'} eq 'yes' && $submitonly ne 'all') { (%status) =&student_gradeStatus($url,$symb,$udom,$uname,$partlist); - my $statusflg = ''; + my $submitted = 0; + my $graded = 1; foreach (keys(%status)) { - $statusflg = 1 if ($status{$_} ne 'nothing'); + $submitted = 1 if ($status{$_} ne 'nothing'); + $graded = 0 if ($status{$_} =~ /^correct/); my ($foo,$partid,$foo1) = split(/\./,$_); if ($status{'resource.'.$partid.'.submitted_by'} ne '') { - $statusflg = ''; + $submitted = 0; $gradeTable.='<input type="hidden" name="'. $student.':submitted_by" value="'. $status{'resource.'.$partid.'.submitted_by'}.'" />'; } } - next if ($statusflg eq '' && $submitonly eq 'yes'); + next if (!$submitted && ($submitonly eq 'yes' || $submitonly eq 'graded')); + next if (!$graded && $submitonly eq 'graded'); } $ctr++; @@ -622,7 +628,7 @@ LISTJAVASCRIPT } else { $gradeTable='<br /> <font color="red">'. 'No submissions found for this resource for any students. ('.$num_students. - ' checked for submissions</font><br />'; + ' checked for submissions)</font><br />'; } } elsif ($ctr == 1) { $gradeTable =~ s/type=checkbox/type=checkbox checked/; @@ -1196,27 +1202,46 @@ sub gradeBox { } sub show_problem { - my ($request,$symb,$uname,$udom,$removeform,$viewon) = @_; - my $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom, - $ENV{'request.course.id'}); + my ($request,$symb,$uname,$udom,$removeform,$viewon,$mode) = @_; + my $rendered; + if ($mode eq 'both' or $mode eq 'text') { + $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom, + $ENV{'request.course.id'}); + } if ($removeform) { $rendered=~s|<form(.*?)>||g; $rendered=~s|</form>||g; $rendered=~s|name="submit"|name="would_have_been_submit"|g; } - my $companswer=&Apache::loncommon::get_student_answers($symb,$uname,$udom, - $ENV{'request.course.id'}); + my $companswer; + if ($mode eq 'both' or $mode eq 'answer') { + $companswer=&Apache::loncommon::get_student_answers($symb,$uname,$udom, + $ENV{'request.course.id'}); + } if ($removeform) { $companswer=~s|<form(.*?)>||g; $companswer=~s|</form>||g; - $rendered=~s|name="submit"|name="would_have_been_submit"|g; + $companswer=~s|name="submit"|name="would_have_been_submit"|g; } my $result.='<table border="0" width="100%"><tr><td bgcolor="#777777">'; $result.='<table border="0" width="100%">'; - $result.='<tr><td bgcolor="#e6ffff"><b> View of the problem - '.$ENV{'form.fullname'}. - '</b></td></tr>' if ($viewon); - $result.='<tr><td bgcolor="#ffffff">'.$rendered.'<br />'; - $result.='<b>Correct answer:</b><br />'.$companswer; + if ($viewon) { + $result.='<tr><td bgcolor="#e6ffff"><b> '; + if ($mode eq 'both' or $mode eq 'text') { + $result.='View of the problem - '; + } else { + $result.='Correct answer: '; + } + $result.=$ENV{'form.fullname'}.'</b></td></tr>'; + } + if ($mode eq 'both') { + $result.='<tr><td bgcolor="#ffffff">'.$rendered.'<br />'; + $result.='<b>Correct answer:</b><br />'.$companswer; + } elsif ($mode eq 'text') { + $result.='<tr><td bgcolor="#ffffff">'.$rendered; + } elsif ($mode eq 'answer') { + $result.='<tr><td bgcolor="#ffffff">'.$companswer; + } $result.='</td></tr></table>'; $result.='</td></tr></table><br />'; return $result; @@ -1265,8 +1290,16 @@ sub submission { # option to display problem, only once else it cause problems # with the form later since the problem has a form. - if ($ENV{'form.vProb'} eq 'yes' or !$ENV{'form.vProb'}) { - $request->print(&show_problem($request,$symb,$uname,$udom,0,1)); + if ($ENV{'form.vProb'} eq 'yes' or $ENV{'form.vAns'} eq 'yes') { + my $mode; + if ($ENV{'form.vProb'} eq 'yes' && $ENV{'form.vAns'} eq 'yes') { + $mode='both'; + } elsif ($ENV{'form.vProb'} eq 'yes') { + $mode='text'; + } elsif ($ENV{'form.vAns'} eq 'yes') { + $mode='answer'; + } + $request->print(&show_problem($request,$symb,$uname,$udom,0,1,$mode)); } # kwclr is the only variable that is guaranteed to be non blank @@ -1301,6 +1334,7 @@ sub submission { '<input type="hidden" name="url" value="'.$url.'" />'."\n". '<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" />'."\n". '<input type="hidden" name="vProb" value="'.$ENV{'form.vProb'}.'" />'."\n". + '<input type="hidden" name="vAns" value="'.$ENV{'form.vAns'}.'" />'."\n". '<input type="hidden" name="lastSub" value="'.$ENV{'form.lastSub'}.'" />'."\n". '<input type="hidden" name="section" value="'.$ENV{'form.section'}.'">'."\n". '<input type="hidden" name="submitonly" value="'.$ENV{'form.submitonly'}.'">'."\n". @@ -1351,10 +1385,19 @@ KEYWORDS } } - if ($ENV{'form.vProb'} eq 'all') { + if ($ENV{'form.vProb'} eq 'all' or $ENV{'form.vAns'} eq 'all') { $request->print('<br /><br /><br />') if ($counter > 0); - $request->print(&show_problem($request,$symb,$uname,$udom,1,1)); + my $mode; + if ($ENV{'form.vProb'} eq 'all' && $ENV{'form.vAns'} eq 'all') { + $mode='both'; + } elsif ($ENV{'form.vProb'} eq 'all' ) { + $mode='text'; + } elsif ($ENV{'form.vAns'} eq 'all') { + $mode='answer'; + } + $request->print(&show_problem($request,$symb,$uname,$udom,1,1,$mode)); } + my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); my ($partlist,$handgrade) = &response_type($url,$symb); @@ -1790,15 +1833,25 @@ sub processHandGrade { } $ctr = 0; @parsedlist = reverse @parsedlist if ($button eq 'Previous'); + my ($partlist) = &response_type($url); foreach my $student (@parsedlist) { + my $submitonly=$ENV{'form.submitonly'}; my ($uname,$udom) = split(/:/,$student); - if ($ENV{'form.submitonly'} eq 'yes') { - my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); - my $statusflg = ''; - foreach (split(/:/,$ENV{'form.gradePartRespid'})){ - $statusflg = 1 if (exists ($record{'resource.'.$_.'.submission'})); + if ($submitonly =~ /^(yes|graded)$/) { +# my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); + my %status=&student_gradeStatus($url,$symb,$udom,$uname,$partlist); + my $submitted = 0; + my $graded = 1; + foreach (keys(%status)) { + $submitted = 1 if ($status{$_} ne 'nothing'); + $graded = 0 if ($status{$_} =~ /^correct/); + my ($foo,$partid,$foo1) = split(/\./,$_); + if ($status{'resource.'.$partid.'.submitted_by'} ne '') { + $submitted = 0; + } } - next if ($statusflg eq ''); + next if (!$submitted && ($submitonly eq 'yes' || $submitonly eq 'graded')); + next if (!$graded && $submitonly eq 'graded'); } push @nextlist,$student if ($ctr < $ntstu); last if ($ctr == $ntstu); @@ -2755,7 +2808,7 @@ LISTJAVASCRIPT $result.='<input type="hidden" name="page" />'."\n". '<input type="hidden" name="title" />'."\n"; - $result.=' <b>View Problems Text: </b><input type="radio" name="vProb" value="no" checked /> no '."\n". + $result.=' <b>View Problems Text: </b><input type="radio" name="vProb" value="no" checked="on" /> no '."\n". '<input type="radio" name="vProb" value="yes" /> yes '."<br>\n"; $result.=' <b>Submission Details: </b>'. @@ -2894,8 +2947,9 @@ sub displayPage { $studentTable.='<tr bgcolor="#ffffe6"><td align="center" valign="top" >'.$question. (scalar(@{$parts}) == 1 ? '' : '<br>('.scalar(@{$parts}).' parts)').'</td>'; $studentTable.='<td valign="top">'; - if ($ENV{'form.vProb'} eq 'yes') { - $studentTable.=&show_problem($request,$symbx,$uname,$udom,1); + if ($ENV{'form.vProb'} eq 'yes' ) { + $studentTable.=&show_problem($request,$symbx,$uname,$udom,1, + undef,'both'); } else { my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$ENV{'request.course.id'}); $companswer =~ s|<form(.*?)>||g; @@ -3189,7 +3243,7 @@ sub scantron_selectphase { my $result; $result.= <<SCANTRONFORM; <form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process"> - <input type="hidden" name="command" value="scantron_process" /> + <input type="hidden" name="command" value="scantron_validate" /> $default_form_data <table width="100%" border="0"> <tr> @@ -3219,7 +3273,7 @@ sub scantron_selectphase { </td> </tr> </table> - <input type="submit" value="Submit" /> + <input type="submit" value="Validate Scantron Records" /> </form> $grading_menu_button SCANTRONFORM @@ -3337,6 +3391,11 @@ sub scantron_filter { #and then get the instructor to fix all of these errors, then grade #the corrected one, I'll still need to catch error conditions, but #maybe most will taken care even before we start + +sub scantron_validate_file { + my ($r) = @_; +} + sub scantron_process_students { my ($r) = @_; my (undef,undef,$sequence)=&Apache::lonnet::decode_symb($ENV{'form.selectpage'}); @@ -3505,7 +3564,7 @@ sub gradingmenu { } formname.command.value = cmd; formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+ - ":saveSub="+radioSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status); + ":saveSub="+pullDownSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status); if (val < 5) formname.submit(); if (val == 5) { if (!checkReceiptNo(formname,'notOK')) { return false;} @@ -3573,12 +3632,14 @@ GRADINGMENUJS $result.='<tr bgcolor="#ffffe6"valign="top"><td>'. '<input type="radio" name="radioChoice" value="submission" '. - ($saveCmd eq 'submission' ? 'checked' : '').'> '.'<b>Current Resource:</b> For one or more students'. - '<br /> -->For students with '. - '<input type="radio" name="submitonly" value="yes" '. - ($saveSub eq 'yes' ? 'checked' : '').' /> submissions or '. - '<input type="radio" name="submitonly" value="all" '. - ($saveSub eq 'all' ? 'checked' : '').' /> for all</td></tr>'."\n"; + ($saveCmd eq 'submission' ? 'checked' : '').'> '.'<b>Current Resource:</b> For one or more students '. + '<select name="submitonly">'. + '<option value="yes" '. + ($saveSub eq 'yes' ? 'selected="on"' : '').'>with submissions</option>'. + '<option value="graded" '. + ($saveSub eq 'graded' ? 'selected="on"' : '').'>with ungraded submissions</option>'. + '<option value="all" '. + ($saveSub eq 'all' ? 'selected="on"' : '').'>with any status</option></select></td></tr>'."\n"; $result.='<tr bgcolor="#ffffe6"valign="top"><td>'. '<input type="radio" name="radioChoice" value="viewgrades" '. @@ -3624,9 +3685,9 @@ sub handler { undef(%perm); if ($ENV{'browser.mathml'}) { - $request->content_type('text/xml'); + &Apache::loncommon::content_type($request,'text/xml'); } else { - $request->content_type('text/html'); + &Apache::loncommon::content_type($request,'text/html'); } $request->send_http_header; return '' if $request->header_only; @@ -3721,6 +3782,8 @@ sub handler { } } elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { $request->print(&scantron_selectphase($request)); + } elsif ($command eq 'scantron_validate' && $perm{'mgr'}) { + $request->print(&scantron_validate_file($request)); } elsif ($command eq 'scantron_process' && $perm{'mgr'}) { $request->print(&scantron_process_students($request)); } elsif ($command) {