--- loncom/homework/grades.pm 2013/12/06 14:19:49 1.709 +++ loncom/homework/grades.pm 2014/02/05 15:09:30 1.719 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.709 2013/12/06 14:19:49 bisitz Exp $ +# $Id: grades.pm,v 1.719 2014/02/05 15:09:30 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -437,7 +437,8 @@ sub cleanRecord { $result.=''; 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); @@ -1431,6 +1432,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(<") {var syisel="checked"}; - if (kwstyle=="") {var sybsel="checked"}; + if (kwstyle=="") {var synsel="checked='checked'"}; + if (kwstyle=="") {var syisel="checked='checked'"}; + if (kwstyle=="") {var sybsel="checked='checked'"}; highlightCentral(); - highlightbody('red','red',redsel,'0','normal',sznsel,'','normal',synsel); - highlightbody('green','green',grnsel,'+1','+1',sz1sel,'','italic',syisel); - highlightbody('blue','blue',blusel,'+2','+2',sz2sel,'','bold',sybsel); + highlightbody('red',txtcol1,redsel,'0',txtsiz1,sznsel,'',txtsty1,synsel); + highlightbody('green',txtcol2,grnsel,'+1',txtsiz2,sz1sel,'',txtsty2,syisel); + highlightbody('blue',txtcol3,blusel,'+2',txtsiz3,sz2sel,'',txtsty3,sybsel); highlightend(); return; } @@ -1630,31 +1649,29 @@ INNERJS hDoc.$docopen; hDoc.write('$start_page_highlight_central'); hDoc.write("
"); - hDoc.write("

 $lt{'kehi'}<\\/span><\\/h3>

"); + hDoc.write("

$lt{'kehi'}<\\/h1>"); - hDoc.write('
'); - hDoc.write(''); - hDoc.write("
$lt{'txtc'}<\\/b><\\/td>$lt{'font'}<\\/b><\\/td>$lt{'fnst'}<\\/td><\\/tr>"); + hDoc.write(''); + hDoc.write(""); + hDoc.write(""); hDoc.write("
$lt{'txtc'}<\\/th>$lt{'font'}<\\/th>$lt{'fnst'}<\\/th><\\/tr>"); } function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { var hDoc = hwdWin.document; - hDoc.write("
"); - hDoc.write(" "+clrtxt+"<\\/td>"); + hDoc.write(" "+clrtxt+"<\\/td>"); hDoc.write(""); - hDoc.write(" "+sztxt+"<\\/td>"); + hDoc.write(" "+sztxt+"<\\/td>"); hDoc.write(""); - hDoc.write(" "+sytxt+"<\\/td>"); + hDoc.write(" "+sytxt+"<\\/td>"); hDoc.write("<\\/tr>"); } function highlightend() { var hDoc = hwdWin.document; - hDoc.write("<\\/table>"); - hDoc.write("<\\/td><\\/tr><\\/table> "); - hDoc.write("  "); - hDoc.write("

"); + hDoc.write("<\\/table>
"); + hDoc.write("  "); + hDoc.write("

"); hDoc.write("<\\/form>"); hDoc.write('$end_page_highlight_central'); hDoc.close(); @@ -1942,9 +1959,12 @@ sub submission { if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; } if (!&canview($usec)) { - $request->print('Unable to view requested student.('. - $uname.':'.$udom.' in section '.$usec.' in course id '. - $env{'request.course.id'}.')'); + $request->print( + ''. + &mt('Unable to view requested student.'). + ' '.&mt('([_1] in section [_2] in course id [_3])', + $uname.':'.$udom,$usec,$env{'request.course.id'}). + ''); return; } @@ -2041,6 +2061,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 +2070,18 @@ sub submission { # # Print out the keyword options line # - $request->print(<$lt{'keyw'}:  -$lt{'list'}    -$lt{'past'}    -$lt{'high'}

