--- loncom/homework/grades.pm 2011/09/23 04:53:48 1.652 +++ loncom/homework/grades.pm 2011/10/10 10:13:17 1.658 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.652 2011/09/23 04:53:48 raeburn Exp $ +# $Id: grades.pm,v 1.658 2011/10/10 10:13:17 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -45,6 +45,7 @@ use Apache::lonlocal; use Apache::lonenc; use Apache::lonstathelpers; use Apache::lonquickgrades; +use Apache::bridgetask(); use String::Similarity; use LONCAPA; @@ -1414,6 +1415,7 @@ INNERJS adds => 'Add selection to keyword list? Edit if desired.', comp => 'Compose Message for: ', incl => 'Include', + type => 'Type', subj => 'Subject', mesa => 'Message', new => 'New', @@ -1422,6 +1424,7 @@ INNERJS kehi => 'Keyword Highlight Options', txtc => 'Text Color', font => 'Font Size', + fnst => 'Font Style', ); $request->print(&Apache::lonhtmlcommon::scripttag(<'); pDoc.write(''); - pDoc.write("
Type<\\/b><\\/td>$lt{'incl'}<\\/b><\\/td>$lt{'mesa'}<\\/td><\\/tr>"); + pDoc.write("$lt{'type'}<\\/b><\\/td>$lt{'incl'}<\\/b><\\/td>$lt{'mesa'}<\\/td><\\/tr>"); } function displaySubject(msg,shwsel) { pDoc = pWin.document; @@ -1628,7 +1631,7 @@ INNERJS hDoc.write('
'); hDoc.write(''); - hDoc.write("'. &Apache::loncommon::end_data_table_header_row()."\n". &Apache::loncommon::start_data_table_row(). - ''. - ''. + ''. + ''. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row(). - ''. - ''."\n". + ''. + ''."\n". &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table().'

'); } else {
$lt{'txtc'}<\\/b><\\/td>$lt{'font'}<\\/b><\\/td>Font Style<\\/td><\\/tr>"); + hDoc.write("$lt{'txtc'}<\\/b><\\/td>$lt{'font'}<\\/b><\\/td>$lt{'fnst'}<\\/td><\\/tr>"); } function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { @@ -1775,9 +1778,10 @@ sub handback_box { my $prefix = $counter.'_'.$partid.'_'.$respid.'_'; my $files=&get_submitted_files($udom,$uname,$partid,$respid,$record); next if (!@$files); - my $file_counter = 1; + my $file_counter = 0; foreach my $file (@$files) { if ($file =~ /\/portfolio\//) { + $file_counter++; my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|); my ($name,$version,$ext) = &file_name_version_ext($file_disp); $file_disp = "$name.$ext"; @@ -1785,11 +1789,14 @@ sub handback_box { $result.=&mt('Return commented version of [_1] to student.', ''.$file_disp.''); $result.=''."\n"; - $result.='
'; - $result.='('.&mt('File will be uploaded when you click on Save & Next below.').')
'; - $file_counter++; + $result.='
'."\n"; } } + if ($file_counter) { + $result .= ''."\n". + ''. + '('.&mt('File(s) will be uploaded when you click on Save & Next below.',$file_counter).')

'; + } } return $result; } @@ -2018,6 +2025,7 @@ sub submission { my %lt = &Apache::lonlocal::texthash( keyw => 'Keyword Options', + list => 'List', past => 'Paste Selection to List', high => 'Hightlight Attribute', ); @@ -2026,7 +2034,7 @@ sub submission { # $request->print(<$lt{'keyw'}:  -List    +$lt{'list'}    $lt{'past'}    $lt{'high'}

