--- loncom/homework/grades.pm 2013/08/23 16:24:33 1.703 +++ loncom/homework/grades.pm 2014/02/27 02:28:51 1.723 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.703 2013/08/23 16:24:33 bisitz Exp $ +# $Id: grades.pm,v 1.723 2014/02/27 02:28:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -330,6 +330,8 @@ sub cleanRecord { my $grayFont = '<span class="LC_internal_info">'; if ($response =~ /^(option|rank)$/) { my %answer=&Apache::lonnet::str2hash($answer); + my @answer = %answer; + %answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); my ($toprow,$bottomrow); foreach my $foil (@$order) { @@ -346,6 +348,8 @@ sub cleanRecord { $bottomrow.'</tr></table></blockquote>'; } elsif ($response eq 'match') { my %answer=&Apache::lonnet::str2hash($answer); + my @answer = %answer; + %answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); my @items=&Apache::lonnet::str2array($record->{$version."resource.$partid.$respid.submissionitems"}); my ($toprow,$middlerow,$bottomrow); @@ -368,6 +372,8 @@ sub cleanRecord { $bottomrow.'</tr></table></blockquote>'; } elsif ($response eq 'radiobutton') { my %answer=&Apache::lonnet::str2hash($answer); + my @answer = %answer; + %answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; my ($toprow,$bottomrow); my $correct = &get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom,$type,$trial,$rndseed); @@ -401,9 +407,11 @@ sub cleanRecord { $env{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob. } $answer =~ s-\n-<br />-g; - return '<br /><br /><blockquote><tt>'.&keywords_highlight($answer).'</tt></blockquote>'; + return '<br /><br /><blockquote><tt>'.&keywords_highlight(&HTML::Entities::encode($answer, '"<>&')).'</tt></blockquote>'; + } elsif ( $response eq 'organic') { - my $result='Smile representation: "<tt>'.$answer.'</tt>"'; + my $result=&mt('Smile representation: [_1]', + '"<tt>'.&HTML::Entities::encode($answer, '"<>&').'</tt>"'); my $jme=$record->{$version."resource.$partid.$respid.molecule"}; $result.=&Apache::chemresponse::jme_img($jme,$answer,400); return $result; @@ -437,12 +445,14 @@ sub cleanRecord { $result.='</ul>'; return $result; } - } elsif ( $response =~ m/(?:numerical|formula)/) { + } elsif ( $response =~ m/(?:numerical|formula|custom)/) { + # Respect multiple input fields, see Bug #5409 $answer = &Apache::loncommon::format_previous_attempt_value('submission', $answer); + return $answer; } - return $answer; + return &HTML::Entities::encode($answer, '"<>&'); } #-- A couple of common js functions @@ -1084,7 +1094,7 @@ LISTJAVASCRIPT if ($submitonly eq 'graded' ) { $submissions = 'ungraded submissions'; } if ($submitonly eq 'queued' ) { $submissions = 'queued submissions'; } $gradeTable='<br /> <span class="LC_warning">'. - &mt('No '.$submissions.' found for this resource for any students. ([_1] students checked for '.$submissions.')', + &mt('No '.$submissions.' found for this resource for any students. ([quant,_1,student] checked for '.$submissions.')', $num_students). '</span><br />'; } @@ -1431,6 +1441,15 @@ INNERJS txtc => 'Text Color', font => 'Font Size', fnst => 'Font Style', + col1 => 'red', + col2 => 'green', + col3 => 'blue', + siz1 => 'normal', + siz2 => '+1', + siz3 => '+2', + sty1 => 'normal', + sty2 => 'italic', + sty3 => 'bold', ); $request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); @@ -1594,25 +1613,34 @@ INNERJS var redsel = ""; var grnsel = ""; var blusel = ""; - if (kwclr=="red") {var redsel="checked"}; - if (kwclr=="green") {var grnsel="checked"}; - if (kwclr=="blue") {var blusel="checked"}; + var txtcol1 = "$lt{'col1'}"; + var txtcol2 = "$lt{'col2'}"; + var txtcol3 = "$lt{'col3'}"; + var txtsiz1 = "$lt{'siz1'}"; + var txtsiz2 = "$lt{'siz2'}"; + var txtsiz3 = "$lt{'siz3'}"; + var txtsty1 = "$lt{'sty1'}"; + var txtsty2 = "$lt{'sty2'}"; + var txtsty3 = "$lt{'sty3'}"; + if (kwclr=="red") {var redsel="checked='checked'"}; + if (kwclr=="green") {var grnsel="checked='checked'"}; + if (kwclr=="blue") {var blusel="checked='checked'"}; var sznsel = ""; var sz1sel = ""; var sz2sel = ""; - if (kwsize=="0") {var sznsel="checked"}; - if (kwsize=="+1") {var sz1sel="checked"}; - if (kwsize=="+2") {var sz2sel="checked"}; + if (kwsize=="0") {var sznsel="checked='checked'"}; + if (kwsize=="+1") {var sz1sel="checked='checked'"}; + if (kwsize=="+2") {var sz2sel="checked='checked'"}; var synsel = ""; var syisel = ""; var sybsel = ""; - if (kwstyle=="") {var synsel="checked"}; - if (kwstyle=="<i>") {var syisel="checked"}; - if (kwstyle=="<b>") {var sybsel="checked"}; + if (kwstyle=="") {var synsel="checked='checked'"}; + if (kwstyle=="<i>") {var syisel="checked='checked'"}; + if (kwstyle=="<b>") {var sybsel="checked='checked'"}; highlightCentral(); - highlightbody('red','red',redsel,'0','normal',sznsel,'','normal',synsel); - highlightbody('green','green',grnsel,'+1','+1',sz1sel,'<i>','italic',syisel); - highlightbody('blue','blue',blusel,'+2','+2',sz2sel,'<b>','bold',sybsel); + highlightbody('red',txtcol1,redsel,'0',txtsiz1,sznsel,'',txtsty1,synsel); + highlightbody('green',txtcol2,grnsel,'+1',txtsiz2,sz1sel,'<i>',txtsty2,syisel); + highlightbody('blue',txtcol3,blusel,'+2',txtsiz3,sz2sel,'<b>',txtsty3,sybsel); highlightend(); return; } @@ -1630,31 +1658,29 @@ INNERJS hDoc.$docopen; hDoc.write('$start_page_highlight_central'); hDoc.write("<form action=\\"inactive\\" name=\\"hlCenter\\">"); - hDoc.write("<h3><span class=\\"LC_info\\"> $lt{'kehi'}<\\/span><\\/h3><br /><br />"); + hDoc.write("<h1>$lt{'kehi'}<\\/h1>"); - hDoc.write('<table border="0" width="100%"><tr><td bgcolor="#777777">'); - hDoc.write('<table border="0" width="100%"><tr bgcolor="#DDFFFF">'); - hDoc.write("<td><b>$lt{'txtc'}<\\/b><\\/td><td><b>$lt{'font'}<\\/b><\\/td><td><b>$lt{'fnst'}<\\/td><\\/tr>"); + hDoc.write('<table border="0" width="100%"><tr style="background-color:#A1D676">'); + hDoc.write("<th>$lt{'txtc'}<\\/th><th>$lt{'font'}<\\/th><th>$lt{'fnst'}<\\/th><\\/tr>"); } function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { var hDoc = hwdWin.document; - hDoc.write("<tr bgcolor=\\"#ffffdd\\">"); + hDoc.write("<tr>"); hDoc.write("<td align=\\"left\\">"); - hDoc.write("<input name=\\"kwdclr\\" type=\\"radio\\" value=\\""+clrval+"\\" "+clrsel+"> "+clrtxt+"<\\/td>"); + hDoc.write("<input name=\\"kwdclr\\" type=\\"radio\\" value=\\""+clrval+"\\" "+clrsel+" \\/> "+clrtxt+"<\\/td>"); hDoc.write("<td align=\\"left\\">"); - hDoc.write("<input name=\\"kwdsize\\" type=\\"radio\\" value=\\""+szval+"\\" "+szsel+"> "+sztxt+"<\\/td>"); + hDoc.write("<input name=\\"kwdsize\\" type=\\"radio\\" value=\\""+szval+"\\" "+szsel+" \\/> "+sztxt+"<\\/td>"); hDoc.write("<td align=\\"left\\">"); - hDoc.write("<input name=\\"kwdstyle\\" type=\\"radio\\" value=\\""+syval+"\\" "+sysel+"> "+sytxt+"<\\/td>"); + hDoc.write("<input name=\\"kwdstyle\\" type=\\"radio\\" value=\\""+syval+"\\" "+sysel+" \\/> "+sytxt+"<\\/td>"); hDoc.write("<\\/tr>"); } function highlightend() { var hDoc = hwdWin.document; - hDoc.write("<\\/table>"); - hDoc.write("<\\/td><\\/tr><\\/table> "); - hDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:updateChoice(1)\\"> "); - hDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\"><br /><br />"); + hDoc.write("<\\/table><br \\/>"); + hDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:updateChoice(1)\\" \\/> "); + hDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\" \\/><br /><br />"); hDoc.write("<\\/form>"); hDoc.write('$end_page_highlight_central'); hDoc.close(); @@ -1942,9 +1968,12 @@ sub submission { if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; } if (!&canview($usec)) { - $request->print('<span class="LC_warning">Unable to view requested student.('. - $uname.':'.$udom.' in section '.$usec.' in course id '. - $env{'request.course.id'}.')</span>'); + $request->print( + '<span class="LC_warning">'. + &mt('Unable to view requested student.'). + ' '.&mt('([_1] in section [_2] in course id [_3])', + $uname.':'.$udom,$usec,$env{'request.course.id'}). + '</span>'); return; } @@ -1976,7 +2005,7 @@ sub submission { $request->print(&show_problem($request,$symb,$uname,$udom,0,1,$mode)); } - # kwclr is the only variable that is guaranteed to be non-blank + # kwclr is the only variable that is guaranteed not to be blank # if this subroutine has been called once. my %keyhash = (); # if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') { @@ -2041,6 +2070,7 @@ sub submission { if (1) { my %lt = &Apache::lonlocal::texthash( + keyh => 'Keyword Highlighting for Essays', keyw => 'Keyword Options', list => 'List', past => 'Paste Selection to List', @@ -2049,13 +2079,18 @@ sub submission { # # Print out the keyword options line # - $request->print(<<KEYWORDS); -<br /><b>$lt{'keyw'}:</b> -<a href="javascript:keywords(document.SCORE);" target="_self">$lt{'list'}</a> -<a href="#" onmousedown="javascript:getSel(); return false" - class="page">$lt{'past'}</a> -<a href="javascript:kwhighlight();" target="_self">$lt{'high'}</a><br /><br /> -KEYWORDS + $request->print( + '<div class="LC_columnSection">' + .'<fieldset><legend>'.$lt{'keyh'}.'</legend>' + .&Apache::lonhtmlcommon::funclist_from_array( + ['<a href="javascript:keywords(document.SCORE);" target="_self">'.$lt{'list'}.'</a>', + '<a href="#" onmousedown="javascript:getSel(); return false" + class="page">'.$lt{'past'}.'</a>', + '<a href="javascript:kwhighlight();" target="_self">'.$lt{'high'}.'</a>'], + {legend => $lt{'keyw'}}) + .'</fieldset></div>' + ); + # # Load the other essays for similarity check # @@ -2080,7 +2115,7 @@ KEYWORDS if ($perm{'vgr'}) { $request->print( &Apache::loncommon::track_student_link( - &mt('View recent activity'), + 'View recent activity', $uname,$udom,'check') .' ' ); @@ -2276,6 +2311,7 @@ KEYWORDS if ($env{'form.lastSub'} eq 'datesub') { my ($parts,$handgrade,$responseType) = &response_type($symb,\$res_error); $request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom)); + } if ($env{'form.lastSub'} =~ /^(last|all)$/) { $request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, @@ -2510,8 +2546,11 @@ sub get_last_submission { } my ($partid,$foo) = split(/submission$/,$key); my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? - '<span class="LC_warning">Draft Copy</span> ' : ''; - push(@string, join(':', $key, $hide, $draft.$lasthash{$key})); + '<span class="LC_warning">'.&mt('Draft Copy').'</span> ' : ''; + #push(@string, join(':', $key, $hide, $draft.$lasthash{$key})); + push(@string, join(':', $key, $hide, $draft.( + ref($lasthash{$key}) eq 'ARRAY' ? + join(',', @{$lasthash{$key}}) : $lasthash{$key}) )); } } if (!@string) { @@ -2539,16 +2578,21 @@ sub keywords_highlight { sub show_previous_task_version { my ($request,$symb) = @_; if ($symb eq '') { - $request->print("Unable to handle ambiguous references."); - + $request->print( + '<span class="LC_error">'. + &mt('Unable to handle ambiguous references.'). + '</span>'); return ''; } my ($uname,$udom) = ($env{'form.student'},$env{'form.userdom'}); my $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'}); if (!&canview($usec)) { - $request->print('<span class="LC_warning">Unable to view previous version for requested student.('. - $uname.':'.$udom.' in section '.$usec.' in course id '. - $env{'request.course.id'}.')</span>'); + $request->print( + '<span class="LC_warning">'. + &mt('Unable to view previous version for requested student.'). + ' '.&mt('([_1] in section [_2] in course id [_3])', + $uname.':'.$udom,$usec,$env{'request.course.id'}). + '</span>'); return; } my $mode = 'both'; @@ -2731,7 +2775,10 @@ sub processHandGrade { next; } if ($errorflag eq 'not_allowed') { - $request->print("<span class=\"LC_warning\">Not allowed to modify grades for $uname:$udom</span>"); + $request->print( + '<span class="LC_error">' + .&mt('Not allowed to modify grades for [_1]',"$uname:$udom") + .'</span>'); $ctr++; next; } @@ -4613,8 +4660,12 @@ sub displayPage { &Apache::lonnet::clear_EXT_cache_status(); if (!&canview($usec)) { - $request->print('<span class="LC_warning">'.&mt('Unable to view requested student. ([_1])',$env{'form.student'}).'</span>'); - return; + $request->print( + '<span class="LC_warning">'. + &mt('Unable to view requested student. ([_1])', + $env{'form.student'}). + '</span>'); + return; } my $result='<h3><span class="LC_info"> '.$env{'form.title'}.'</span></h3>'; $result.='<h3> '.&mt('Student: [_1]',&nameUserString(undef,$$fullname{$env{'form.student'}},$uname,$udom)). @@ -5585,7 +5636,7 @@ sub scantron_selectphase { =item get_scantron_config - Parse and return the scantron configuration line selected as a + Parse and return the bubblesheet configuration line selected as a hash of configuration file fields. Arguments: @@ -5869,12 +5920,12 @@ sub digits_to_letters { =item scantron_parse_scanline - Decodes a scanline from the selected scantron file + Decodes a scanline from the selected bubblesheet file Arguments: - line - The text of the scantron file line to process + line - The text of the bubblesheet file line to process whichline - Line number - scantron_config - Hash describing the format of the scantron lines. + scantron_config - Hash describing the format of the bubblesheet lines. scan_data - Hash of extra information about the scanline (see scantron_getfile for more information) just_header - True if should not process question answers but only @@ -6445,7 +6496,7 @@ sub scantron_process_corrections { '<p class="LC_error">' .&mt('Unable to accept last correction, an error occurred: [_1]', $errmsg) - .'</sp>'); + .'</p>'); } else { &scantron_put_line($scanlines,$scan_data,$which,$line,$skip); &scantron_putfile($scanlines,$scan_data); @@ -6567,7 +6618,7 @@ sub scantron_warning_screen { $scantron_config{'CODEstart'} && $scantron_config{'CODElength'}) { $CODElist=$env{'form.scantron_CODElist'}; - if ($env{'form.scantron_CODElist'} eq '') { $CODElist='<span class="LC_warning">None</span>'; } + if ($env{'form.scantron_CODElist'} eq '') { $CODElist='<span class="LC_warning">'.&mt('None').'</span>'; } $CODElist= '<tr><td><b>'.&mt('List of CODES to validate against:').'</b></td><td><tt>'. $env{'form.scantron_CODElist'}.'</tt></td></tr>'; @@ -6581,7 +6632,7 @@ sub scantron_warning_screen { return (' <p> <span class="LC_warning"> -'.&mt('Please double check the information below before clicking on \'[_1]\'',&mt($button_text)).'</span> +'.&mt("Please double check the information below before clicking on '[_1]'",&mt($button_text)).'</span> </p> <table> <tr><td><b>'.&mt('Sequence to be Graded:').'</b></td><td>'.$title.'</td></tr> @@ -7579,7 +7630,7 @@ sub prompt_for_corrections { } } else { $responsenum = $question-1; - $first = $first_bubble_line{$responsenum} + 1; + $first = $first_bubble_line{$responsenum}; } $current_line = $first + 1 ; my @subans = split(/,/,$subdivided_bubble_lines{$responsenum}); @@ -8200,7 +8251,7 @@ sub hand_bubble_option { return &mt('The sequence to be graded contains response types which are handgraded.').'<p>'. &mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?','<br />'). '<label><input type="radio" name="scantron_lastbubblepoints" value="'.$bubbles_per_row.'" checked="checked" />'.&mt('[quant,_1,point]',$bubbles_per_row).'</label> '.&mt('or').' '. - '<label><input type="radio" name="scantron_lastbubblepoints" value="0"/>0 points</label></p>'; + '<label><input type="radio" name="scantron_lastbubblepoints" value="0" />'.&mt('0 points').'</label></p>'; } return; } @@ -8449,11 +8500,11 @@ SCANTRONFORM &Apache::loncommon::end_data_table_header_row()."\n". &Apache::loncommon::start_data_table_row(). '<td>'.&mt('Bubblesheet').'</td>'. - '<td><span class="LC_nobreak"><tt>'.$studentdata.'</tt></span></td>'. + '<td><span class="LC_nobreak" style="white-space: pre;"><tt>'.$studentdata.'</tt></span></td>'. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row(). '<td>'.&mt('Stored submissions').'</td>'. - '<td><span class="LC_nobreak"><tt>'.$studentrecord.'</tt></span></td>'."\n". + '<td><span class="LC_nobreak" style="white-space: pre;"><tt>'.$studentrecord.'</tt></span></td>'."\n". &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table().'</p>'); } else { @@ -8688,23 +8739,30 @@ sub scantron_upload_scantron_data_save { } my %coursedata=&Apache::lonnet::coursedescription($env{'form.domainid'}.'_'.$env{'form.courseid'}); my $uploadedfile; - $r->print('<h3>'.&mt("Uploading file to [_1]",$coursedata{'description'}).'</h3>'); + $r->print('<p>'.&mt('Uploading file to [_1]','"'.$coursedata{'description'}.'"').'</p>'); if (length($env{'form.upfile'}) < 2) { - $r->print(&mt('[_1]Error:[_2] The file you attempted to upload, [_3] contained no information. Please check that you entered the correct filename.','<span class="LC_error">','</span>','<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>')); + $r->print( + &Apache::lonhtmlcommon::confirm_success( + &mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.', + '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1)); } else { my $result = &Apache::lonnet::userfileupload('upfile','','scantron','','','', $env{'form.courseid'},$env{'form.domainid'}); - if ($result =~ m{^/uploaded/}) { - $r->print(&mt('[_1]Success:[_2] Successfully uploaded [_3] bytes of data into location: [_4]', - '<span class="LC_success">','</span>',(length($env{'form.upfile'})-1), - '<span class="LC_filename">'.$result.'</span>')); + if ($result =~ m{^/uploaded/}) { + $r->print( + &Apache::lonhtmlcommon::confirm_success(&mt('Upload successful')).'<br />'. + &mt('Uploaded [_1] bytes of data into location: [_2]', + (length($env{'form.upfile'})-1), + '<span class="LC_filename">'.$result.'</span>')); ($uploadedfile) = ($result =~ m{/([^/]+)$}); $r->print(&validate_uploaded_scantron_file($env{'form.domainid'}, $env{'form.courseid'},$uploadedfile)); - } else { - $r->print(&mt('[_1]Error:[_2] An error ([_3]) occurred when attempting to upload the file, [_4]', - '<span class="LC_error">','</span>',$result, + } else { + $r->print( + &Apache::lonhtmlcommon::confirm_success(&mt('Upload failed'),1).'<br />'. + &mt('An error ([_1]) occurred when attempting to upload the file: [_2]', + $result, '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>')); } } @@ -8726,7 +8784,7 @@ sub validate_uploaded_scantron_file { my $output; if (@lines) { my (%counts,$max_match_format); - my ($max_match_count,$max_match_pct) = (0,0); + my ($found_match_count,$max_match_count,$max_match_pct) = (0,0,0); my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cname); my %idmap = &username_to_idmap($classlist); foreach my $key (keys(%idmap)) { @@ -8769,6 +8827,7 @@ sub validate_uploaded_scantron_file { if (($max_match_format eq '') || ($percent_match > $max_match_pct)) { $max_match_pct = $percent_match; $max_match_format = $key; + $found_match_count = $counts{$key}{'found'}; $max_match_count = $counts{$key}{'total'}; } } @@ -8787,17 +8846,40 @@ sub validate_uploaded_scantron_file { } } my $showpct = sprintf("%.0f",$max_match_pct).'%'; - $output .= '<br />'.&mt('Comparison of student IDs in the uploaded file with the course roster found matches for [_1] of the [_2] entries in the file (for the format defined for [_3]).','<b>'.$showpct.'</b>','<b>'.$max_match_count.'</b>',$format_descs). - '<br />'.&mt('A low percentage of matches results from one of the following:').'<ul>'. - '<li>'.&mt('The file was uploaded to the wrong course').'</li>'. - '<li>'.&mt('The data are not in the format expected for the domain: [_1]', - '<i>'.$cdom.'</i>').'</li>'. - '<li>'.&mt('Students did not bubble their IDs, or mis-bubbled them').'</li>'. - '<li>'.&mt('The course roster is not up to date').'</li>'. - '</ul>'; + $output .= '<br />'; + if ($found_match_count == $max_match_count) { + # 100% matching entries + $output .= &Apache::lonhtmlcommon::confirm_success( + &mt('Comparison of student IDs: [_1] matching ([quant,_2,entry,entries])', + '<b>'.$showpct.'</b>',$found_match_count)).'<br />'. + &mt('Comparison of student IDs in the uploaded file with'. + ' the course roster found matches for [_1] of the [_2] entries'. + ' in the file (for the format defined for [_3]).', + '<b>'.$showpct.'</b>','<b>'.$max_match_count.'</b>',$format_descs); + } else { + # Not all entries matching? -> Show warning and additional info + $output .= + &Apache::lonhtmlcommon::confirm_success( + &mt('Comparison of student IDs: [_1] matching ([_2]/[quant,_3,entry,entries])', + '<b>'.$showpct.'</b>',$found_match_count,$max_match_count).'<br />'. + &mt('Not all entries could be matched!'),1).'<br />'. + &mt('Comparison of student IDs in the uploaded file with'. + ' the course roster found matches for [_1] of the [_2] entries'. + ' in the file (for the format defined for [_3]).', + '<b>'.$showpct.'</b>','<b>'.$max_match_count.'</b>',$format_descs). + '<p class="LC_info">'. + &mt('A low percentage of matches results from one of the following:'). + '</p><ul>'. + '<li>'.&mt('The file was uploaded to the wrong course.').'</li>'. + '<li>'.&mt('The data is not in the format expected for the domain: [_1]', + '<i>'.$cdom.'</i>').'</li>'. + '<li>'.&mt('Students did not bubble their IDs, or mis-bubbled them').'</li>'. + '<li>'.&mt('The course roster is not up to date.').'</li>'. + '</ul>'; + } } } else { - $output = '<span class="LC_warning">'.&mt('Uploaded file contained no data').'</span>'; + $output = '<p class="LC_warning">'.&mt('Uploaded file contained no data').'</p>'; } return $output; } @@ -8832,7 +8914,7 @@ sub scantron_download_scantron_data { &Apache::lonnet::allowuploaded('/adm/grades',$skipped); $r->print(' <p> - '.&mt('[_1]Original[_2] file as uploaded by the scantron office.', + '.&mt('[_1]Original[_2] file as uploaded by the bubblesheet scanning office.', '<a href="'.$orig.'">','</a>').' </p> <p> @@ -8893,7 +8975,7 @@ sub checkscantron_results { my $count=&get_todo_count($scanlines,$scan_data); my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count); - my ($username,$domain,$started,%ordered); + my ($username,$domain,$started); &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. if ($nav_error) { $r->print(&navmap_errormsg()); @@ -9003,14 +9085,14 @@ sub checkscantron_results { '<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"; +'<td>'.&mt('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('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". +'<td>'.&mt('Submissions').'</td><td><span class="LC_nobreak">'.$record{$pid}.'</span></td>'."\n". '</tr>'."\n"; $failed ++; } @@ -9712,16 +9794,18 @@ sub process_clicker_file { $number++; } $result.="</p>\n"; - if ($number==0) { - $result.='<span class="LC_error">'.&mt('No IDs found to determine correct answer').'</span>'; - return $result; - } + if ($number==0) { + $result .= + &Apache::lonhtmlcommon::confirm_success( + &mt('No IDs found to determine correct answer'),1); + return $result; + } } if (length($env{'form.upfile'}) < 2) { - $result.=&mt('[_1] Error: [_2] The file you attempted to upload, [_3] contained no information. Please check that you entered the correct filename.', - '<span class="LC_error">', - '</span>', - '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'); + $result .= + &Apache::lonhtmlcommon::confirm_success( + &mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.', + '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1); return $result; } @@ -10319,7 +10403,7 @@ described at http://www.lon-capa.org. =head1 OVERVIEW Do an ssi with retries: -While I'd love to factor out this with the vesrion in lonprintout, +While I'd love to factor out this with the version in lonprintout, that would either require a data coupling between modules, which I refuse to perpetuate (there's quite enough of that already), or would require the invention of another infrastructure I'm not quite ready to invent (e.g. an ssi_with_retry object). @@ -10330,11 +10414,11 @@ At least the logic that drives this has ssi_with_retries - Does the server side include of a resource. if the ssi call returns an error we'll retry it up to the number of times requested by the caller. - If we still have a proble, no text is appended to the + If we still have a problem, no text is appended to the output and we set some global variables. to indicate to the caller an SSI error occurred. All of this is supposed to deal with the issues described - in LonCAPA BZ 5631 see: + in LON-CAPA BZ 5631 see: http://bugs.lon-capa.org/show_bug.cgi?id=5631 by informing the user that this happened.