-KEYWORDS + $request->print( + '
' + .'
'.$lt{'keyh'}.'' + .&Apache::lonhtmlcommon::funclist_from_array( + [''.$lt{'list'}.'', + ''.$lt{'past'}.'', + ''.$lt{'high'}.''], + {legend => $lt{'keyw'}}) + .'
' + ); + # # Load the other essays for similarity check # @@ -2510,8 +2536,11 @@ sub get_last_submission { } my ($partid,$foo) = split(/submission$/,$key); my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? - 'Draft Copy ' : ''; - push(@string, join(':', $key, $hide, $draft.$lasthash{$key})); + ''.&mt('Draft Copy').' ' : ''; + #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 +2568,21 @@ sub keywords_highlight { sub show_previous_task_version { my ($request,$symb) = @_; if ($symb eq '') { - $request->print("Unable to handle ambiguous references."); - + $request->print( + ''. + &mt('Unable to handle ambiguous references.'). + ''); 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('Unable to view previous version for requested student.('. - $uname.':'.$udom.' in section '.$usec.' in course id '. - $env{'request.course.id'}.')'); + $request->print( + ''. + &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'}). + ''); return; } my $mode = 'both'; @@ -4613,8 +4647,12 @@ sub displayPage { &Apache::lonnet::clear_EXT_cache_status(); if (!&canview($usec)) { - $request->print(''.&mt('Unable to view requested student. ([_1])',$env{'form.student'}).''); - return; + $request->print( + ''. + &mt('Unable to view requested student. ([_1])', + $env{'form.student'}). + ''); + return; } my $result='

 '.$env{'form.title'}.'

'; $result.='

 '.&mt('Student: [_1]',&nameUserString(undef,$$fullname{$env{'form.student'}},$uname,$udom)). @@ -5585,7 +5623,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 +5907,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 @@ -7579,7 +7617,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}); @@ -8688,23 +8726,30 @@ sub scantron_upload_scantron_data_save { } my %coursedata=&Apache::lonnet::coursedescription($env{'form.domainid'}.'_'.$env{'form.courseid'}); my $uploadedfile; - $r->print('

'.&mt("Uploading file to [_1]",$coursedata{'description'}).'

'); + $r->print('

'.&mt('Uploading file to [_1]','"'.$coursedata{'description'}.'"').'

'); 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.','','',''.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'')); + $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.', + ''.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').''),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]', - '','',(length($env{'form.upfile'})-1), - ''.$result.'')); + if ($result =~ m{^/uploaded/}) { + $r->print( + &Apache::lonhtmlcommon::confirm_success(&mt('Upload successful')).'
'. + &mt('Uploaded [_1] bytes of data into location: [_2]', + (length($env{'form.upfile'})-1), + ''.$result.'')); ($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]', - '','',$result, + } else { + $r->print( + &Apache::lonhtmlcommon::confirm_success(&mt('Upload failed'),1).'
'. + &mt('An error ([_1]) occurred when attempting to upload the file: [_2]', + $result, ''.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'')); } } @@ -8726,7 +8771,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 +8814,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 +8833,40 @@ sub validate_uploaded_scantron_file { } } my $showpct = sprintf("%.0f",$max_match_pct).'%'; - $output .= '
'.&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]).',''.$showpct.'',''.$max_match_count.'',$format_descs). - '
'.&mt('A low percentage of matches results from one of the following:').'
    '. - '
  • '.&mt('The file was uploaded to the wrong course').'
  • '. - '
  • '.&mt('The data are not in the format expected for the domain: [_1]', - ''.$cdom.'').'
  • '. - '
  • '.&mt('Students did not bubble their IDs, or mis-bubbled them').'
  • '. - '
  • '.&mt('The course roster is not up to date').'
  • '. - '
'; + $output .= '
'; + 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])', + ''.$showpct.'',$found_match_count)).'
'. + &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]).', + ''.$showpct.'',''.$max_match_count.'',$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])', + ''.$showpct.'',$found_match_count,$max_match_count).'
'. + &mt('Not all entries could be matched!'),1).'
'. + &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]).', + ''.$showpct.'',''.$max_match_count.'',$format_descs). + '

'. + &mt('A low percentage of matches results from one of the following:'). + '

    '. + '
  • '.&mt('The file was uploaded to the wrong course.').'
  • '. + '
  • '.&mt('The data is not in the format expected for the domain: [_1]', + ''.$cdom.'').'
  • '. + '
  • '.&mt('Students did not bubble their IDs, or mis-bubbled them').'
  • '. + '
  • '.&mt('The course roster is not up to date.').'
  • '. + '
'; + } } } else { - $output = ''.&mt('Uploaded file contained no data').''; + $output = '

'.&mt('Uploaded file contained no data').'

'; } return $output; } @@ -8832,7 +8901,7 @@ sub scantron_download_scantron_data { &Apache::lonnet::allowuploaded('/adm/grades',$skipped); $r->print('

- '.&mt('[_1]Original[_2] file as uploaded by the scantron office.', + '.&mt('[_1]Original[_2] file as uploaded by the bubblesheet office.', '','').'

@@ -9712,16 +9781,18 @@ sub process_clicker_file { $number++; } $result.="

\n"; - if ($number==0) { - $result.=''.&mt('No IDs found to determine correct answer').''; - 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.', - '', - '', - ''.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').''); + $result .= + &Apache::lonhtmlcommon::confirm_success( + &mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.', + ''.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').''),1); return $result; } @@ -10319,7 +10390,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 +10401,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.