@@ -2729,7 +2737,7 @@ sub processHandGrade { $ctr++; } if ($total < 0) { - my $the_end.=&mt('Message: No more students for this section or class.').'

'."\n"; + my $the_end.='

'.&mt('[_1]Message:[_2] No more students for this section or class.','','').'

'."\n"; $request->print($the_end); } return ''; @@ -2880,18 +2888,19 @@ sub handback_files { $request->print('
'.&navmap_errormsg().'
'); return; } + my @handedback; + my $file_msg; my @part_response_id = &flatten_responseType($responseType); foreach my $part_response_id (@part_response_id) { my ($part_id,$resp_id) = @{ $part_response_id }; my $part_resp = join('_',@{ $part_response_id }); - if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part eq $part_id)) { - # if multiple files are uploaded names will be 'returndoc2','returndoc3' - my $file_counter = 1; - my $file_msg; - while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) { - my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'}; + if (($env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'} =~ /^\d+$/) & ($new_part eq $part_id)) { + for (my $counter=1; $counter<=$env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'}; $counter++) { + # if multiple files are uploaded names will be 'returndoc2','returndoc3' + if ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter}) { + my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter.'.filename'}; my ($directory,$answer_file) = - ($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter} =~ /^(.*?)([^\/]*)$/); + ($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter} =~ /^(.*?)([^\/]*)$/); my ($answer_name,$answer_ver,$answer_ext) = &file_name_version_ext($answer_file); my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/); @@ -2901,42 +2910,55 @@ sub handback_files { # fix file name my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/); my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain, - $newflg.'_'.$part_resp.'_returndoc'.$file_counter, + $newflg.'_'.$part_resp.'_returndoc'.$counter, $save_file_name); if ($result !~ m|^/uploaded/|) { $request->print('
'. &mt('An error occurred ([_1]) while trying to upload [_2].', - $result,$newflg.'_'.$part_resp.'_returndoc'.$file_counter). + $result,$newflg.'_'.$part_resp.'_returndoc'.$counter). ''); } else { # mark the file as read only - my @files = ($save_file_name); - my @what = ($symb,$env{'request.course.id'},'handback'); - &Apache::lonnet::mark_as_readonly($domain,$stuname,\@files,\@what); + push(@handedback,$save_file_name); if (exists($$newrecord{"resource.$new_part.$resp_id.handback"})) { $$newrecord{"resource.$new_part.$resp_id.handback"}.=','; } $$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name; - $file_msg.= "\n".'
'.$save_file_name."
"; - + $file_msg.= ''.$save_file_name."
"; } - $request->print('
'.&mt('[_1] will be the uploaded file name [_2]',''.$fname.'',''.$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter}.'')); - $file_counter++; + $request->print('
'.&mt('[_1] will be the uploaded file name [_2]',''.$fname.'',''.$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter}.'')); } - my $subject = "File Handed Back by Instructor "; - my $message = "A file has been returned that was originally submitted in reponse to:
"; - $message .= "".&Apache::lonnet::gettitle($symb)."
"; - $message .= ' The returned file(s) are named: '. $file_msg; - $message .= " and can be found in your portfolio space."; - my ($feedurl,$showsymb) = - &get_feedurl_and_symb($symb,$domain,$stuname); - my $restitle = &Apache::lonnet::gettitle($symb); - my $msgstatus = - &Apache::lonmsg::user_normal_msg($stuname,$domain,$subject. - ' (File Returned) ['.$restitle.']',$message,undef, - $feedurl,undef,undef,undef,$showsymb,$restitle); } } + } + if (@handedback > 0) { + $request->print('
'); + my @what = ($symb,$env{'request.course.id'},'handback'); + &Apache::lonnet::mark_as_readonly($domain,$stuname,\@handedback,\@what); + my $user_lh = &Apache::loncommon::user_lang($stuname,$domain,$env{'request.course.id'}); + my ($subject,$message); + if (scalar(@handedback) == 1) { + $subject = &mt_user($user_lh,'File Handed Back by Instructor'); + $message = &mt_user($user_lh,'A file has been returned that was originally submitted in response to: '); + } else { + $subject = &mt_user($user_lh,'Files Handed Back by Instructor'); + $message = &mt_user($user_lh,'Files have been returned that were originally submitted in response to: '); + } + $message .= "

".&Apache::lonnet::gettitle($symb)."

"; + $message .= &mt_user($user_lh,'The returned file(s) are named: [_1]',"
$file_msg
"). + &mt_user($user_lh,'The file(s) can be found in your [_1]portfolio[_2].','',''); + my ($feedurl,$showsymb) = + &get_feedurl_and_symb($symb,$domain,$stuname); + my $restitle = &Apache::lonnet::gettitle($symb); + $subject .= ' '.&mt_user($user_lh,'(File Returned)').' ['.$restitle.']'; + my $msgstatus = + &Apache::lonmsg::user_normal_msg($stuname,$domain,$subject, + $message,undef,$feedurl,undef,undef,undef,$showsymb, + $restitle); + if ($msgstatus) { + $request->print(&mt('Notification message status: [_1]',''.$msgstatus.'').'
'); + } + } return; } @@ -4068,6 +4090,7 @@ sub csvuploadassign { my ($classlist) = &getclasslist('all',0); my @notallowed; my @skipped; + my @warnings; my $countdone=0; foreach my $grade (@gradedata) { my %entries=&Apache::loncommon::record_sep($grade); @@ -4117,7 +4140,7 @@ sub csvuploadassign { my $award=($pcr == 0) ? 'incorrect_by_override' : 'correct_by_override'; if ($pcr>1) { - push(@skipped,&mt("[_1]: point value larger than weight","$username:$domain")); + push(@warnings,&mt("[_1]: point value larger than weight","$username:$domain")); } $grades{"resource.$part.awarded"}=$pcr; $grades{"resource.$part.solved"}=$award; @@ -4163,6 +4186,10 @@ sub csvuploadassign { } } $request->print('
'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0)); + if (@warnings) { + $request->print('
'.&Apache::lonhtmlcommon::confirm_success(&mt('Warnings generated for the following saved scores:'),1).'
'); + $request->print(join(', ',@warnings)); + } if (@skipped) { $request->print('
'.&Apache::lonhtmlcommon::confirm_success(&mt('No scores stored for the following username(s):'),1).'
'); $request->print(join(', ',@skipped)); @@ -6845,19 +6872,28 @@ sub scantron_get_correction { #the previous one or the current one if ( $$scan_record{'scantron.PaperID'} =~ /\S/) { - $r->print("

".&mt("An error was detected ($error)". - " for PaperID [_1]", - $$scan_record{'scantron.PaperID'})."

\n"); + $r->print( + '

' + .&mt('An error was detected ([_1]) for PaperID [_2]', + "$error", + ''.$$scan_record{'scantron.PaperID'}.'') + ."

\n"); } else { - $r->print("

".&mt("An error was detected ($error)". - " in scanline [_1]

[_2]
", - $i,$line)."

\n"); - } - my $message="

".&mt("The ID on the form is [_1]
". - "The name on the paper is [_2],[_3]", - $$scan_record{'scantron.ID'}, - $$scan_record{'scantron.LastName'}, - $$scan_record{'scantron.FirstName'})."

"; + $r->print( + '

' + .&mt('An error was detected ([_1]) in scanline [_2] [_3]', + "$error", $i, "

$line
") + ."

\n"); + } + my $message = + '

' + .&mt('The ID on the form is [_1]', + "$$scan_record{'scantron.ID'}") + .'
' + .&mt('The name on the paper is [_2], [_3]', + $$scan_record{'scantron.LastName'}, + $$scan_record{'scantron.FirstName'}) + .'

'; $r->print(''."\n"); $r->print(''."\n"); @@ -6867,10 +6903,10 @@ sub scantron_get_correction { if ($error =~ /ID$/) { if ($error eq 'incorrectID') { - $r->print("

".&mt("The encoded ID is not in the classlist"). + $r->print('

'.&mt("The encoded ID is not in the classlist"). "

\n"); } elsif ($error eq 'duplicateID') { - $r->print("

".&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."

\n"); + $r->print('

'.&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."

\n"); } $r->print($message); $r->print("

".&mt("How should I handle this?")."
\n"); @@ -6886,14 +6922,15 @@ sub scantron_get_correction { $r->print(''); } elsif ($error =~ /CODE$/) { if ($error eq 'incorrectCODE') { - $r->print("

".&mt("The encoded CODE is not in the list of possible CODEs.")."

\n"); + $r->print('

'.&mt("The encoded CODE is not in the list of possible CODEs.")."

\n"); } elsif ($error eq 'duplicateCODE') { - $r->print("

".&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."

\n"); + $r->print('

'.&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."

\n"); } - $r->print("

".&mt("The CODE on the form is '[_1]'", - $$scan_record{'scantron.CODE'})."
\n"); + $r->print("

".&mt('The CODE on the form is [_1]', + "'$$scan_record{'scantron.CODE'}'") + ."

\n"); $r->print($message); - $r->print("

".&mt("How should I handle this?")."
\n"); + $r->print("

".&mt("How should I handle this?")."

\n"); $r->print("\n
"); my $i=0; if ($error eq 'incorrectCODE' @@ -6958,7 +6995,7 @@ ENDSCRIPT "")); $r->print("\n

"); } elsif ($error eq 'doublebubble') { - $r->print("

".&mt("There have been multiple bubbles scanned for some question(s)")."

\n"); + $r->print('

'.&mt("There have been multiple bubbles scanned for some question(s)")."

\n"); # The form field scantron_questions is acutally a list of line numbers. # represented by this form so: @@ -6976,7 +7013,7 @@ ENDSCRIPT } $r->print(&verify_bubbles_checked(@lines_to_correct)); } elsif ($error eq 'missingbubble') { - $r->print("

".&mt("There have been no bubbles scanned for some question(s)")."

\n"); + $r->print('

'.&mt("There have been [_1]no[_2] bubbles scanned for some question(s)",'','')."

\n"); $r->print($message); $r->print("

".&mt("Please indicate which bubble should be used for grading.")."

"); $r->print(&mt("Some questions have no scanned bubbles.")."\n"); @@ -7803,12 +7840,12 @@ SCANTRONFORM $studentrecord .= $recording; } if ($studentrecord ne $studentdata) { - $r->print('

'); + $r->print('

'); if ($scancode eq '') { - $r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2].', + $r->print(&mt('Mismatch grading bubblesheet for user: [_1] with ID: [_2].', $uname.':'.$udom,$scan_record->{'scantron.ID'})); } else { - $r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2] and CODE: [_3].', + $r->print(&mt('Mismatch grading bubblesheet for user: [_1] with ID: [_2] and CODE: [_3].', $uname.':'.$udom,$scan_record->{'scantron.ID'},$scancode)); } $r->print('
'.&Apache::loncommon::start_data_table()."\n". @@ -7816,12 +7853,12 @@ SCANTRONFORM '

'.&mt('Source').''.&mt('Bubbled responses').''.&mt('Bubble Sheet').''.$studentdata.''.&mt('Bubblesheet').''.$studentdata.'Stored submissions'.$studentrecord.''.&mt('Stored submissions').''.$studentrecord.'