--- loncom/homework/grades.pm 2009/01/16 02:36:30 1.528.2.10 +++ loncom/homework/grades.pm 2009/03/20 19:15:29 1.528.2.11 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.528.2.10 2009/01/16 02:36:30 raeburn Exp $ +# $Id: grades.pm,v 1.528.2.11 2009/03/20 19:15:29 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -255,9 +255,9 @@ sub showResourceInfo { $partsseen{$partID}=1; } my $display_part=&get_display_part($partID,$symb); - $result.=''.&mt('Part: [_1]',$display_part).' '. - $resID.''. - ''.&mt('Type: [_1]',$responsetype).''; + $result.=''.&mt('Part').': '.$display_part. + ' '.$resID.''. + ''.&mt('Type').': '.$responsetype.''; # ''.&mt('Handgrade: [_1]',$handgrade).''; } } @@ -306,11 +306,14 @@ sub reset_caches { sub get_radiobutton_correct_foil { my ($partid,$respid,$symb,$uname,$udom)=@_; my $analyze = &get_analyze($symb,$uname,$udom); - foreach my $foil (@{&get_order($partid,$respid,$symb,$uname,$udom)}) { - if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') { - return $foil; - } - } + my $foils = &get_order($partid,$respid,$symb,$uname,$udom); + if (ref($foils) eq 'ARRAY') { + foreach my $foil (@{$foils}) { + if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') { + return $foil; + } + } + } } } @@ -737,7 +740,7 @@ sub verifyreceipt { my $title.= '

'. - &mt('Verifying Submission Receipt [_1]',$receipt). + &mt('Verifying Receipt No. [_1]',$receipt). '

'."\n". '

'.&mt('Resource: [_1]',$env{'form.probTitle'}). '

'."\n"; @@ -822,17 +825,15 @@ sub listStudents { &Apache::lonnet::gettitle($symb) : $env{'form.probTitle'}; my $result='

 '. - &mt($viewgrade.' Submissions for a Student or a Group of Students') + &mt("$viewgrade Submissions for a Student or a Group of Students") .'

