--- loncom/homework/grades.pm 2009/05/28 14:30:04 1.577 +++ loncom/homework/grades.pm 2010/03/11 16:29:42 1.597 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.577 2009/05/28 14:30:04 bisitz Exp $ +# $Id: grades.pm,v 1.597 2010/03/11 16:29:42 wenzelju Exp $ # # Copyright Michigan State University Board of Trustees # @@ -97,9 +97,15 @@ sub ssi_print_error { # # --- Retrieve the parts from the metadata file.--- sub getpartlist { - my ($symb) = @_; + my ($symb,$errorref) = @_; my $navmap = Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + if (ref($errorref)) { + $$errorref = 'navmap'; + return; + } + } my $res = $navmap->getBySymb($symb); my $partlist = $res->parts(); my $url = $res->src(); @@ -144,10 +150,20 @@ sub nameUserString { #--- Get the partlist and the response type for a given problem. --- #--- Indicate if a response type is coded handgraded or not. --- sub response_type { - my ($symb) = shift; + my ($symb,$response_error) = @_; my $navmap = Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + if (ref($response_error)) { + $$response_error = 1; + } + return; + } my $res = $navmap->getBySymb($symb); + unless (ref($res)) { + $$response_error = 1; + return; + } my $partlist = $res->parts(); my %vPart = map { $_ => 1 } (&Apache::loncommon::get_env_multiple('form.vPart')); @@ -194,37 +210,49 @@ sub get_display_part { #--- Show resource title #--- and parts and response type sub showResourceInfo { - my ($symb,$probTitle,$checkboxes) = @_; - my $col=3; - if ($checkboxes) { $col=4; } + my ($symb,$probTitle,$checkboxes,$res_error) = @_; my $result = '<h3>'.&mt('Current Resource').': '.$probTitle.'</h3>'."\n"; - $result .='<table border="0">'; - my ($partlist,$handgrade,$responseType) = &response_type($symb); + my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error); + if (ref($res_error)) { + if ($$res_error) { + return; + } + } + $result.=&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row(); + if ($checkboxes) { + $result.='<th> </th>'; + } + $result.='<th>'.&mt('Problem Part').'</th>' + .'<th>'.&mt('Res. ID').'</th>' + .'<th>'.&mt('Type').'</th>' + .&Apache::loncommon::end_data_table_header_row(); my %resptype = (); my $hdgrade='no'; my %partsseen; foreach my $partID (sort(keys(%$responseType))) { - foreach my $resID (sort(keys(%{ $responseType->{$partID} }))) { - my $handgrade=$$handgrade{$partID.'_'.$resID}; - my $responsetype = $responseType->{$partID}->{$resID}; - $hdgrade = $handgrade if ($handgrade eq 'yes'); - $result.='<tr>'; - if ($checkboxes) { - if (exists($partsseen{$partID})) { - $result.="<td> </td>"; - } else { - $result.="<td><input type='checkbox' name='vPart' value='$partID' checked='checked' /></td>"; - } - $partsseen{$partID}=1; - } - my $display_part=&get_display_part($partID,$symb); - $result.='<td><b>'.&mt('Part: [_1]',$display_part).'</b>'. - ' <span class="LC_internal_info">'.$resID.'</span></td>'. - '<td><b>'.&mt('Type: [_1]',$responsetype).'</b></td></tr>'; -# '<td>'.&mt('<b>Handgrade: </b>[_1]',$handgrade).'</td></tr>'; - } + foreach my $resID (sort(keys(%{ $responseType->{$partID} }))) { + my $handgrade=$$handgrade{$partID.'_'.$resID}; + my $responsetype = $responseType->{$partID}->{$resID}; + $hdgrade = $handgrade if ($handgrade eq 'yes'); + $result.=&Apache::loncommon::start_data_table_row(); + if ($checkboxes) { + if (exists($partsseen{$partID})) { + $result.="<td> </td>"; + } else { + $result.="<td><input type='checkbox' name='vPart' value='$partID' checked='checked' /></td>"; + } + $partsseen{$partID}=1; + } + my $display_part=&get_display_part($partID,$symb); + $result.='<td>'.$display_part.'</td>' + .'<td>'.'<span class="LC_internal_info">'.$resID.'</span></td>' + .'<td>'.&mt($responsetype).'</td>' +# .'<td>'.&mt('<b>Handgrade: </b>[_1]',$handgrade).'</td>' + .&Apache::loncommon::end_data_table_row(); + } } - $result.='</table>'."\n"; + $result.=&Apache::loncommon::end_data_table(); return $result,$responseType,$hdgrade,$partlist,$handgrade; } @@ -397,7 +425,7 @@ sub cleanRecord { return '<blockquote><table border="1">'. '<tr valign="top"><td>'.&mt('Answer').'</td>'.$toprow.'</tr>'. '<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. - $grayFont.$bottomrow.'</tr>'.'</table></blockquote>'; + $bottomrow.'</tr>'.'</table></blockquote>'; } elsif ($response eq 'essay') { if (! exists ($env{'form.'.$symb})) { my (%keyhash) = &Apache::lonnet::dump('nohist_handgrade', @@ -459,8 +487,7 @@ sub cleanRecord { #-- A couple of common js functions sub commonJSfunctions { my $request = shift; - $request->print(<<COMMONJSFUNCTIONS); -<script type="text/javascript" language="javascript"> + $request->print(&Apache::lonhtmlcommon::scripttag(<<COMMONJSFUNCTIONS)); function radioSelection(radioButton) { var selection=null; if (radioButton.length > 1) { @@ -488,7 +515,6 @@ sub commonJSfunctions { return selectOne.value; } } -</script> COMMONJSFUNCTIONS } @@ -643,13 +669,13 @@ sub student_gradeStatus { sub jscriptNform { my ($symb) = @_; my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); - my $jscript='<script type="text/javascript" language="javascript">'."\n". + my $jscript= &Apache::lonhtmlcommon::scripttag( ' function viewOneStudent(user,domain) {'."\n". ' document.onestudent.student.value = user;'."\n". ' document.onestudent.userdom.value = domain;'."\n". ' document.onestudent.submit();'."\n". ' }'."\n". - '</script>'."\n"; + "\n"); $jscript.= '<form action="/adm/grades" method="post" name="onestudent">'."\n". '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n". @@ -755,7 +781,7 @@ sub verifyreceipt { my $title.= '<h3><span class="LC_info">'. - &mt('Verifying Receipt No. [_1]',$receipt). + &mt('Verifying Receipt No. [_1]',$receipt). '</span></h3>'."\n". '<h4>'.&mt('<b>Resource: </b>[_1]',$env{'form.probTitle'}). '</h4>'."\n"; @@ -767,7 +793,13 @@ sub verifyreceipt { if ($env{"course.$courseid.receiptalg"} eq 'receipt2' || $env{"course.$courseid.receiptalg"} eq 'receipt3') { $receiptparts=1; } my $parts=['0']; - if ($receiptparts) { ($parts)=&response_type($symb); } + if ($receiptparts) { + my $res_error; + ($parts)=&response_type($symb,\$res_error); + if ($res_error) { + return &navmap_errormsg(); + } + } my $header = &Apache::loncommon::start_data_table(). @@ -809,11 +841,14 @@ sub verifyreceipt { } } if ($matches == 0) { - $string = $title.&mt('No match found for the above receipt.'); + $string = $title + .'<p class="LC_warning">' + .&mt('No match found for the above receipt number.') + .'</p>'; } else { $string = &jscriptNform($symb).$title. '<p>'. - &mt('The above receipt matches the following [numerate,_1,student].',$matches). + &mt('The above receipt number matches the following [quant,_1,student].',$matches). '</p>'. $header. $contents. @@ -849,8 +884,7 @@ sub listStudents { 'multiple' => 'Please select a student or group of students before clicking on the Next button.', 'single' => 'Please select the student before clicking on the Next button.', ); - $request->print(<<LISTJAVASCRIPT); -<script type="text/javascript" language="javascript"> + $request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT)); function checkSelect(checkBox) { var ctr=0; var sense=""; @@ -879,7 +913,6 @@ sub listStudents { formname.command.value = 'submission'; formname.submit(); } -</script> LISTJAVASCRIPT &commonJSfunctions($request); @@ -911,10 +944,18 @@ LISTJAVASCRIPT my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status; $env{'form.Status'} = $saveStatus; $submission_options.= - '<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '.&mt('last submission only').' </label>'."\n". - '<label><input type="radio" name="lastSub" value="last" /> '.&mt('last submission & parts info').' </label>'."\n". - '<label><input type="radio" name="lastSub" value="datesub" /> '.&mt('by dates and submissions').' </label>'."\n". - '<label><input type="radio" name="lastSub" value="all" /> '.&mt('all details').'</label>'; + '<span class="LC_nobreak">'. + '<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '. + &mt('last submission only').' </label></span>'."\n". + '<span class="LC_nobreak">'. + '<label><input type="radio" name="lastSub" value="last" /> '. + &mt('last submission & parts info').' </label></span>'."\n". + '<span class="LC_nobreak">'. + '<label><input type="radio" name="lastSub" value="datesub" /> '. + &mt('by dates and submissions').'</label></span>'."\n". + '<span class="LC_nobreak">'. + '<label><input type="radio" name="lastSub" value="all" /> '. + &mt('all details').'</label></span>'; $gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Submissions')) .$submission_options .&Apache::lonhtmlcommon::row_closure(); @@ -960,8 +1001,8 @@ LISTJAVASCRIPT # checkall buttons $gradeTable.=&check_script('gradesub', 'stuinfo'); $gradeTable.='<input type="button" '."\n". - 'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n". - 'value="'.&mt('Next').' →" /> <br />'."\n"; + 'onclick="javascript:checkSelect(this.form.stuinfo);" '."\n". + 'value="'.&mt('Next').' →" /> <br />'."\n"; $gradeTable.=&check_buttons(); my ($classlist, undef, $fullname) = &getclasslist($getsec,'1',$getgroup); $gradeTable.= &Apache::loncommon::start_data_table(). @@ -1078,9 +1119,9 @@ LISTJAVASCRIPT } $gradeTable.=&Apache::loncommon::end_data_table()."\n". - '<input type="button" '. - 'onClick="javascript:checkSelect(this.form.stuinfo);" '. - 'value="'.&mt('Next').' →" /></form>'."\n"; + '<input type="button" '. + 'onclick="javascript:checkSelect(this.form.stuinfo);" '. + 'value="'.&mt('Next').' →" /></form>'."\n"; if ($ctr == 0) { my $num_students=(scalar(keys(%$fullname))); if ($num_students eq 0) { @@ -1107,7 +1148,7 @@ LISTJAVASCRIPT sub check_script { my ($form, $type)=@_; - my $chkallscript='<script type="text/javascript"> + my $chkallscript= &Apache::lonhtmlcommon::scripttag(' function checkall() { for (i=0; i<document.forms.'.$form.'.elements.length; i++) { ele = document.forms.'.$form.'.elements[i]; @@ -1138,7 +1179,7 @@ sub check_script { } } -</script>'."\n"; +'."\n"); return $chkallscript; } @@ -1177,8 +1218,7 @@ sub processGroup { sub sub_page_js { my $request = shift; my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); - $request->print(<<SUBJAVASCRIPT); -<script type="text/javascript" language="javascript"> + $request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); function updateRadio(formname,id,weight) { var gradeBox = formname["GD_BOX"+id]; var radioButton = formname["RADVAL"+id]; @@ -1346,7 +1386,6 @@ sub sub_page_js { formname.submit(); } -</script> SUBJAVASCRIPT } @@ -1356,8 +1395,7 @@ sub sub_page_kw_js { my $iconpath = $request->dir_config('lonIconsURL'); &commonJSfunctions($request); - my $inner_js_msg_central=<<INNERJS; - <script text="text/javascript"> + my $inner_js_msg_central= &Apache::lonhtmlcommon::scripttag(<<INNERJS); function checkInput() { opener.document.SCORE.msgsub.value = opener.checkEntities(document.msgcenter.msgsub.value); var nmsg = opener.document.SCORE.savemsgN.value; @@ -1394,11 +1432,9 @@ sub sub_page_kw_js { self.close() } - </script> INNERJS - my $inner_js_highlight_central=<<INNERJS; - <script type="text/javascript"> + my $inner_js_highlight_central= &Apache::lonhtmlcommon::scripttag(<<INNERJS); function updateChoice(flag) { opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr); opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize); @@ -1409,7 +1445,6 @@ INNERJS } self.close() } -</script> INNERJS my $start_page_msg_central = @@ -1433,8 +1468,7 @@ INNERJS my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); $docopen=~s/^document\.//; my $alertmsg = &mt('Please select a word or group of words from document and then click this link.'); - $request->print(<<SUBJAVASCRIPT); -<script type="text/javascript" language="javascript"> + $request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); //===================== Show list of keywords ==================== function keywords(formname) { @@ -1584,8 +1618,8 @@ INNERJS pDoc = pWin.document; pDoc.write("<\\/table>"); pDoc.write("<\\/td><\\/tr><\\/table> "); - pDoc.write("<input type=\\"button\\" value=\\"Save\\" onClick=\\"javascript:checkInput()\\"> "); - pDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onClick=\\"self.close()\\"><br /><br />"); + pDoc.write("<input type=\\"button\\" value=\\"Save\\" onclick=\\"javascript:checkInput()\\"> "); + pDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onclick=\\"self.close()\\"><br /><br />"); pDoc.write("<\\/form>"); pDoc.write('$end_page_msg_central'); pDoc.close(); @@ -1658,14 +1692,13 @@ INNERJS var hDoc = hwdWin.document; hDoc.write("<\\/table>"); hDoc.write("<\\/td><\\/tr><\\/table> "); - hDoc.write("<input type=\\"button\\" value=\\"Save\\" onClick=\\"javascript:updateChoice(1)\\"> "); - hDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onClick=\\"self.close()\\"><br /><br />"); + hDoc.write("<input type=\\"button\\" value=\\"Save\\" onclick=\\"javascript:updateChoice(1)\\"> "); + hDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onclick=\\"self.close()\\"><br /><br />"); hDoc.write("<\\/form>"); hDoc.write('$end_page_highlight_central'); hDoc.close(); } -</script> SUBJAVASCRIPT } @@ -1678,6 +1711,25 @@ sub get_increment { return $increment; } +sub gradeBox_start { + return ( + &Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'<th>'.&mt('Part').'</th>' + .'<th>'.&mt('Points').'</th>' + .'<th> </th>' + .'<th>'.&mt('Assign Grade').'</th>' + .'<th>'.&mt('Weight').'</th>' + .'<th>'.&mt('Grade Status').'</th>' + .&Apache::loncommon::end_data_table_header_row() + ); +} + +sub gradeBox_end { + return ( + &Apache::loncommon::end_data_table() + ); +} #--- displays the grading box, used in essay type problem and grading by page/sequence sub gradeBox { my ($request,$symb,$uname,$udom,$counter,$partid,$record) = @_; @@ -1697,7 +1749,7 @@ sub gradeBox { if ($last_resets{$partid}) { $aggtries = &get_num_tries($record,$last_resets{$partid},$partid); } - $result.='<table border="0"><tr>'; + $result.=&Apache::loncommon::start_data_table_row(); my $ctr = 0; my $thisweight = 0; my $increment = &get_increment(); @@ -1705,7 +1757,7 @@ sub gradeBox { my $radio.='<table border="0"><tr>'."\n"; # display radio buttons in a nice table 10 across while ($thisweight<=$wgt) { $radio.= '<td><span class="LC_nobreak"><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '. - 'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','. + 'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','. $thisweight.')" value="'.$thisweight.'" '. ($score eq $thisweight ? 'checked="checked"':'').' /> '.$thisweight."</label></span></td>\n"; $radio.=(($ctr+1)%10 == 0 ? '</tr><tr>' : ''); @@ -1716,13 +1768,13 @@ sub gradeBox { my $line.='<input type="text" name="GD_BOX'.$counter.'_'.$partid.'"'. ($score ne ''? ' value = "'.$score.'"':'').' size="4" '. - 'onChange="javascript:updateRadio(this.form,\''.$counter.'_'.$partid.'\','. + 'onchange="javascript:updateRadio(this.form,\''.$counter.'_'.$partid.'\','. $wgt.')" /></td>'."\n"; $line.='<td>/'.$wgt.' '.$wgtmsg. ($$record{'resource.'.$partid.'.solved'} eq 'correct_by_student' ? ' '.$checkIcon : ''). - ' </td><td><b>'.&mt('Grade Status').':</b>'."\n"; - $line.='<select name="GD_SEL'.$counter.'_'.$partid.'" '. - 'onChange="javascript:clearRadBox(this.form,\''.$counter.'_'.$partid.'\')" >'."\n"; + ' </td>'."\n"; + $line.='<td><select name="GD_SEL'.$counter.'_'.$partid.'" '. + 'onchange="javascript:clearRadBox(this.form,\''.$counter.'_'.$partid.'\')" >'."\n"; if ($$record{'resource.'.$partid.'.solved'} eq 'excused') { $line.='<option></option>'. '<option value="excused" selected="selected">'.&mt('excused').'</option>'; @@ -1735,9 +1787,8 @@ sub gradeBox { #&mt('<td><b>Part:</b></td><td>[_1]</td><td><b>Points:</b></td><td>[_2]</td><td>or</td><td>[_3]</td>',$display_part,$radio,$line); $result .= - '<td><b>'.&mt('Part:').'</b></td><td>'.$display_part.'</td><td><b>'.&mt('Points:').'</b></td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>'. - - $result.='</tr></table>'."\n"; + '<td>'.$display_part.'</td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>'; + $result.=&Apache::loncommon::end_data_table_row(); $result.='<input type="hidden" name="stores'.$counter.'_'.$partid.'" value="" />'."\n". '<input type="hidden" name="oldpts'.$counter.'_'.$partid.'" value="'.$score.'" />'."\n". '<input type="hidden" name="solved'.$counter.'_'.$partid.'" value="'. @@ -1746,13 +1797,17 @@ sub gradeBox { $$record{'resource.'.$partid.'.tries'}.'" />'."\n". '<input type="hidden" name="aggtries'.$counter.'_'.$partid.'" value="'. $aggtries.'" />'."\n"; - $result.=&handback_box($symb,$uname,$udom,$counter,$partid,$record); + my $res_error; + $result.=&handback_box($symb,$uname,$udom,$counter,$partid,$record,\$res_error); + if ($res_error) { + return &navmap_errormsg(); + } return $result; } sub handback_box { - my ($symb,$uname,$udom,$counter,$partid,$record) = @_; - my ($partlist,$handgrade,$responseType) = &response_type($symb); + my ($symb,$uname,$udom,$counter,$partid,$record,$res_error) = @_; + my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error); my (@respids); my @part_response_id = &flatten_responseType($responseType); foreach my $part_response_id (@part_response_id) { @@ -1814,26 +1869,23 @@ sub show_problem { $companswer=~s|name="submit"|name="would_have_been_submit"|g; } $rendered= - '<div class="LC_grade_show_problem_header">'. - &mt('View of the problem'). - '</div><div class="LC_grade_show_problem_problem">'. - $rendered. - '</div>'; + '<div class="LC_Box">' + .'<h3 class="LC_hcell">'.&mt('View of the problem').'</h3>' + .$rendered + .'</div>'; $companswer= - '<div class="LC_grade_show_problem_header">'. - &mt('Correct answer'). - '</div><div class="LC_grade_show_problem_problem">'. - $companswer. - '</div>'; + '<div class="LC_Box">' + .'<h3 class="LC_hcell">'.&mt('Correct answer').'</h3>' + .$companswer + .'</div>'; my $result; if ($mode eq 'both') { - $result=$rendered.$companswer; + $result=$rendered.$companswer; } elsif ($mode eq 'text') { - $result=$rendered; + $result=$rendered; } elsif ($mode eq 'answer') { - $result=$companswer; + $result=$companswer; } - $result='<div class="LC_grade_show_problem">'.$result.'</div>'; return $result; } @@ -2011,7 +2063,7 @@ sub submission { $request->print(<<KEYWORDS); <b>Keyword Options:</b> <a href="javascript:keywords(document.SCORE);" target="_self">List</a> -<a href="#" onMouseDown="javascript:getSel(); return false" +<a href="#" onmousedown="javascript:getSel(); return false" CLASS="page">Paste Selection to List</a> <a href="javascript:kwhighlight();" target="_self">Highlight Attribute</a><br /><br /> KEYWORDS @@ -2027,12 +2079,31 @@ KEYWORDS } # This is where output for one specific student would start - my $add_class = ($counter%2) ? 'LC_grade_show_user_odd_row' : ''; - $request->print("\n\n". - '<div class="LC_grade_show_user '.$add_class.'">'. - '<div class="LC_grade_user_name">'.&nameUserString(undef,$env{'form.fullname'},$uname,$udom).'</div>'. - '<div class="LC_grade_show_user_body">'."\n"); + my $add_class = ($counter%2) ? ' LC_grade_show_user_odd_row' : ''; + $request->print( + "\n\n" + .'<div class="LC_grade_show_user'.$add_class.'">' + .'<h2>'.&nameUserString(undef,$env{'form.fullname'},$uname,$udom).'</h2>' + ."\n" + ); + # Show additional functions if allowed + if ($perm{'vgr'}) { + $request->print( + &Apache::loncommon::track_student_link( + &mt('View recent activity'), + $uname,$udom,'check') + .' ' + ); + } + if ($perm{'opa'}) { + $request->print( + &Apache::loncommon::pprmlink( + &mt('Set/Change parameters'), + $uname,$udom,$symb,'check')); + } + + # Show Problem if ($env{'form.vProb'} eq 'all' or $env{'form.vAns'} eq 'all') { my $mode; if ($env{'form.vProb'} eq 'all' && $env{'form.vAns'} eq 'all') { @@ -2047,24 +2118,26 @@ KEYWORDS } my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$udom,$uname); - my ($partlist,$handgrade,$responseType) = &response_type($symb); + my $res_error; + my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error); + if ($res_error) { + $request->print(&navmap_errormsg()); + return; + } # Display student info $request->print(($counter == 0 ? '' : '<br />')); - my $result='<div class="LC_grade_submissions">'; - - $result.='<div class="LC_grade_submissions_header">'; - $result.= &mt('Submissions'); + + my $result='<div class="LC_Box">' + .'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>'; $result.='<input type="hidden" name="name'.$counter. - '" value="'.$env{'form.fullname'}.'" />'."\n"; + '" value="'.$env{'form.fullname'}.'" />'."\n"; if ($env{'form.handgrade'} eq 'no') { - $result.='<span class="LC_grade_check_note">'. - &mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon)."</span>\n"; - + $result.='<p class="LC_info">' + .&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon) + ."</p>\n"; } - - # If any part of the problem is an essay-response (handgraded), then check for collaborators my $fullname; my $col_fullnames = []; @@ -2075,9 +2148,9 @@ KEYWORDS $result.=$sub_result; } $request->print($result."\n"); - $request->print('</div>'."\n"); + # print student answer/submission - # Options are (1) Handgaded submission only + # Options are (1) Handgraded submission only # (2) Last submission, includes submission that is not handgraded # (for multi-response type part) # (3) Last submission plus the parts info @@ -2087,10 +2160,12 @@ KEYWORDS my $lastsubonly; - if ($$timestamp eq '') { - $lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; - } else { - $lastsubonly = '<div class="LC_grade_submissions_body"> <b>Date Submitted:</b> '.$$timestamp."\n"; + if ($$timestamp eq '') { + $lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; + } else { + $lastsubonly = + '<div class="LC_grade_submissions_body">' + .'<b>'.&mt('Date Submitted:').'</b> '.$$timestamp."\n"; my %seenparts; my @part_response_id = &flatten_responseType($responseType); @@ -2117,7 +2192,7 @@ KEYWORDS $lastsubonly.="\n".'<div class="LC_grade_submission_part">'. '<b>'.&mt('Part: [_1]',$display_part).'</b>'. ' <span class="LC_internal_info">'. - '('.&mt('Part ID: [_1]',$respid).')</b>'. + '('.&mt('Part ID: [_1]',$respid).')'. '</span> '. '<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br /><br /></div>'; next; @@ -2125,7 +2200,7 @@ KEYWORDS foreach my $submission (@$string) { my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; } - my ($ressub,$subval) = split(/:/,$submission,2); + my ($ressub,$hide,$subval) = split(/:/,$submission,3); # Similarity check my $similar=''; if($env{'form.checkPlag'}){ @@ -2137,16 +2212,21 @@ KEYWORDS &Apache::lonnet::coursedescription($ocrsid, {'one_time' => 1}); - $similar="<hr /><h3><span class=\"LC_warning\">". - &mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', - $osim, - &Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', - $old_course_desc{'description'}, - $old_course_desc{'num'}, - $old_course_desc{'domain'}). - '</span></h3><blockquote><i>'. - &keywords_highlight($oessay). - '</i></blockquote><hr />'; + if ($hide) { + $similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'. + &mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; + } else { + $similar="<hr /><h3><span class=\"LC_warning\">". + &mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', + $osim, + &Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', + $old_course_desc{'description'}, + $old_course_desc{'num'}, + $old_course_desc{'domain'}). + '</span></h3><blockquote><i>'. + &keywords_highlight($oessay). + '</i></blockquote><hr />'; + } } } my $order=&get_order($partid,$respid,$symb,$uname,$udom); @@ -2158,27 +2238,33 @@ KEYWORDS '<b>'.&mt('Part: [_1]',$display_part).'</b>'. ' <span class="LC_internal_info">'. '('.&mt('Part ID: [_1]',$respid).')'. - '</b></span> '; + '</span> '; my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record); if (@$files) { - $lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />'; - my $file_counter = 0; - foreach my $file (@$files) { - $file_counter++; - &Apache::lonnet::allowuploaded('/adm/grades',$file); - $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" /> '.$file.'</a>'; - } + if ($hide) { + $lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files})); + } else { + $lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />'; + foreach my $file (@$files) { + &Apache::lonnet::allowuploaded('/adm/grades',$file); + $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" /> '.$file.'</a>'; + } + } $lastsubonly.='<br />'; } - $lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'. - &cleanRecord($subval,$responsetype,$symb,$partid, - $respid,\%record,$order,undef,$uname,$udom); + if ($hide) { + $lastsubonly.='<b>'.&mt('Anonymous Survey').'</b>'; + } else { + $lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'. + &cleanRecord($subval,$responsetype,$symb,$partid, + $respid,\%record,$order,undef,$uname,$udom); + } if ($similar) {$lastsubonly.="<br /><br />$similar\n";} $lastsubonly.='</div>'; } } } - $lastsubonly.='</div>'."\n"; + $lastsubonly.='</div>'."\n"; # End: LC_grade_submissions_body } $request->print($lastsubonly); } elsif ($env{'form.lastSub'} eq 'datesub') { @@ -2196,7 +2282,7 @@ KEYWORDS # return if view submission with no grading option if ($env{'form.showgrading'} eq '' || (!&canmodify($usec))) { my $toGrade.='<input type="button" value="Grade Student" '. - 'onClick="javascript:checksubmit(this.form,\'Grade Student\',\'' + 'onclick="javascript:checksubmit(this.form,\'Grade Student\',\'' .$counter.'\');" target="_self" /> '."\n" if (&canmodify($usec)); $toGrade.='</div>'."\n"; if (($env{'form.command'} eq 'submission') || @@ -2240,11 +2326,11 @@ KEYWORDS my @partlist; my @gradePartRespid; my @part_response_id = &flatten_responseType($responseType); - $request->print('<div class="LC_grade_assign">'. - - '<div class="LC_grade_assign_header">'. - &mt('Assign Grades').'</div>'. - '<div class="LC_grade_assign_body">'); + $request->print( + '<div class="LC_Box">' + .'<h3 class="LC_hcell">'.&mt('Assign Grades').'</h3>' + ); + $request->print(&gradeBox_start()); foreach my $part_response_id (@part_response_id) { my ($partid,$respid) = @{ $part_response_id }; my $part_resp = join('_',@{ $part_response_id }); @@ -2256,19 +2342,10 @@ KEYWORDS push(@gradePartRespid,$partid.'.'.$respid); $request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record)); } - $request->print('</div></div>'); + $request->print(&gradeBox_end()); # </div> + $request->print('</div>'); $request->print('<div class="LC_grade_info_links">'); - if ($perm{'vgr'}) { - $request->print( - &Apache::loncommon::track_student_link(&mt('View recent activity'), - $uname,$udom,'check')); - } - if ($perm{'opa'}) { - $request->print( - &Apache::loncommon::pprmlink(&mt('Set/Change parameters'), - $uname,$udom,$symb,'check')); - } $request->print('</div>'); $result='<input type="hidden" name="partlist'.$counter. @@ -2285,15 +2362,14 @@ KEYWORDS # Done with printing info for one student - $request->print('</div>');#LC_grade_show_user_body $request->print('</div>');#LC_grade_show_user # print end of form if ($counter == $total) { - my $endform='<table border="0"><tr><td>'."\n"; + my $endform='<br /><hr /><table border="0"><tr><td>'."\n"; $endform.='<input type="button" value="'.&mt('Save & Next').'" '. - 'onClick="javascript:checksubmit(this.form,\'Save & Next\','. + 'onclick="javascript:checksubmit(this.form,\'Save & Next\','. $total.','.scalar(@partlist).');" target="_self" /> '."\n"; my $ntstu ='<select name="NTSTU">'. '<option>1</option><option>2</option>'. @@ -2301,12 +2377,14 @@ KEYWORDS '<option>7</option><option>10</option></select>'."\n"; my $nsel = ($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : '1'); $ntstu =~ s/<option>$nsel</<option selected="selected">$nsel</; - $endform.=&mt('[quant,_1,student]',$ntstu); + $endform.=&mt('[_1]student(s)',$ntstu); $endform.=' <input type="button" value="'.&mt('Previous').'" '. - 'onClick="javascript:checksubmit(this.form,\'Previous\');" target="_self" /> '."\n". + 'onclick="javascript:checksubmit(this.form,\'Previous\');" target="_self" /> '."\n". '<input type="button" value="'.&mt('Next').'" '. - 'onClick="javascript:checksubmit(this.form,\'Next\');" target="_self" /> '; - $endform.=&mt('(Next and Previous (student) do not save the scores.)')."\n" ; + 'onclick="javascript:checksubmit(this.form,\'Next\');" target="_self" /> '; + $endform.='<span class="LC_warning">'. + &mt('(Next and Previous (student) do not save the scores.)'). + '</span>'."\n" ; $endform.="<input type='hidden' value='".&get_increment(). "' name='increment' />"; $endform.='</td></tr></table></form>'; @@ -2375,7 +2453,7 @@ sub check_collaborators { #--- Retrieve the last submission for all the parts sub get_last_submission { my ($returnhash)=@_; - my (@string,$timestamp); + my (@string,$timestamp,%lasthidden); if ($$returnhash{'version'}) { my %lasthash=(); my ($version); @@ -2387,13 +2465,39 @@ sub get_last_submission { &Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'}); } } + my %typeparts; + my $showsurv = + &Apache::lonnet::allowed('vas',$env{'request.course.id'}); + foreach my $key (sort(keys(%lasthash))) { + if ($key =~ /\.type$/) { + if (($lasthash{$key} eq 'anonsurvey') || + ($lasthash{$key} eq 'anonsurveycred')) { + my ($ign,@parts) = split(/\./,$key); + pop(@parts); + unless ($showsurv) { + my $id = join(',',@parts); + $typeparts{$ign.'.'.$id} = $lasthash{$key}; + } + delete($lasthash{$key}); + } + } + } + my @hidden = keys(%typeparts); foreach my $key (keys(%lasthash)) { next if ($key !~ /\.submission$/); - + my $hide; + if (@hidden) { + foreach my $id (@hidden) { + if ($key =~ /^\Q$id\E/) { + $hide = 1; + last; + } + } + } my ($partid,$foo) = split(/submission$/,$key); my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? '<span class="LC_warning">Draft Copy</span> ' : ''; - push(@string, join(':', $key, $draft.$lasthash{$key})); + push(@string, join(':', $key, $hide, $draft.$lasthash{$key})); } } if (!@string) { @@ -2598,7 +2702,12 @@ sub processHandGrade { } $ctr = 0; @parsedlist = reverse @parsedlist if ($button eq 'Previous'); - my ($partlist) = &response_type($symb); + my $res_error; + my ($partlist) = &response_type($symb,\$res_error); + if ($res_error) { + $request->print(&navmap_errormsg()); + return; + } foreach my $student (@parsedlist) { my $submitonly=$env{'form.submitonly'}; my ($uname,$udom) = split(/:/,$student); @@ -2796,8 +2905,12 @@ sub check_and_remove_from_queue { sub handback_files { my ($request,$symb,$stuname,$domain,$newflg,$new_part,$newrecord) = @_; my $portfolio_root = '/userfiles/portfolio'; - my ($partlist,$handgrade,$responseType) = &response_type($symb); - + my $res_error; + my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error); + if ($res_error) { + $request->print('<br />'.&navmap_errormsg().'<br />'); + return; + } my @part_response_id = &flatten_responseType($responseType); foreach my $part_response_id (@part_response_id) { my ($part_id,$resp_id) = @{ $part_response_id }; @@ -3045,8 +3158,7 @@ sub viewgrades_js { my ($request) = shift; my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); - $request->print(<<VIEWJAVASCRIPT); -<script type="text/javascript" language="javascript"> + $request->print(&Apache::lonhtmlcommon::scripttag(<<VIEWJAVASCRIPT)); function writePoint(partid,weight,point) { var radioButton = document.classgrade["RADVAL_"+partid]; var textbox = document.classgrade["TEXTVAL_"+partid]; @@ -3207,7 +3319,6 @@ sub viewgrades_js { } } -</script> VIEWJAVASCRIPT } @@ -3255,7 +3366,11 @@ sub viewgrades { $result.= '<h3>'.$common_header.'</h3>'.&Apache::loncommon::start_data_table(); #radio buttons/text box for assigning points for a section or class. #handles different parts of a problem - my ($partlist,$handgrade,$responseType) = &response_type($symb); + my $res_error; + my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error); + if ($res_error) { + return &navmap_errormsg(); + } my %weight = (); my $ctsparts = 0; my %seen = (); @@ -3281,11 +3396,11 @@ sub viewgrades { } $radio.='</tr></table>'; my $line = '<input type="text" name="TEXTVAL_'. - $partid.'" size="4" '.'onChange="javascript:writePoint(\''. + $partid.'" size="4" '.'onchange="javascript:writePoint(\''. $partid.'\','.$weight{$partid}.',\'textval\')" /> /'. $weight{$partid}.' '.&mt('(problem weight)').'</td>'."\n"; $line.= '<td><b>'.&mt('Grade Status').':</b><select name="SELVAL_'.$partid.'"'. - 'onChange="javascript:writeRadText(\''.$partid.'\','. + 'onchange="javascript:writeRadText(\''.$partid.'\','. $weight{$partid}.')"> '. '<option selected="selected"> </option>'. '<option value="excused">'.&mt('excused').'</option>'. @@ -3306,7 +3421,7 @@ sub viewgrades { $result.=&Apache::loncommon::end_data_table()."\n". '<input type="hidden" name="totalparts" value="'.$ctsparts.'" />'; $result.='<input type="button" value="'.&mt('Revert to Default').'" '. - 'onClick="javascript:resetEntry('.$ctsparts.');" />'; + 'onclick="javascript:resetEntry('.$ctsparts.');" />'; #table listing all the students in a section/class #header of table @@ -3315,7 +3430,11 @@ sub viewgrades { &Apache::loncommon::start_data_table_header_row(). '<th>'.&mt('No.').'</th>'. '<th>'.&nameUserString('header')."</th>\n"; - my (@parts) = sort(&getpartlist($symb)); + my $partserror; + my (@parts) = sort(&getpartlist($symb,\$partserror)); + if ($partserror) { + return &navmap_errormsg(); + } my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); my @partids = (); foreach my $part (@parts) { @@ -3366,7 +3485,7 @@ sub viewgrades { $result.=&Apache::loncommon::end_data_table(); $result.='<input type="hidden" name="total" value="'.$ctr.'" />'."\n"; $result.='<input type="button" value="'.&mt('Save').'" '. - 'onClick="javascript:submit();" target="_self" /></form>'."\n"; + 'onclick="javascript:submit();" target="_self" /></form>'."\n"; if (scalar(%$fullname) eq 0) { my $colspan=3+scalar(@parts); my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); @@ -3418,7 +3537,7 @@ sub viewstudentgrade { 'GD_'.$student.'_'.$part.'_awarded_s" value="'.$pts.'" />'."\n"; $result.='<input type="text" name="'. 'GD_'.$student.'_'.$part.'_awarded" '. - 'onChange="javascript:changeSelect(\''.$part.'\',\''.$student. + 'onchange="javascript:changeSelect(\''.$part.'\',\''.$student. '\')" value="'.$pts.'" size="4" /></td>'."\n"; } elsif ($type eq 'solved') { my ($status,$foo)=split(/_/,$score,2); @@ -3427,7 +3546,7 @@ sub viewstudentgrade { $part.'_solved_s" value="'.$status.'" />'."\n"; $result.=' <select name="'. 'GD_'.$student.'_'.$part.'_solved" '. - 'onChange="javascript:changeOneScore(\''.$part.'\',\''.$student.'\')" >'."\n"; + 'onchange="javascript:changeOneScore(\''.$part.'\',\''.$student.'\')" >'."\n"; $result.= (($status eq 'excused') ? '<option> </option><option selected="selected" value="excused">'.&mt('excused').'</option>' : '<option selected="selected"> </option><option value="excused">'.&mt('excused').'</option>')."\n"; $result.='<option value="reset status">'.&mt('reset status').'</option>'; @@ -3465,6 +3584,7 @@ sub editgrades { 'incorrect'=>'incorrect_by_override', 'excused' =>'excused', 'ungraded' =>'ungraded_attempted', + 'credited' =>'credit_attempted', 'nothing' => '', ); my ($classlist,undef,$fullname) = &getclasslist($env{'form.section'},'0'); @@ -3474,7 +3594,11 @@ sub editgrades { my %columns = (); my ($i,$ctr,$count,$rec_update) = (0,0,0,0); - my (@parts) = sort(&getpartlist($symb)); + my $partserror; + my (@parts) = sort(&getpartlist($symb,\$partserror)); + if ($partserror) { + return &navmap_errormsg(); + } my $header; while ($ctr < $env{'form.totalparts'}) { my $partid = $env{'form.partid_'.$ctr}; @@ -3783,7 +3907,7 @@ $result Total number of records found in file: $distotal <hr /> Enter as many fields as you can. The system will inform you and bring you back to this page if the data selected is insufficient to run your class.<hr /> -<input type="button" value="Reverse Association" onClick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" /> +<input type="button" value="Reverse Association" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" /> <label><input type="checkbox" name="noFirstLine" $checked />$ignore</label> <input type="hidden" name="associate" value="" /> <input type="hidden" name="phase" value="three" /> @@ -3797,17 +3921,21 @@ to this page if the data selected is ins <input type="hidden" name="probTitle" value="$env{'form.probTitle'}" /> <input type="hidden" name="command" value="csvuploadoptions" /> <hr /> -<script type="text/javascript" language="Javascript"> -$javascript -</script> ENDPICK + $request->print(&Apache::lonhtmlcommon::scripttag($javascript)); return ''; } sub csvupload_fields { - my ($symb) = @_; - my (@parts) = &getpartlist($symb); + my ($symb,$errorref) = @_; + my (@parts) = &getpartlist($symb,$errorref); + if (ref($errorref)) { + if ($$errorref) { + return; + } + } + my @fields=(['ID','Student/Employee ID'], ['username','Student Username'], ['domain','Student Domain']); @@ -3832,15 +3960,14 @@ sub csvuploadmap_footer { </table> <input type="hidden" name="nfields" value="$i" /> <input type="hidden" name="keyfields" value="$keyfields" /> -<input type="button" onClick="javascript:verify(this.form)" value="Assign Grades" /><br /> +<input type="button" onclick="javascript:verify(this.form)" value="Assign Grades" /><br /> </form> ENDPICK } sub checkforfile_js { my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); - my $result =<<CSVFORMJS; -<script type="text/javascript" language="javascript"> + my $result = &Apache::lonhtmlcommon::scripttag(<<CSVFORMJS); function checkUpload(formname) { if (formname.upfile.value == "") { alert("$alertmsg"); @@ -3848,7 +3975,6 @@ sub checkforfile_js { } formname.submit(); } - </script> CSVFORMJS return $result; } @@ -3877,7 +4003,7 @@ sub upcsvScores_form { <input type="hidden" name="probTitle" value="$env{'form.probTitle'}" /> <input type="hidden" name="saveState" value="$env{'form.saveState'}" /> $upfile_select -<br /><input type="button" onClick="javascript:checkUpload(this.form);" value="$upload" /> +<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> <label><input type="checkbox" name="noFirstLine" />$ignore</label> </form> ENDUPFORM @@ -3907,8 +4033,12 @@ sub csvuploadmap { &csvuploadmap_header($request,$symb,$datatoken,$#records+1); my ($i,$keyfields); if (@records) { - my @fields=&csvupload_fields($symb); - + my $fieldserror; + my @fields=&csvupload_fields($symb,\$fieldserror); + if ($fieldserror) { + $request->print(&navmap_errormsg()); + return; + } if ($env{'form.upfile_associate'} eq 'reverse') { &Apache::loncommon::csv_print_samples($request,\@records); $i=&Apache::loncommon::csv_print_select_table($request,\@records, @@ -4118,8 +4248,7 @@ sub pickStudentPage { my ($request) = shift; my $alertmsg = &mt('Please select the student you wish to grade.'); - $request->print(<<LISTJAVASCRIPT); -<script type="text/javascript" language="javascript"> + $request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT)); function checkPickOne(formname) { if (radioSelection(formname.student) == null) { @@ -4132,7 +4261,6 @@ function checkPickOne(formname) { formname.submit(); } -</script> LISTJAVASCRIPT &commonJSfunctions($request); my ($symb) = &get_symb($request); @@ -4144,7 +4272,12 @@ LISTJAVASCRIPT &mt('Manual Grading by Page or Sequence').'</span></h3>'; $result.='<form action="/adm/grades" method="post" name="displayPage">'."\n"; - my ($titles,$symbx) = &getSymbMap(); + my $map_error; + my ($titles,$symbx) = &getSymbMap($map_error); + if ($map_error) { + $request->print(&navmap_errormsg()); + return; + } my ($curpage) =&Apache::lonnet::decode_symb($symb); # my ($curpage,$mapId) =&Apache::lonnet::decode_symb($symb); # my $type=($curpage =~ /\.(page|sequence)/); @@ -4191,7 +4324,7 @@ LISTJAVASCRIPT $result.=' <b>'.&mt('Use CODE').': </b> <input type="text" name="CODE" value="" /> <br />'."\n"; $result.=' <input type="button" '. - 'onClick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' →" /><br />'."\n"; + 'onclick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' →" /><br />'."\n"; $request->print($result); @@ -4230,7 +4363,7 @@ LISTJAVASCRIPT } $studentTable.=&Apache::loncommon::end_data_table()."\n"; $studentTable.='<input type="button" '. - 'onClick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' →" /></form>'."\n"; + 'onclick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' →" /></form>'."\n"; $studentTable.=&show_grading_menu_form($symb); $request->print($studentTable); @@ -4239,8 +4372,14 @@ LISTJAVASCRIPT } sub getSymbMap { + my ($map_error) = @_; my $navmap = Apache::lonnavmaps::navmap->new(); - + unless (ref($navmap)) { + if (ref($map_error)) { + $$map_error = 'navmap'; + } + return; + } my %symbx = (); my @titles = (); my $minder = 0; @@ -4299,6 +4438,11 @@ sub displayPage { $request->print($result); my $navmap = Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + $request->print(&navmap_errormsg()); + $request->print(&show_grading_menu_form($symb)); + return; + } my ($mapUrl, $id, $resUrl)=&Apache::lonnet::decode_symb($env{'form.page'}); my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps if (!$map) { @@ -4326,7 +4470,9 @@ sub displayPage { my $checkIcon = '<img alt="'.&mt('Check Mark'). '" src="'.&Apache::loncommon::lonhttpdurl($request->dir_config('lonIconsURL').'/check.gif').'" height="16" border="0" />'; - $studentTable.=' '.&mt('<b>Note:</b> Problems graded correct by the computer are marked with a [_1] symbol.',$checkIcon)."\n". + $studentTable.=' <span class="LC_info">'. + &mt('Problems graded correct by the computer are marked with a [_1] symbol.',$checkIcon). + '</span>'."\n". &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). '<th align="center"> Prob. </th>'. @@ -4397,11 +4543,13 @@ sub displayPage { } if (&canmodify($usec)) { + $studentTable.=&gradeBox_start(); foreach my $partid (@{$parts}) { $studentTable.=&gradeBox($request,$symbx,$uname,$udom,$question,$partid,\%record); $studentTable.='<input type="hidden" name="q_'.$question.'" value="'.$partid.'" />'."\n"; $question++; } + $studentTable.=&gradeBox_end(); $prob++; } $studentTable.='</td></tr>'; @@ -4410,10 +4558,11 @@ sub displayPage { $curRes = $iterator->next(); } - $studentTable.='</table>'."\n". - '<input type="button" value="'.&mt('Save').'" '. - 'onClick="javascript:checkSubmitPage(this.form,'.$question.');" />'. - '</form>'."\n"; + $studentTable.= + '</table>'."\n". + '<input type="button" value="'.&mt('Save').'" '. + 'onclick="javascript:checkSubmitPage(this.form,'.$question.');" />'. + '</form>'."\n"; $studentTable.=&show_grading_menu_form($symb); $request->print($studentTable); @@ -4459,16 +4608,20 @@ sub displaySubByDates { my @versionKeys = split(/\:/,$$record{$version.':keys'}); my @displaySub = (); foreach my $partid (@{$parts}) { + my $hidden; + if (($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurvey') || + ($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurveycred')) { + $hidden = 1; + } my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys) : sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys)); - # next if ($$record{"$version:resource.$partid.solved"} eq ''); my $display_part=&get_display_part($partid,$symb); foreach my $matchKey (@matchKey) { if (exists($$record{$version.':'.$matchKey}) && $$record{$version.':'.$matchKey} ne '') { - + my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) : ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); $displaySub[0].='<span class="LC_nobreak"'; @@ -4477,23 +4630,27 @@ sub displaySubByDates { .'('.&mt('Part ID: [_1]',$responseId).')' .'</span>' .' <b>'; - if ($$record{"$where.$partid.tries"} eq '') { - $displaySub[0].=&mt('Trial not counted'); - } else { - $displaySub[0].=&mt('Trial: [_1]', + if ($hidden) { + $displaySub[0].= &mt('Anonymous Survey').'</b>'; + } else { + if ($$record{"$where.$partid.tries"} eq '') { + $displaySub[0].=&mt('Trial not counted'); + } else { + $displaySub[0].=&mt('Trial: [_1]', $$record{"$where.$partid.tries"}); - } - my $responseType=($isTask ? 'Task' + } + my $responseType=($isTask ? 'Task' : $responseType->{$partid}->{$responseId}); - if (!exists($orders{$partid})) { $orders{$partid}={}; } - if (!exists($orders{$partid}->{$responseId})) { - $orders{$partid}->{$responseId}= - &get_order($partid,$responseId,$symb,$uname,$udom, - $no_increment); - } - $displaySub[0].='</b></span>'; # /nobreak - $displaySub[0].=' '. - &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom).'<br />'; + if (!exists($orders{$partid})) { $orders{$partid}={}; } + if (!exists($orders{$partid}->{$responseId})) { + $orders{$partid}->{$responseId}= + &get_order($partid,$responseId,$symb,$uname,$udom, + $no_increment); + } + $displaySub[0].='</b></span>'; # /nobreak + $displaySub[0].=' '. + &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom).'<br />'; + } } } if (exists($$record{"$where.$partid.checkedin"})) { @@ -4553,7 +4710,12 @@ sub updateGradeByPage { $request->print($result); + my $navmap = Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + $request->print(&navmap_errormsg()); + return; + } my ($mapUrl, $id, $resUrl) = &Apache::lonnet::decode_symb( $env{'form.page'}); my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps if (!$map) { @@ -4698,7 +4860,7 @@ sub updateGradeByPage { # #------------------------------------------------------------------- -#--------------------Scantron Grading----------------------------------- +#-------------------- Bubblesheet (Scantron) Grading ------------------- # #------ start of section for handling grading by page/sequence --------- @@ -4776,14 +4938,19 @@ sub defaultFormData { Return html dropdown of possible sequences to grade Arguments: - $symb - $symb of the current resource + $symb - $symb of the current resource + $map_error - ref to scalar which will container error if + $navmap object is unavailable in &getSymbMap(). =cut sub getSequenceDropDown { - my ($symb)=@_; + my ($symb,$map_error)=@_; my $result='<select name="selectpage">'."\n"; - my ($titles,$symbx) = &getSymbMap(); + my ($titles,$symbx) = &getSymbMap($map_error); + if (ref($map_error)) { + return if ($$map_error); + } my ($curpage)=&Apache::lonnet::decode_symb($symb); my $ctr=0; foreach (@$titles) { @@ -5049,7 +5216,12 @@ sub scantron_selectphase { my ($r,$file2grade) = @_; my ($symb)=&get_symb($r); if (!$symb) {return '';} - my $sequence_selector=&getSequenceDropDown($symb); + my $map_error; + my $sequence_selector=&getSequenceDropDown($symb,\$map_error); + if ($map_error) { + $r->print('<br />'.&navmap_errormsg().'<br />'); + return; + } my $default_form_data=&defaultFormData($symb); my $grading_menu_button=&show_grading_menu_form($symb); my $file_selector=&scantron_uploads($file2grade); @@ -5126,17 +5298,15 @@ sub scantron_selectphase { my $default_form_data=&defaultFormData(&get_symb($r,1)); my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'}; - $r->print(' - <script type="text/javascript" language="javascript"> + $r->print(&Apache::lonhtmlcommon::scripttag(' function checkUpload(formname) { if (formname.upfile.value == "") { alert("'.&mt('Please use the browse button to select a file from your local directory.').'"); return false; } formname.submit(); - } - </script> - + }')); + $r->print(' <form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> '.$default_form_data.' <input name="courseid" type="hidden" value="'.$cnum.'" /> @@ -5144,7 +5314,7 @@ sub scantron_selectphase { <input name="command" value="scantronupload_save" type="hidden" /> '.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').' <br /> - <input type="button" onClick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> + <input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> </form> '); @@ -6223,7 +6393,12 @@ sub scantron_validate_file { $r->print('<p>'.&mt('Gathering necessary information.').'</p>');$r->rflush(); #get the student pick code ready $r->print(&Apache::loncommon::studentbrowser_javascript()); - my $max_bubble=&scantron_get_maxbubble(); + my $nav_error; + my $max_bubble=&scantron_get_maxbubble(\$nav_error); + if ($nav_error) { + $r->print(&navmap_errormsg()); + return ''; + } my $result=&scantron_form_start($max_bubble).$default_form_data; $r->print($result); @@ -6635,6 +6810,10 @@ sub scantron_validate_sequence { my ($r,$currentphase) = @_; my $navmap=Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + $r->print(&navmap_errormsg()); + return (1,$currentphase); + } my (undef,undef,$sequence)= &Apache::lonnet::decode_symb($env{'form.selectpage'}); @@ -6666,8 +6845,13 @@ sub scantron_validate_ID { #get scantron line setup my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); my ($scanlines,$scan_data)=&scantron_getfile(); - - &scantron_get_maxbubble(); # parse needs the bubble_lines.. array. + + my $nav_error; + &scantron_get_maxbubble(\$nav_error); # parse needs the bubble_lines.. array. + if ($nav_error) { + $r->print(&navmap_errormsg()); + return(1,$currentphase); + } my %found=('ids'=>{},'usernames'=>{}); for (my $i=0;$i<=$scanlines->{'count'};$i++) { @@ -6809,8 +6993,7 @@ sub scantron_get_correction { $r->print("\n<br />"); } - $r->print(<<ENDSCRIPT); -<script type="text/javascript"> + $r->print(&Apache::lonhtmlcommon::scripttag(<<ENDSCRIPT)); function change_radio(field) { var slct=document.scantronupload.scantron_CODE_resolution; var i; @@ -6818,7 +7001,6 @@ function change_radio(field) { if (slct[i].value==field) { slct[i].checked=true; } } } -</script> ENDSCRIPT my $href="/adm/pickcode?". "form=".&escape("scantronupload"). @@ -6890,8 +7072,7 @@ sub verify_bubbles_checked { my (@ansnums) = @_; my $ansnumstr = join('","',@ansnums); my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines."); - my $output = (<<ENDSCRIPT); -<script type="text/javascript"> + my $output = &Apache::lonhtmlcommon::scripttag((<<ENDSCRIPT)); function verify_bubble_radio(form) { var ansnumArray = new Array ("$ansnumstr"); var need_bubble_count = 0; @@ -6914,7 +7095,6 @@ function verify_bubble_radio(form) { } form.submit(); } -</script> ENDSCRIPT return $output; } @@ -7220,7 +7400,12 @@ sub scantron_validate_CODE { my %allcodes=&get_codes(); - &scantron_get_maxbubble(); # parse needs the lines per response array. + my $nav_error; + &scantron_get_maxbubble(\$nav_error); # parse needs the lines per response array. + if ($nav_error) { + $r->print(&navmap_errormsg()); + return(1,$currentphase); + } my ($scanlines,$scan_data)=&scantron_getfile(); for (my $i=0;$i<=$scanlines->{'count'};$i++) { @@ -7274,7 +7459,12 @@ sub scantron_validate_doublebubble { #get scantron line setup my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); my ($scanlines,$scan_data)=&scantron_getfile(); - &scantron_get_maxbubble(); # parse needs the bubble line array. + my $nav_error; + &scantron_get_maxbubble(\$nav_error); # parse needs the bubble line array. + if ($nav_error) { + $r->print(&navmap_errormsg()); + return(1,$currentphase); + } for (my $i=0;$i<=$scanlines->{'count'};$i++) { my $line=&scantron_get_line($scanlines,$scan_data,$i); @@ -7292,6 +7482,7 @@ sub scantron_validate_doublebubble { sub scantron_get_maxbubble { + my ($nav_error) = @_; if (defined($env{'form.scantron_maxbubble'}) && $env{'form.scantron_maxbubble'}) { &restore_bubble_lines(); @@ -7302,6 +7493,12 @@ sub scantron_get_maxbubble { &Apache::lonnet::decode_symb($env{'form.selectpage'}); my $navmap=Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + if (ref($nav_error)) { + $$nav_error = 1; + } + return; + } my $map=$navmap->getResourceByUrl($sequence); my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); @@ -7391,7 +7588,11 @@ sub scantron_validate_missingbubbles { #get scantron line setup my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); my ($scanlines,$scan_data)=&scantron_getfile(); - my $max_bubble=&scantron_get_maxbubble(); + my $nav_error; + my $max_bubble=&scantron_get_maxbubble(\$nav_error); + if ($nav_error) { + return(1,$currentphase); + } if (!$max_bubble) { $max_bubble=2**31; } for (my $i=0;$i<=$scanlines->{'count'};$i++) { my $line=&scantron_get_line($scanlines,$scan_data,$i); @@ -7451,13 +7652,24 @@ sub scantron_process_students { my $classlist=&Apache::loncoursedata::get_classlist(); my %idmap=&username_to_idmap($classlist); my $navmap=Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + $r->print(&navmap_errormsg()); + return ''; + } my $map=$navmap->getResourceByUrl($sequence); my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); my (%grader_partids_by_symb,%grader_randomlists_by_symb); &graders_resources_pass(\@resources,\%grader_partids_by_symb, \%grader_randomlists_by_symb); + my $resource_error; foreach my $resource (@resources) { - my $ressymb = $resource->symb(); + my $ressymb; + if (ref($resource)) { + $ressymb = $resource->symb(); + } else { + $resource_error = 1; + last; + } my ($analysis,$parts) = &scantron_partids_tograde($resource,$env{'request.course.id'}, $env{'user.name'},$env{'user.domain'},1); @@ -7469,6 +7681,10 @@ sub scantron_process_students { } } } + if ($resource_error) { + $r->print(&navmap_errormsg()); + return ''; + } my ($uname,$udom); my $result= <<SCANTRONFORM; @@ -7493,7 +7709,12 @@ SCANTRONFORM my $i=-1; my $started; - &scantron_get_maxbubble(); # Need the bubble lines array to parse. + my $nav_error; + &scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse. + if ($nav_error) { + $r->print(&navmap_errormsg()); + return ''; + } # If an ssi failed in scantron_get_maxbubble, put an error message out to # the user and return. @@ -7534,9 +7755,15 @@ SCANTRONFORM } ($uname,$udom)=split(/:/,$uname); - my %partids_by_symb; + my (%partids_by_symb,$res_error); foreach my $resource (@resources) { - my $ressymb = $resource->symb(); + my $ressymb; + if (ref($resource)) { + $ressymb = $resource->symb(); + } else { + $res_error = 1; + last; + } if ((exists($grader_randomlists_by_symb{$ressymb})) || (ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { my ($analysis,$parts) = @@ -7547,6 +7774,12 @@ SCANTRONFORM } } + if ($res_error) { + &scantron_add_delay(\@delayqueue,$line, + 'An error occurred while grading student '.$uname,2); + next; + } + &Apache::lonxml::clear_problem_counter(); &Apache::lonnet::appenv($scan_record); @@ -7718,15 +7951,16 @@ sub scantron_upload_scantron_data { my $syllabuslink = '<a href="javascript:ToSyllabus();">'.&mt('Syllabus').'</a>'. (' 'x2).&mt('(shows course personnel)'); my $default_form_data=&defaultFormData(&get_symb($r,1)); - $r->print(' -<script type="text/javascript" language="javascript"> + my $nofile_alert = &mt('Please use the browse button to select a file from your local directory.'); + my $nocourseid_alert = &mt("Please use the 'Select Course' link to open a separate window where you can search for a course to which a file can be uploaded."); + $r->print(&Apache::lonhtmlcommon::scripttag(' function checkUpload(formname) { if (formname.upfile.value == "") { - alert("'.&mt('Please use the browse button to select a file from your local directory.').'"); + alert("'.$nofile_alert.'"); return false; } if (formname.courseid.value == "") { - alert("'.&mt('Please use the \"Select Course\" link to open a separate window where you can search for a course to which a file can be uploaded.').'"); + alert("'.$nocourseid_alert.'"); return false; } formname.submit(); @@ -7746,8 +7980,8 @@ sub scantron_upload_scantron_data { return; } -</script> - +')); + $r->print(' <h3>'.&mt('Send scanned bubblesheet data to a course').'</h3> <form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> @@ -7768,7 +8002,7 @@ sub scantron_upload_scantron_data { &Apache::lonhtmlcommon::end_pick_box().'<br /> <input name="command" value="scantronupload_save" type="hidden" /> -<input type="button" onClick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> +<input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> </form> '); return ''; @@ -7975,6 +8209,10 @@ sub checkscantron_results { my $classlist=&Apache::loncoursedata::get_classlist(); my %idmap=&Apache::grades::username_to_idmap($classlist); my $navmap=Apache::lonnavmaps::navmap->new(); + unless (ref($navmap)) { + $r->print(&navmap_errormsg()); + return ''; + } my $map=$navmap->getResourceByUrl($sequence); my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); my (%grader_partids_by_symb,%grader_randomlists_by_symb); @@ -7989,12 +8227,16 @@ sub checkscantron_results { my %completedstudents; my $count=&Apache::grades::get_todo_count($scanlines,$scan_data); - my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Scantron/Submissions Comparison Status', - 'Progress of Scantron Data/Submission Records Comparison',$count, + my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Bubblesheet/Submissions Comparison Status', + 'Progress of Bubblesheet Data/Submission Records Comparison',$count, 'inline',undef,'checkscantron'); my ($username,$domain,$started); - - &scantron_get_maxbubble(); # Need the bubble lines array to parse. + my $nav_error; + &scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse. + if ($nav_error) { + $r->print(&navmap_errormsg()); + return ''; + } &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, 'Processing first student'); @@ -8067,14 +8309,14 @@ sub checkscantron_results { if ($scandata{$pid} eq $record{$pid}) { my $css_class = ($passed % 2)?'LC_odd_row':'LC_even_row'; $okstudents .= '<tr class="'.$css_class.'">'. -'<td>'.&mt('Scantron').'</td><td>'.$showscandata.'</td><td rowspan="2">'.$last.'</td><td rowspan="2">'.$pid.'</td>'."\n". +'<td>'.&mt('Bubblesheet').'</td><td>'.$showscandata.'</td><td rowspan="2">'.$last.'</td><td rowspan="2">'.$pid.'</td>'."\n". '</tr>'."\n". '<tr class="'.$css_class.'">'."\n". '<td>Submissions</td><td>'.$showrecord.'</td></tr>'."\n"; $passed ++; } else { my $css_class = ($failed % 2)?'LC_odd_row':'LC_even_row'; - $badstudents .= '<tr class="'.$css_class.'"><td>'.&mt('Scantron').'</td><td><span class="LC_nobreak">'.$scandata{$pid}.'</span></td><td rowspan="2">'.$last.'</td><td rowspan="2">'.$pid.'</td>'."\n". + $badstudents .= '<tr class="'.$css_class.'"><td>'.&mt('Bubblesheet').'</td><td><span class="LC_nobreak">'.$scandata{$pid}.'</span></td><td rowspan="2">'.$last.'</td><td rowspan="2">'.$pid.'</td>'."\n". '</tr>'."\n". '<tr class="'.$css_class.'">'."\n". '<td>Submissions</td><td><span class="LC_nobreak">'.$record{$pid}.'</span></td>'."\n". @@ -8319,7 +8561,7 @@ sub grading_menu { icon => 'addClickerInfoFile.png', linktitle => 'Specify a file containing the clicker information for this resource.' }, - { linktext => 'Grade/Manage/Review Scantron Forms', + { linktext => 'Grade/Manage/Review Bubblesheets', url => $url4, permission => 'F', icon => 'stat.png', @@ -8345,16 +8587,15 @@ sub grading_menu { $Str .= Apache::lonhtmlcommon::generate_menu(@menu); #$menudata->{'jscript'} - $Str .='<hr /><input type="button" value="'.&mt('Verify Receipt').'" '. - ' onClick="javascript:checkChoice(document.forms.gradingMenu,\'5\',\'verify\')" '. + $Str .='<hr /><input type="button" value="'.&mt('Verify Receipt No.').'" '. + ' onclick="javascript:checkChoice(document.forms.gradingMenu,\'5\',\'verify\')" '. ' /> '. &Apache::lonnet::recprefix($env{'request.course.id'}). - '-<input type="text" name="receipt" size="4" onChange="javascript:checkReceiptNo(this.form,\'OK\')" />'; + '-<input type="text" name="receipt" size="4" onchange="javascript:checkReceiptNo(this.form,\'OK\')" />'; $Str .="</form>\n"; my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box."); - $request->print(<<GRADINGMENUJS); -<script type="text/javascript" language="javascript"> + $request->print(&Apache::lonhtmlcommon::scripttag(<<GRADINGMENUJS)); function checkChoice(formname,val,cmdx) { if (val <= 2) { var cmd = radioSelection(formname.radioChoice); @@ -8387,7 +8628,6 @@ sub grading_menu { } return true; } -</script> GRADINGMENUJS &commonJSfunctions($request); return $Str; @@ -8402,8 +8642,7 @@ sub submit_options { my $probTitle = &Apache::lonnet::gettitle($symb); my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box."); - $request->print(<<GRADINGMENUJS); -<script type="text/javascript" language="javascript"> + $request->print(&Apache::lonhtmlcommon::scripttag(<<GRADINGMENUJS)); function checkChoice(formname,val,cmdx) { if (val <= 2) { var cmd = radioSelection(formname.radioChoice); @@ -8436,7 +8675,6 @@ sub submit_options { } return true; } -</script> GRADINGMENUJS &commonJSfunctions($request); my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle); @@ -8532,7 +8770,7 @@ GRADINGMENUJS </label> </div> <div> - <input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' →" /> + <input type="button" onclick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' →" /> </div> </div> @@ -8549,7 +8787,7 @@ GRADINGMENUJS </label> </div> <div> - <input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' →" /> + <input type="button" onclick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' →" /> </div> </div> </form>'; @@ -8682,8 +8920,7 @@ sub process_clicker { ('iclicker' => 'i>clicker', 'interwrite' => 'interwrite PRS')); $symb = &Apache::lonenc::check_encrypt($symb); - $result.=<<ENDUPFORM; -<script type="text/javascript"> + $result.= &Apache::lonhtmlcommon::scripttag(<<ENDUPFORM); function sanitycheck() { // Accept only integer percentages document.forms.gradesupload.pcorrect.value=Math.round(document.forms.gradesupload.pcorrect.value); @@ -8721,7 +8958,8 @@ function sanitycheck() { // Remember the old state document.forms.gradesupload.waschecked.value=newgradingchoice; } -</script> +ENDUPFORM + $result.= <<ENDUPFORM; <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> <input type="hidden" name="symb" value="$symb" /> <input type="hidden" name="command" value="processclickerfile" /> @@ -8729,18 +8967,18 @@ function sanitycheck() { <input type="hidden" name="saveState" value="$env{'form.saveState'}" /> <input type="file" name="upfile" size="50" /> <br /><label>$type: $selectform</label> -<br /><label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onClick="sanitycheck()" />$attendance </label> -<br /><label><input type="radio" name="gradingmechanism" value="personnel"$checked{'personnel'} onClick="sanitycheck()" />$personnel</label> -<br /><label><input type="radio" name="gradingmechanism" value="specific"$checked{'specific'} onClick="sanitycheck()" />$specific </label> +<br /><label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label> +<br /><label><input type="radio" name="gradingmechanism" value="personnel"$checked{'personnel'} onclick="sanitycheck()" />$personnel</label> +<br /><label><input type="radio" name="gradingmechanism" value="specific"$checked{'specific'} onclick="sanitycheck()" />$specific </label> <input type="text" name="specificid" value="$env{'form.specificid'}" size="20" /> -<br /><label><input type="radio" name="gradingmechanism" value="given"$checked{'given'} onClick="sanitycheck()" />$given </label> +<br /><label><input type="radio" name="gradingmechanism" value="given"$checked{'given'} onclick="sanitycheck()" />$given </label> <br /> <input type="text" name="givenanswer" size="50" /> <input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" /> -<br /><label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onChange="sanitycheck()" /></label> -<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onChange="sanitycheck()" /></label> -<br /><input type="button" onClick="javascript:checkUpload(this.form);" value="$upload" /> -</form> +<br /><label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> +<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label> +<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> +</form>' ENDUPFORM $result.='</td></tr></table>'."\n". '</td></tr></table><br /><br />'."\n"; @@ -8988,7 +9226,11 @@ sub assign_clicker_grades { my ($symb)=&get_symb($r); if (!$symb) {return '';} # See which part we are saving to - my ($partlist,$handgrade,$responseType) = &response_type($symb); + my $res_error; + my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error); + if ($res_error) { + return &navmap_errormsg(); + } # FIXME: This should probably look for the first handgradeable part my $part=$$partlist[0]; # Start screen output @@ -9092,6 +9334,13 @@ ENDHEADER return $result.&show_grading_menu_form($symb); } +sub navmap_errormsg { + return '<div class="LC_error">'. + &mt('An error occurred retrieving information about resources in the course.').'<br />'. + &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this grading page.','<a href="/adm/roles?selectrole=1&newrole='.$env{'request.role'}.'">','</a>'). + '</div>'; +} + sub handler { my $request=$_[0]; &reset_caches(); @@ -9317,6 +9566,13 @@ ssi_with_retries() =item scantron_get_maxbubble() : + Arguments: + $nav_error - Reference to scalar which is a flag to indicate a + failure to retrieve a navmap object. + if $nav_error is set to 1 by scantron_get_maxbubble(), the + calling routine should trap the error condition and display the warning + found in &navmap_errormsg(). + Returns the maximum number of bubble lines that are expected to occur. Does this by walking the selected sequence rendering the resource and then checking &Apache::lonxml::get_problem_counter() @@ -9382,6 +9638,11 @@ ssi_with_retries() Validates all scanlines in the selected file to not have any invalid or underspecified student/employee IDs +=item navmap_errormsg() : + + Returns HTML mark-up inside a <div></div> with a link to re-initialize the course. + Should be called whenever the request to instantiate a navmap object fails. + =back =cut