'; my ($table,undef,$hdgrade,$partlist,$handgrade) = &showResourceInfo($symb,$env{'form.probTitle'},($env{'form.showgrading'} eq 'yes')); - my %lt = ( '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.", - ); - %lt = &Apache::lonlocal::texthash(%lt); + my %lt = &Apache::lonlocal::texthash ( + '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(< function checkSelect(checkBox) { @@ -875,17 +876,15 @@ LISTJAVASCRIPT "\n".$table; $gradeTable .= - ' '. - &mt('View Problem Text: [_1]', + ' '.&mt('View Problem Text').': '. ''."\n". ''."\n". - '').'
'."\n"; + '
'."\n"; $gradeTable .= - ' '. - &mt('View Answer: [_1]', + ' '.&mt('View Answer').': '. ''."\n". ''."\n". - '').'
'."\n"; + '
'."\n"; my $submission_options; if ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { @@ -901,18 +900,16 @@ LISTJAVASCRIPT ''."\n". ''; $gradeTable .= - ' '. - &mt('Submissions: [_1]',$submission_options).'
'."\n"; + ' '.&mt('Submissions').': '.$submission_options.'
'."\n"; $gradeTable .= - ' '. - &mt('Grading Increments: [_1]', + ' '.&mt('Grading Increments').': '. ''); + ''; $gradeTable .= &build_section_inputs(). @@ -931,15 +928,14 @@ LISTJAVASCRIPT &Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,1,'javascript:reLoadList(this.form);')).'
'; } - $gradeTable.=&mt('To '.lc($viewgrade).' a submission or a group of submissions, click on the check box(es) '. - 'next to the student\'s name(s). Then click on the Next button.').'
'."\n". + $gradeTable.=&mt('To '.lc($viewgrade)." a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button.").'
'."\n". ''."\n"; # checkall buttons $gradeTable.=&check_script('gradesub', 'stuinfo'); $gradeTable.='
'."\n"; + 'value="'.&mt('Next').' →" />
'."\n"; $gradeTable.=&check_buttons(); $gradeTable.=''; my ($classlist, undef, $fullname) = &getclasslist($getsec,'1',$getgroup); @@ -1059,7 +1055,7 @@ LISTJAVASCRIPT $gradeTable.=&Apache::loncommon::end_data_table()."\n". ''."\n"; + 'value="'.&mt('Next').' →" />'."\n"; if ($ctr == 0) { my $num_students=(scalar(keys(%$fullname))); if ($num_students eq 0) { @@ -1155,6 +1151,7 @@ sub processGroup { #--- Javascript to handle the submission page functionality --- sub sub_page_js { my $request = shift; + my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = '); $request->print(< function updateRadio(formname,id,weight) { @@ -1165,7 +1162,7 @@ sub sub_page_js { gradeBox.value = pts; var resetbox = false; if (isNaN(pts) || pts < 0) { - alert("A number equal or greater than 0 is expected. Entered value = "+pts); + alert("$alertmsg"+pts); for (var i=0; iprint(< @@ -1442,7 +1440,7 @@ INNERJS else return; var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); if (cleantxt=="") { - alert("Please select a word or group of words from document and then click this link."); + alert("$alertmsg"); return; } var nret = prompt("Add selection to keyword list? Edit if desired.",cleantxt); @@ -1697,7 +1695,7 @@ sub gradeBox { $wgt.')" />'."\n"; $line.='/'.$wgt.' '.$wgtmsg. ($$record{'resource.'.$partid.'.solved'} eq 'correct_by_student' ? ' '.$checkIcon : ''). - ' '."\n"; + ' '.&mt('Grade Status').':'."\n"; $line.=''."\n". @@ -2094,7 +2091,7 @@ KEYWORDS $lastsubonly.="\n".'
Part: '. $display_part.' ( ID '.$respid. ' )   '. - ''.&mt('Nothing submitted - no attempts').'

'; + ''.&mt('Nothing submitted - no attempts.').'

'; next; } foreach my $submission (@$string) { @@ -2146,7 +2143,7 @@ KEYWORDS } $lastsubonly.=''.&mt('Submitted Answer:').' '. &cleanRecord($subval,$responsetype,$symb,$partid, - $respid,\%record,$order); + $respid,\%record,$order,undef,$uname,$udom); if ($similar) {$lastsubonly.="

$similar\n";} $lastsubonly.=''; } @@ -2275,7 +2272,7 @@ KEYWORDS ''."\n"; my $nsel = ($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : '1'); $ntstu =~ s/'. @@ -3272,7 +3270,7 @@ sub viewgrades { $result.= &Apache::loncommon::start_data_table_row()."\n". - &mt('Part:[_1]Points:[_2]or[_3]',$display_part,$radio,$line). + ''.&mt('Part').':'.$display_part.''.&mt('Points').':'.$radio.''.&mt('or').''.$line.''. &Apache::loncommon::end_data_table_row()."\n"; $ctsparts++; } @@ -3283,32 +3281,32 @@ sub viewgrades { #table listing all the students in a section/class #header of table - $result.= '

'.&mt('Assign Grade to Specific Students in '.$sectionClass, - $section_display).'

'; - $result.= &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - ''.&mt('No.').''. - ''.&nameUserString('header')."\n"; + $result.= '

'.$specific_header.'

'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + ''.&mt('No.').''. + ''.&nameUserString('header')."\n"; my (@parts) = sort(&getpartlist($symb)); my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); my @partids = (); foreach my $part (@parts) { my $display=&Apache::lonnet::metadata($url,$part.'.display'); - $display =~ s|^Number of Attempts|Tries
|; # makes the column narrower + my $narrowtext = &mt('Tries').'
'; + $display =~ s{^Number of Attempts}{$narrowtext}; # makes the column narrower if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); } my ($partid) = &split_part_type($part); push(@partids,$partid); my $display_part=&get_display_part($partid,$symb); if ($display =~ /^Partial Credit Factor/) { $result.=''. - &mt('Score Part: [_1]
(weight = [_2])', - $display_part,$weight{$partid}).''."\n"; + &mt('Score Part: [_1] (weight = [_2])', + $display_part.'
',$weight{$partid}).''."\n"; next; } else { if ($display =~ /Problem Status/) { - my $grade_status_mt = &mt('Grade Status'); - $display =~ s{Problem Status}{$grade_status_mt
}; + my $grade_status_mt = &mt('Grade Status').'
'; + $display =~ s{Problem Status}{$grade_status_mt}; } my $part_mt = &mt('Part:'); $display =~s{\[Part: \Q$partid\E\]}{$part_mt $display_part}; @@ -3465,10 +3463,11 @@ sub editgrades { if ($part !~ m/^\Q$partid\E/) { next;} if ($type eq 'awarded' || $type eq 'solved') { next; } my $display=&Apache::lonnet::metadata($url,$stores.'.display'); - $display =~ s/\[Part: (\w)+\]//; - $display =~ s/Number of Attempts/Tries/; - $header .= ''.&mt('Old '.$display).''. - ''.&mt('New '.$display).''; + $display =~ s/\[Part: \Q$part\E\]//; + my $narrowtext = &mt('Tries'); + $display =~ s{Number of Attempts}{$narrowtext}; + $header .= ''.&mt('Old').' '.$display).''. + ''.&mt('New').' '.$display).''; $columns{$partid}+=2; } } @@ -3810,11 +3809,12 @@ ENDPICK } sub checkforfile_js { + my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); my $result =< function checkUpload(formname) { if (formname.upfile.value == "") { - alert("Please use the browse button to select a file from your local directory."); + alert("$alertmsg"); return false; } formname.submit(); @@ -3834,7 +3834,7 @@ sub upcsvScores_form { $result.=$table; $result.='
'."\n"; $result.=''."\n"; $result.='
'."\n"; - $result.=' '.&mt('Specify a file containing the class scores for current resource'). + $result.=' '.&mt('Specify a file containing the class scores for current resource.'). '.
'."\n"; my $upload=&mt("Upload Scores"); @@ -4088,12 +4088,13 @@ sub csvuploadassign { sub pickStudentPage { my ($request) = shift; + my $alertmsg = &mt('Please select the student you wish to grade.'); $request->print(< function checkPickOne(formname) { if (radioSelection(formname.student) == null) { - alert("Please select the student you wish to grade."); + alert("$alertmsg"); return; } ptr = pullDownSelection(formname.selectpage); @@ -4128,7 +4129,7 @@ LISTJAVASCRIPT $ctr++; } $select.= ''; - $result.=&mt(' Problems from: [_1]',$select)."
\n"; + $result.=' '.&mt('Problems from').": $select
\n"; $ctr=0; foreach (@$titles) { @@ -4143,13 +4144,13 @@ LISTJAVASCRIPT my $options = ''."\n". ''."
\n"; - $result.=' '.&mt('View Problems Text: [_1]',$options); + $result.=' '.&mt('View Problem Text').": $options"; $options = ''."\n". ''."\n". ''."\n"; - $result.=' '.&mt('Submission Details: [_1]',$options); + $result.=' >b>'.&mt('Submissions').": $options"; $result.=&build_section_inputs(); my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); @@ -4158,12 +4159,10 @@ LISTJAVASCRIPT ''."\n". ''."
\n"; - $result.=' '.&mt('Use CODE: [_1] ', - ''). - '
'."\n"; + $result.=' '.&mt('Use CODE').':
'."\n"; $result.=' 
'."\n"; + 'onClick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' →" />
'."\n"; $request->print($result); @@ -4339,7 +4338,7 @@ sub displayPage { # $request->print('match='.$1."
\n"); # } # $companswer =~ s||
|g; - $studentTable.=' '.$title.' 
 '.&mt('Correct answer:
[_1]',$companswer); + $studentTable.=' '.$title.' 
 '.&mt('Correct answer').':
'.$companswer); } my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); @@ -4409,7 +4408,7 @@ sub displaySubByDates { my %orders; $mark{'correct_by_student'} = $checkIcon; if (!exists($$record{'1:timestamp'})) { - return '
 '.&mt('Nothing submitted - no attempts').'
'; + return '
 '.&mt('Nothing submitted - no attempts.').'
'; } my $interaction; @@ -5525,7 +5524,8 @@ sub scantron_parse_scanline { my ($line,$whichline,$scantron_config,$scan_data,$just_header)=@_; my %record; - my $questions=substr($line,$$scantron_config{'Qstart'}-1); # Answers + my $lastpos = $env{'form.scantron_maxbubble'}*$$scantron_config{'Qlength'}; + my $questions=substr($line,$$scantron_config{'Qstart'}-1,$lastpos); # Answers my $data=substr($line,0,$$scantron_config{'Qstart'}-1); # earlier stuff if (!($$scantron_config{'CODElocation'} eq 0 || $$scantron_config{'CODElocation'} eq 'none')) { @@ -6232,15 +6232,15 @@ sub scantron_validate_file { } if ($stop) { if ($validate_phases[$currentphase] eq 'sequence') { - $r->print(''); + $r->print(''); $r->print(' '.&mt('this error').'
'); $r->print("

".&mt("Or click the 'Grading Menu' button to start over.")."

"); } else { if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') { - $r->print(''); + $r->print(''); } else { - $r->print(''); + $r->print(''); } $r->print(' '.&mt('using corrected info').'
'); $r->print(""); @@ -6833,7 +6833,7 @@ ENDSCRIPT ".&mt("[_1]Select[_2] a CODE from the list of all CODEs and use it.", "","")." - ".&mt("Selected CODE is [_1]","")); + ".&mt('Selected CODE is [_1]','')); $r->print("\n
"); } $r->print(" @@ -7394,7 +7394,7 @@ sub scantron_get_maxbubble { } } } - &Apache::lonnet::delenv('scantron\.'); + &Apache::lonnet::delenv('scantron.'); &save_bubble_lines(); $env{'form.scantron_maxbubble'} = @@ -7647,6 +7647,17 @@ SCANTRONFORM $studentrecord .= $recording; } if ($studentrecord ne $studentdata) { + &Apache::lonxml::clear_problem_counter(); + if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, + \@resources) eq 'ssi_error') { + $ssi_error = 0; # So end of handler error message does not trigger. + $r->print(""); + &ssi_print_error($r); + $r->print(&show_grading_menu_form($symb)); + &Apache::lonnet::remove_lock($lock); + delete($completedstudents{$uname}); + return ''; + } $counter = -1; $studentrecord = ''; foreach my $resource (@resources) { @@ -7689,7 +7700,7 @@ SCANTRONFORM if (&Apache::loncommon::connection_aborted($r)) { last; } } continue { &Apache::lonxml::clear_problem_counter(); - &Apache::lonnet::delenv('scantron\.'); + &Apache::lonnet::delenv('scantron.'); } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); &Apache::lonnet::remove_lock($lock); @@ -7739,7 +7750,7 @@ sub scantron_upload_scantron_data {