version 1.653, 2011/10/01 15:48:18
|
version 1.670, 2012/01/02 22:09:25
|
Line 45 use Apache::lonlocal;
|
Line 45 use Apache::lonlocal;
|
use Apache::lonenc; |
use Apache::lonenc; |
use Apache::lonstathelpers; |
use Apache::lonstathelpers; |
use Apache::lonquickgrades; |
use Apache::lonquickgrades; |
|
use Apache::bridgetask(); |
use String::Similarity; |
use String::Similarity; |
use LONCAPA; |
use LONCAPA; |
|
|
Line 340 sub cleanRecord {
|
Line 341 sub cleanRecord {
|
return '<blockquote><table border="1">'. |
return '<blockquote><table border="1">'. |
'<tr valign="top"><td>'.&mt('Answer').'</td>'.$toprow.'</tr>'. |
'<tr valign="top"><td>'.&mt('Answer').'</td>'.$toprow.'</tr>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. |
$grayFont.$bottomrow.'</tr>'.'</table></blockquote>'; |
$bottomrow.'</tr></table></blockquote>'; |
} elsif ($response eq 'match') { |
} elsif ($response eq 'match') { |
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
Line 362 sub cleanRecord {
|
Line 363 sub cleanRecord {
|
'<tr valign="top"><td>'.$grayFont.&mt('Item ID').'</span></td>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Item ID').'</span></td>'. |
$middlerow.'</tr>'. |
$middlerow.'</tr>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. |
$bottomrow.'</tr>'.'</table></blockquote>'; |
$bottomrow.'</tr></table></blockquote>'; |
} elsif ($response eq 'radiobutton') { |
} elsif ($response eq 'radiobutton') { |
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
my ($toprow,$bottomrow); |
my ($toprow,$bottomrow); |
Line 383 sub cleanRecord {
|
Line 384 sub cleanRecord {
|
return '<blockquote><table border="1">'. |
return '<blockquote><table border="1">'. |
'<tr valign="top"><td>'.&mt('Answer').'</td>'.$toprow.'</tr>'. |
'<tr valign="top"><td>'.&mt('Answer').'</td>'.$toprow.'</tr>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. |
'<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'. |
$bottomrow.'</tr>'.'</table></blockquote>'; |
$bottomrow.'</tr></table></blockquote>'; |
} elsif ($response eq 'essay') { |
} elsif ($response eq 'essay') { |
if (! exists ($env{'form.'.$symb})) { |
if (! exists ($env{'form.'.$symb})) { |
my (%keyhash) = &Apache::lonnet::dump('nohist_handgrade', |
my (%keyhash) = &Apache::lonnet::dump('nohist_handgrade', |
Line 1414 INNERJS
|
Line 1415 INNERJS
|
adds => 'Add selection to keyword list? Edit if desired.', |
adds => 'Add selection to keyword list? Edit if desired.', |
comp => 'Compose Message for: ', |
comp => 'Compose Message for: ', |
incl => 'Include', |
incl => 'Include', |
|
type => 'Type', |
subj => 'Subject', |
subj => 'Subject', |
mesa => 'Message', |
mesa => 'Message', |
new => 'New', |
new => 'New', |
Line 1422 INNERJS
|
Line 1424 INNERJS
|
kehi => 'Keyword Highlight Options', |
kehi => 'Keyword Highlight Options', |
txtc => 'Text Color', |
txtc => 'Text Color', |
font => 'Font Size', |
font => 'Font Size', |
|
fnst => 'Font Style', |
); |
); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
|
|
Line 1521 INNERJS
|
Line 1524 INNERJS
|
|
|
function savedMsgHeader(Nmsg,usrctr,fullname) { |
function savedMsgHeader(Nmsg,usrctr,fullname) { |
var height = 70*Nmsg+250; |
var height = 70*Nmsg+250; |
var scrollbar = "no"; |
|
if (height > 600) { |
if (height > 600) { |
height = 600; |
height = 600; |
scrollbar = "yes"; |
|
} |
} |
var xpos = (screen.width-600)/2; |
var xpos = (screen.width-600)/2; |
xpos = (xpos < 0) ? '0' : xpos; |
xpos = (xpos < 0) ? '0' : xpos; |
var ypos = (screen.height-height)/2-30; |
var ypos = (screen.height-height)/2-30; |
ypos = (ypos < 0) ? '0' : ypos; |
ypos = (ypos < 0) ? '0' : ypos; |
|
|
pWin = window.open('', 'MessageCenter', 'resizable=yes,toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=700,height='+height); |
pWin = window.open('', 'MessageCenter', 'resizable=yes,toolbar=no,location=no,scrollbars=yes,screenx='+xpos+',screeny='+ypos+',width=700,height='+height); |
pWin.focus(); |
pWin.focus(); |
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.$docopen; |
pDoc.$docopen; |
Line 1543 INNERJS
|
Line 1544 INNERJS
|
|
|
pDoc.write('<table border="0" width="100%"><tr><td bgcolor="#777777">'); |
pDoc.write('<table border="0" width="100%"><tr><td bgcolor="#777777">'); |
pDoc.write('<table border="0" width="100%"><tr bgcolor="#DDFFFF">'); |
pDoc.write('<table border="0" width="100%"><tr bgcolor="#DDFFFF">'); |
pDoc.write("<td><b>Type<\\/b><\\/td><td><b>$lt{'incl'}<\\/b><\\/td><td><b>$lt{'mesa'}<\\/td><\\/tr>"); |
pDoc.write("<td><b>$lt{'type'}<\\/b><\\/td><td><b>$lt{'incl'}<\\/b><\\/td><td><b>$lt{'mesa'}<\\/td><\\/tr>"); |
} |
} |
function displaySubject(msg,shwsel) { |
function displaySubject(msg,shwsel) { |
pDoc = pWin.document; |
pDoc = pWin.document; |
Line 1628 INNERJS
|
Line 1629 INNERJS
|
|
|
hDoc.write('<table border="0" width="100%"><tr><td bgcolor="#777777">'); |
hDoc.write('<table border="0" width="100%"><tr><td bgcolor="#777777">'); |
hDoc.write('<table border="0" width="100%"><tr bgcolor="#DDFFFF">'); |
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>Font Style<\\/td><\\/tr>"); |
hDoc.write("<td><b>$lt{'txtc'}<\\/b><\\/td><td><b>$lt{'font'}<\\/b><\\/td><td><b>$lt{'fnst'}<\\/td><\\/tr>"); |
} |
} |
|
|
function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { |
function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { |
Line 1775 sub handback_box {
|
Line 1776 sub handback_box {
|
my $prefix = $counter.'_'.$partid.'_'.$respid.'_'; |
my $prefix = $counter.'_'.$partid.'_'.$respid.'_'; |
my $files=&get_submitted_files($udom,$uname,$partid,$respid,$record); |
my $files=&get_submitted_files($udom,$uname,$partid,$respid,$record); |
next if (!@$files); |
next if (!@$files); |
my $file_counter = 1; |
my $file_counter = 0; |
foreach my $file (@$files) { |
foreach my $file (@$files) { |
if ($file =~ /\/portfolio\//) { |
if ($file =~ /\/portfolio\//) { |
|
$file_counter++; |
my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|); |
my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|); |
my ($name,$version,$ext) = &file_name_version_ext($file_disp); |
my ($name,$version,$ext) = &file_name_version_ext($file_disp); |
$file_disp = "$name.$ext"; |
$file_disp = "$name.$ext"; |
Line 1785 sub handback_box {
|
Line 1787 sub handback_box {
|
$result.=&mt('Return commented version of [_1] to student.', |
$result.=&mt('Return commented version of [_1] to student.', |
'<span class="LC_filename">'.$file_disp.'</span>'); |
'<span class="LC_filename">'.$file_disp.'</span>'); |
$result.='<input type="file" name="'.$prefix.'returndoc'.$file_counter.'" />'."\n"; |
$result.='<input type="file" name="'.$prefix.'returndoc'.$file_counter.'" />'."\n"; |
$result.='<input type="hidden" name="'.$prefix.'origdoc'.$file_counter.'" value="'.$file.'" /><br />'; |
$result.='<input type="hidden" name="'.$prefix.'origdoc'.$file_counter.'" value="'.$file.'" /><br />'."\n"; |
$result.='('.&mt('File will be uploaded when you click on Save & Next below.').')<br />'; |
|
$file_counter++; |
|
} |
} |
} |
} |
|
if ($file_counter) { |
|
$result .= '<input type="hidden" name="'.$prefix.'countreturndoc" value="'.$file_counter.'" />'."\n". |
|
'<span class="LC_info">'. |
|
'('.&mt('File(s) will be uploaded when you click on Save & Next below.',$file_counter).')</span><br /><br />'; |
|
} |
} |
} |
return $result; |
return $result; |
} |
} |
Line 2018 sub submission {
|
Line 2023 sub submission {
|
|
|
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
keyw => 'Keyword Options', |
keyw => 'Keyword Options', |
|
list => 'List', |
past => 'Paste Selection to List', |
past => 'Paste Selection to List', |
high => 'Hightlight Attribute', |
high => 'Highlight Attribute', |
); |
); |
# |
# |
# Print out the keyword options line |
# Print out the keyword options line |
# |
# |
$request->print(<<KEYWORDS); |
$request->print(<<KEYWORDS); |
<br /><b>$lt{'keyw'}:</b> |
<br /><b>$lt{'keyw'}:</b> |
<a href="javascript:keywords(document.SCORE);" target="_self">List</a> |
<a href="javascript:keywords(document.SCORE);" target="_self">$lt{'list'}</a> |
<a href="#" onmousedown="javascript:getSel(); return false" |
<a href="#" onmousedown="javascript:getSel(); return false" |
CLASS="page">$lt{'past'}</a> |
CLASS="page">$lt{'past'}</a> |
<a href="javascript:kwhighlight();" target="_self">$lt{'high'}</a><br /><br /> |
<a href="javascript:kwhighlight();" target="_self">$lt{'high'}</a><br /><br /> |
Line 2880 sub handback_files {
|
Line 2886 sub handback_files {
|
$request->print('<br />'.&navmap_errormsg().'<br />'); |
$request->print('<br />'.&navmap_errormsg().'<br />'); |
return; |
return; |
} |
} |
|
my @handedback; |
|
my $file_msg; |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id = &flatten_responseType($responseType); |
foreach my $part_response_id (@part_response_id) { |
foreach my $part_response_id (@part_response_id) { |
my ($part_id,$resp_id) = @{ $part_response_id }; |
my ($part_id,$resp_id) = @{ $part_response_id }; |
my $part_resp = join('_',@{ $part_response_id }); |
my $part_resp = join('_',@{ $part_response_id }); |
if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part eq $part_id)) { |
if (($env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'} =~ /^\d+$/) & ($new_part eq $part_id)) { |
# if multiple files are uploaded names will be 'returndoc2','returndoc3' |
for (my $counter=1; $counter<=$env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'}; $counter++) { |
my $file_counter = 1; |
# if multiple files are uploaded names will be 'returndoc2','returndoc3' |
my $file_msg; |
if ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter}) { |
while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) { |
my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter.'.filename'}; |
my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'}; |
|
my ($directory,$answer_file) = |
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) = |
my ($answer_name,$answer_ver,$answer_ext) = |
&file_name_version_ext($answer_file); |
&file_name_version_ext($answer_file); |
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/); |
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/); |
my $getpropath = 1; |
my $getpropath = 1; |
my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$portfolio_path,$domain,$stuname,$getpropath); |
my ($dir_list,$listerror) = |
my $version = &get_next_version($answer_name, $answer_ext, \@dir_list); |
&Apache::lonnet::dirlist($portfolio_root.$portfolio_path, |
|
$domain,$stuname,$getpropath); |
|
my $version = &get_next_version($answer_name,$answer_ext,$dir_list); |
# fix file name |
# fix file name |
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/); |
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/); |
my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain, |
my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain, |
$newflg.'_'.$part_resp.'_returndoc'.$file_counter, |
$newflg.'_'.$part_resp.'_returndoc'.$counter, |
$save_file_name); |
$save_file_name); |
if ($result !~ m|^/uploaded/|) { |
if ($result !~ m|^/uploaded/|) { |
$request->print('<br /><span class="LC_error">'. |
$request->print('<br /><span class="LC_error">'. |
&mt('An error occurred ([_1]) while trying to upload [_2].', |
&mt('An error occurred ([_1]) while trying to upload [_2].', |
$result,$newflg.'_'.$part_resp.'_returndoc'.$file_counter). |
$result,$newflg.'_'.$part_resp.'_returndoc'.$counter). |
'</span>'); |
'</span>'); |
} else { |
} else { |
# mark the file as read only |
# mark the file as read only |
my @files = ($save_file_name); |
push(@handedback,$save_file_name); |
my @what = ($symb,$env{'request.course.id'},'handback'); |
|
&Apache::lonnet::mark_as_readonly($domain,$stuname,\@files,\@what); |
|
if (exists($$newrecord{"resource.$new_part.$resp_id.handback"})) { |
if (exists($$newrecord{"resource.$new_part.$resp_id.handback"})) { |
$$newrecord{"resource.$new_part.$resp_id.handback"}.=','; |
$$newrecord{"resource.$new_part.$resp_id.handback"}.=','; |
} |
} |
$$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name; |
$$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name; |
$file_msg.= "\n".'<br /><span class="LC_filename"><a href="/uploaded/'."$domain/$stuname/".$save_file_name.'">'.$save_file_name."</a></span><br />"; |
$file_msg.= '<span class="LC_filename"><a href="/uploaded/'."$domain/$stuname/".$save_file_name.'">'.$save_file_name."</a></span> <br />"; |
|
|
} |
} |
$request->print('<br />'.&mt('[_1] will be the uploaded file name [_2]','<span class="LC_info">'.$fname.'</span>','<span class="LC_filename">'.$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter}.'</span>')); |
$request->print('<br />'.&mt('[_1] will be the uploaded file name [_2]','<span class="LC_info">'.$fname.'</span>','<span class="LC_filename">'.$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter}.'</span>')); |
$file_counter++; |
|
} |
} |
my $subject = "File Handed Back by Instructor "; |
|
my $message = "A file has been returned that was originally submitted in reponse to: <br />"; |
|
$message .= "<strong>".&Apache::lonnet::gettitle($symb)."</strong><br />"; |
|
$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('<br />'); |
|
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 .= "<p><strong>".&Apache::lonnet::gettitle($symb)." </strong></p>"; |
|
$message .= &mt_user($user_lh,'The returned file(s) are named: [_1]',"<br />$file_msg <br />"). |
|
&mt_user($user_lh,'The file(s) can be found in your [_1]portfolio[_2].','<a href="/adm/portfolio">','</a>'); |
|
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]','<span class="LC_info">'.$msgstatus.'</span>').'<br />'); |
|
} |
|
} |
return; |
return; |
} |
} |
|
|
Line 3045 sub version_portfiles {
|
Line 3067 sub version_portfiles {
|
my ($answer_name,$answer_ver,$answer_ext) = |
my ($answer_name,$answer_ver,$answer_ext) = |
&file_name_version_ext($answer_file); |
&file_name_version_ext($answer_file); |
my $getpropath = 1; |
my $getpropath = 1; |
my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$directory,$domain,$stu_name,$getpropath); |
my ($dir_list,$listerror) = |
my $version = &get_next_version($answer_name, $answer_ext, \@dir_list); |
&Apache::lonnet::dirlist($portfolio_root.$directory,$domain, |
|
$stu_name,$getpropath); |
|
my $version = &get_next_version($answer_name,$answer_ext,$dir_list); |
my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version); |
my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version); |
if ($new_answer ne 'problem getting file') { |
if ($new_answer ne 'problem getting file') { |
push(@versioned_portfiles, $directory.$new_answer); |
push(@versioned_portfiles, $directory.$new_answer); |
Line 3065 sub version_portfiles {
|
Line 3089 sub version_portfiles {
|
sub get_next_version { |
sub get_next_version { |
my ($answer_name, $answer_ext, $dir_list) = @_; |
my ($answer_name, $answer_ext, $dir_list) = @_; |
my $version; |
my $version; |
foreach my $row (@$dir_list) { |
if (ref($dir_list) eq 'ARRAY') { |
my ($file) = split(/\&/,$row,2); |
foreach my $row (@{$dir_list}) { |
my ($file_name,$file_version,$file_ext) = |
my ($file) = split(/\&/,$row,2); |
&file_name_version_ext($file); |
my ($file_name,$file_version,$file_ext) = |
if (($file_name eq $answer_name) && |
&file_name_version_ext($file); |
($file_ext eq $answer_ext)) { |
if (($file_name eq $answer_name) && |
# gets here if filename and extension match, regardless of version |
($file_ext eq $answer_ext)) { |
|
# gets here if filename and extension match, |
|
# regardless of version |
if ($file_version ne '') { |
if ($file_version ne '') { |
# a versioned file is found so save it for later |
# a versioned file is found so save it for later |
if ($file_version > $version) { |
if ($file_version > $version) { |
$version = $file_version; |
$version = $file_version; |
} |
} |
|
} |
} |
} |
} |
} |
} |
} |
$version ++; |
$version ++; |
return($version); |
return($version); |
} |
} |
Line 4068 sub csvuploadassign {
|
Line 4095 sub csvuploadassign {
|
my ($classlist) = &getclasslist('all',0); |
my ($classlist) = &getclasslist('all',0); |
my @notallowed; |
my @notallowed; |
my @skipped; |
my @skipped; |
|
my @warnings; |
my $countdone=0; |
my $countdone=0; |
foreach my $grade (@gradedata) { |
foreach my $grade (@gradedata) { |
my %entries=&Apache::loncommon::record_sep($grade); |
my %entries=&Apache::loncommon::record_sep($grade); |
Line 4117 sub csvuploadassign {
|
Line 4145 sub csvuploadassign {
|
my $award=($pcr == 0) ? 'incorrect_by_override' |
my $award=($pcr == 0) ? 'incorrect_by_override' |
: 'correct_by_override'; |
: 'correct_by_override'; |
if ($pcr>1) { |
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.awarded"}=$pcr; |
$grades{"resource.$part.solved"}=$award; |
$grades{"resource.$part.solved"}=$award; |
Line 4163 sub csvuploadassign {
|
Line 4191 sub csvuploadassign {
|
} |
} |
} |
} |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0)); |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0)); |
|
if (@warnings) { |
|
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt('Warnings generated for the following saved scores:'),1).'<br />'); |
|
$request->print(join(', ',@warnings)); |
|
} |
if (@skipped) { |
if (@skipped) { |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt('No scores stored for the following username(s):'),1).'<br />'); |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt('No scores stored for the following username(s):'),1).'<br />'); |
$request->print(join(', ',@skipped)); |
$request->print(join(', ',@skipped)); |
Line 4553 sub displaySubByDates {
|
Line 4585 sub displaySubByDates {
|
|
|
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) |
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) |
: ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); |
: ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); |
$displaySub[0].='<span class="LC_nobreak"'; |
$displaySub[0].='<span class="LC_nobreak">'; |
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
.' <span class="LC_internal_info">' |
.' <span class="LC_internal_info">' |
.'('.&mt('Response ID: [_1]',$responseId).')' |
.'('.&mt('Response ID: [_1]',$responseId).')' |
Line 4810 sub updateGradeByPage {
|
Line 4842 sub updateGradeByPage {
|
from the file that we are parsing that represents one entire sheet |
from the file that we are parsing that represents one entire sheet |
|
|
'bubble line' refers to the data |
'bubble line' refers to the data |
representing the line of bubbles that are on the physical bubble sheet |
representing the line of bubbles that are on the physical bubblesheet |
|
|
|
|
The overall process is that a scanned in bubble sheet data is uploaded |
The overall process is that a scanned in bubblesheet data is uploaded |
into a course. When a user wants to grade, they select a |
into a course. When a user wants to grade, they select a |
sequence/folder of resources, a file of bubble sheet info, and pick |
sequence/folder of resources, a file of bubblesheet info, and pick |
one of the predefined configurations for what each scanline looks |
one of the predefined configurations for what each scanline looks |
like. |
like. |
|
|
Line 4831 username:domain.
|
Line 4863 username:domain.
|
|
|
During the validation phase the instructor can choose to skip scanlines. |
During the validation phase the instructor can choose to skip scanlines. |
|
|
After the validation phase, there are now 3 bubble sheet files |
After the validation phase, there are now 3 bubblesheet files |
|
|
scantron_original_filename (unmodified original file) |
scantron_original_filename (unmodified original file) |
scantron_corrected_filename (file where the corrected information has replaced the original information) |
scantron_corrected_filename (file where the corrected information has replaced the original information) |
scantron_skipped_filename (contains the exact text of scanlines that where skipped) |
scantron_skipped_filename (contains the exact text of scanlines that where skipped) |
|
|
Also there is a separate hash nohist_scantrondata that contains extra |
Also there is a separate hash nohist_scantrondata that contains extra |
correction information that isn't representable in the bubble sheet |
correction information that isn't representable in the bubblesheet |
file (see &scantron_getfile() for more information) |
file (see &scantron_getfile() for more information) |
|
|
After all scanlines are either valid, marked as valid or skipped, then |
After all scanlines are either valid, marked as valid or skipped, then |
Line 4972 sub scantron_filenames {
|
Line 5004 sub scantron_filenames {
|
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $getpropath = 1; |
my $getpropath = 1; |
my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname, |
my ($dirlist,$listerror) = &Apache::lonnet::dirlist('userfiles',$cdom, |
$getpropath); |
$cname,$getpropath); |
my @possiblenames; |
my @possiblenames; |
foreach my $filename (sort(@files)) { |
if (ref($dirlist) eq 'ARRAY') { |
($filename)=split(/&/,$filename); |
foreach my $filename (sort(@{$dirlist})) { |
if ($filename!~/^scantron_orig_/) { next ; } |
($filename)=split(/&/,$filename); |
$filename=~s/^scantron_orig_//; |
if ($filename!~/^scantron_orig_/) { next ; } |
push(@possiblenames,$filename); |
$filename=~s/^scantron_orig_//; |
|
push(@possiblenames,$filename); |
|
} |
} |
} |
return @possiblenames; |
return @possiblenames; |
} |
} |
Line 5133 sub scantron_CODEunique {
|
Line 5167 sub scantron_CODEunique {
|
|
|
=item scantron_selectphase |
=item scantron_selectphase |
|
|
Generates the initial screen to start the bubble sheet process. |
Generates the initial screen to start the bubblesheet process. |
Allows for - starting a grading run. |
Allows for - starting a grading run. |
- downloading existing scan data (original, corrected |
- downloading existing scan data (original, corrected |
or skipped info) |
or skipped info) |
Line 6155 sub remember_current_skipped {
|
Line 6189 sub remember_current_skipped {
|
=item check_for_error |
=item check_for_error |
|
|
Checks if there was an error when attempting to remove a specific |
Checks if there was an error when attempting to remove a specific |
scantron_.. bubble sheet data file. Prints out an error if |
scantron_.. bubblesheet data file. Prints out an error if |
something went wrong. |
something went wrong. |
|
|
=cut |
=cut |
Line 6190 sub scantron_warning_screen {
|
Line 6224 sub scantron_warning_screen {
|
'<tr><td><b>'.&mt('List of CODES to validate against:').'</b></td><td><tt>'. |
'<tr><td><b>'.&mt('List of CODES to validate against:').'</b></td><td><tt>'. |
$env{'form.scantron_CODElist'}.'</tt></td></tr>'; |
$env{'form.scantron_CODElist'}.'</tt></td></tr>'; |
} |
} |
|
my $lastbubblepoints; |
|
if ($env{'form.scantron_lastbubblepoints'} ne '') { |
|
$lastbubblepoints = |
|
'<tr><td><b>'.&mt('Hand-graded items: points from last bubble in row').'</b></td><td><tt>'. |
|
$env{'form.scantron_lastbubblepoints'}.'</tt></td></tr>'; |
|
} |
return (' |
return (' |
<p> |
<p> |
<span class="LC_warning"> |
<span class="LC_warning"> |
Line 6198 sub scantron_warning_screen {
|
Line 6238 sub scantron_warning_screen {
|
<table> |
<table> |
<tr><td><b>'.&mt('Sequence to be Graded:').'</b></td><td>'.$title.'</td></tr> |
<tr><td><b>'.&mt('Sequence to be Graded:').'</b></td><td>'.$title.'</td></tr> |
<tr><td><b>'.&mt('Data File that will be used:').'</b></td><td><tt>'.$env{'form.scantron_selectfile'}.'</tt></td></tr> |
<tr><td><b>'.&mt('Data File that will be used:').'</b></td><td><tt>'.$env{'form.scantron_selectfile'}.'</tt></td></tr> |
'.$CODElist.' |
'.$CODElist.$lastbubblepoints.' |
</table> |
</table> |
<p> '.&mt('If this information is correct, please click on \'[_1]\'.',&mt($button_text)).'<br /> |
<p> '.&mt('If this information is correct, please click on \'[_1]\'.',&mt($button_text)).'<br /> |
'.&mt('If something is incorrect, please return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','<a href="/adm/grades?symb='.$symb.'&command=scantron_selectphase" class="LC_info">','</a>').'</p> |
'.&mt('If something is incorrect, please return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','<a href="/adm/grades?symb='.$symb.'&command=scantron_selectphase" class="LC_info">','</a>').'</p> |
Line 6236 sub scantron_do_warning {
|
Line 6276 sub scantron_do_warning {
|
} |
} |
} else { |
} else { |
my $warning=&scantron_warning_screen('Grading: Validate Records',$symb); |
my $warning=&scantron_warning_screen('Grading: Validate Records',$symb); |
|
my $bubbledbyhand=&hand_bubble_option(); |
$r->print(' |
$r->print(' |
'.$warning.' |
'.$warning.$bubbledbyhand.' |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
'); |
'); |
Line 6289 SCANTRONFORM
|
Line 6330 SCANTRONFORM
|
|
|
=item scantron_validate_file |
=item scantron_validate_file |
|
|
Dispatch routine for doing validation of a bubble sheet data file. |
Dispatch routine for doing validation of a bubblesheet data file. |
|
|
Also processes any necessary information resets that need to |
Also processes any necessary information resets that need to |
occur before validation begins (ignore previous corrections, |
occur before validation begins (ignore previous corrections, |
Line 6333 sub scantron_validate_file {
|
Line 6374 sub scantron_validate_file {
|
return ''; |
return ''; |
} |
} |
my $result=&scantron_form_start($max_bubble).$default_form_data; |
my $result=&scantron_form_start($max_bubble).$default_form_data; |
|
if ($env{'form.scantron_lastbubblepoints'} ne '') { |
|
$result .= '<input type="hidden" name="scantron_lastbubblepoints" value="'.$env{'form.scantron_lastbubblepoints'}.'" />'; |
|
} |
$r->print($result); |
$r->print($result); |
|
|
my @validate_phases=( 'sequence', |
my @validate_phases=( 'sequence', |
Line 6400 sub scantron_validate_file {
|
Line 6444 sub scantron_validate_file {
|
|
|
=item scantron_remove_file |
=item scantron_remove_file |
|
|
Removes the requested bubble sheet data file, makes sure that |
Removes the requested bubblesheet data file, makes sure that |
scantron_original_<filename> is never removed |
scantron_original_<filename> is never removed |
|
|
|
|
Line 6425 sub scantron_remove_file {
|
Line 6469 sub scantron_remove_file {
|
|
|
=item scantron_remove_scan_data |
=item scantron_remove_scan_data |
|
|
Removes all scan_data correction for the requested bubble sheet |
Removes all scan_data correction for the requested bubblesheet |
data file. (In the case that both the are doing skipped records we need |
data file. (In the case that both the are doing skipped records we need |
to remember the old skipped lines for the time being so that element |
to remember the old skipped lines for the time being so that element |
persists for a while.) |
persists for a while.) |
Line 6462 sub scantron_remove_scan_data {
|
Line 6506 sub scantron_remove_scan_data {
|
|
|
=item scantron_getfile |
=item scantron_getfile |
|
|
Fetches the requested bubble sheet data file (all 3 versions), and |
Fetches the requested bubblesheet data file (all 3 versions), and |
the scan_data hash |
the scan_data hash |
|
|
Arguments: |
Arguments: |
Line 6562 sub lonnet_putfile {
|
Line 6606 sub lonnet_putfile {
|
|
|
=item scantron_putfile |
=item scantron_putfile |
|
|
Stores the current version of the bubble sheet data files, and the |
Stores the current version of the bubblesheet data files, and the |
scan_data hash. (Does not modify the original version only the |
scan_data hash. (Does not modify the original version only the |
corrected and skipped versions. |
corrected and skipped versions. |
|
|
Line 6656 sub get_todo_count {
|
Line 6700 sub get_todo_count {
|
|
|
=item scantron_put_line |
=item scantron_put_line |
|
|
Updates the 'corrected' or 'skipped' versions of the bubble sheet |
Updates the 'corrected' or 'skipped' versions of the bubblesheet |
data file. |
data file. |
|
|
Arguments: |
Arguments: |
Line 6845 sub scantron_get_correction {
|
Line 6889 sub scantron_get_correction {
|
#the previous one or the current one |
#the previous one or the current one |
|
|
if ( $$scan_record{'scantron.PaperID'} =~ /\S/) { |
if ( $$scan_record{'scantron.PaperID'} =~ /\S/) { |
$r->print("<p>".&mt("<b>An error was detected ($error)</b>". |
$r->print( |
" for PaperID <tt>[_1]</tt>", |
'<p class="LC_warning">' |
$$scan_record{'scantron.PaperID'})."</p> \n"); |
.&mt('An error was detected ([_1]) for PaperID [_2]', |
|
"<b>$error</b>", |
|
'<tt>'.$$scan_record{'scantron.PaperID'}.'</tt>') |
|
."</p> \n"); |
} else { |
} else { |
$r->print("<p>".&mt("<b>An error was detected ($error)</b>". |
$r->print( |
" in scanline [_1] <pre>[_2]</pre>", |
'<p class="LC_warning">' |
$i,$line)."</p> \n"); |
.&mt('An error was detected ([_1]) in scanline [_2] [_3]', |
} |
"<b>$error</b>", $i, "<pre>$line</pre>") |
my $message="<p>".&mt("The ID on the form is <tt>[_1]</tt><br />". |
."</p> \n"); |
"The name on the paper is [_2],[_3]", |
} |
$$scan_record{'scantron.ID'}, |
my $message = |
$$scan_record{'scantron.LastName'}, |
'<p>' |
$$scan_record{'scantron.FirstName'})."</p>"; |
.&mt('The ID on the form is [_1]', |
|
"<tt>$$scan_record{'scantron.ID'}</tt>") |
|
.'<br />' |
|
.&mt('The name on the paper is [_1], [_2]', |
|
$$scan_record{'scantron.LastName'}, |
|
$$scan_record{'scantron.FirstName'}) |
|
.'</p>'; |
|
|
$r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n"); |
$r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n"); |
$r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n"); |
$r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n"); |
Line 6867 sub scantron_get_correction {
|
Line 6920 sub scantron_get_correction {
|
|
|
if ($error =~ /ID$/) { |
if ($error =~ /ID$/) { |
if ($error eq 'incorrectID') { |
if ($error eq 'incorrectID') { |
$r->print("<p>".&mt("The encoded ID is not in the classlist"). |
$r->print('<p class="LC_warning">'.&mt("The encoded ID is not in the classlist"). |
"</p>\n"); |
"</p>\n"); |
} elsif ($error eq 'duplicateID') { |
} elsif ($error eq 'duplicateID') { |
$r->print("<p>".&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."</p>\n"); |
} |
} |
$r->print($message); |
$r->print($message); |
$r->print("<p>".&mt("How should I handle this?")." <br /> \n"); |
$r->print("<p>".&mt("How should I handle this?")." <br /> \n"); |
Line 6886 sub scantron_get_correction {
|
Line 6939 sub scantron_get_correction {
|
$r->print('</li>'); |
$r->print('</li>'); |
} elsif ($error =~ /CODE$/) { |
} elsif ($error =~ /CODE$/) { |
if ($error eq 'incorrectCODE') { |
if ($error eq 'incorrectCODE') { |
$r->print("<p>".&mt("The encoded CODE is not in the list of possible CODEs.")."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("The encoded CODE is not in the list of possible CODEs.")."</p>\n"); |
} elsif ($error eq 'duplicateCODE') { |
} elsif ($error eq 'duplicateCODE') { |
$r->print("<p>".&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."</p>\n"); |
} |
} |
$r->print("<p>".&mt("The CODE on the form is <tt>'[_1]'</tt>", |
$r->print("<p>".&mt('The CODE on the form is [_1]', |
$$scan_record{'scantron.CODE'})."<br />\n"); |
"<tt>'$$scan_record{'scantron.CODE'}'</tt>") |
|
."</p>\n"); |
$r->print($message); |
$r->print($message); |
$r->print("<p>".&mt("How should I handle this?")." <br /> \n"); |
$r->print("<p>".&mt("How should I handle this?")."</p>\n"); |
$r->print("\n<br /> "); |
$r->print("\n<br /> "); |
my $i=0; |
my $i=0; |
if ($error eq 'incorrectCODE' |
if ($error eq 'incorrectCODE' |
Line 6920 sub scantron_get_correction {
|
Line 6974 sub scantron_get_correction {
|
$r->print(" |
$r->print(" |
<label> |
<label> |
<input type='radio' name='scantron_CODE_resolution' value='use_unfound'$checked /> |
<input type='radio' name='scantron_CODE_resolution' value='use_unfound'$checked /> |
".&mt("Use the CODE [_1] that is was on the paper, ignoring the error.", |
".&mt("Use the CODE [_1] that was on the paper, ignoring the error.", |
"<b><tt>".$$scan_record{'scantron.CODE'}."</tt></b>")." |
"<b><tt>".$$scan_record{'scantron.CODE'}."</tt></b>")." |
</label>"); |
</label>"); |
$r->print("\n<br />"); |
$r->print("\n<br />"); |
Line 6958 ENDSCRIPT
|
Line 7012 ENDSCRIPT
|
"</label><input type='text' size='8' name='scantron_CODE_newvalue' onfocus=\"javascript:change_radio('use_typed')\" onkeypress=\"javascript:change_radio('use_typed')\" />")); |
"</label><input type='text' size='8' name='scantron_CODE_newvalue' onfocus=\"javascript:change_radio('use_typed')\" onkeypress=\"javascript:change_radio('use_typed')\" />")); |
$r->print("\n<br /><br />"); |
$r->print("\n<br /><br />"); |
} elsif ($error eq 'doublebubble') { |
} elsif ($error eq 'doublebubble') { |
$r->print("<p>".&mt("There have been multiple bubbles scanned for some question(s)")."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("There have been multiple bubbles scanned for some question(s)")."</p>\n"); |
|
|
# The form field scantron_questions is acutally a list of line numbers. |
# The form field scantron_questions is acutally a list of line numbers. |
# represented by this form so: |
# represented by this form so: |
Line 6976 ENDSCRIPT
|
Line 7030 ENDSCRIPT
|
} |
} |
$r->print(&verify_bubbles_checked(@lines_to_correct)); |
$r->print(&verify_bubbles_checked(@lines_to_correct)); |
} elsif ($error eq 'missingbubble') { |
} elsif ($error eq 'missingbubble') { |
$r->print("<p>".&mt("There have been <b>no</b> bubbles scanned for some question(s)")."</p>\n"); |
$r->print('<p class="LC_warning">'.&mt("There have been [_1]no[_2] bubbles scanned for some question(s)",'<b>','</b>')."</p>\n"); |
$r->print($message); |
$r->print($message); |
$r->print("<p>".&mt("Please indicate which bubble should be used for grading.")."</p>"); |
$r->print("<p>".&mt("Please indicate which bubble should be used for grading.")."</p>"); |
$r->print(&mt("Some questions have no scanned bubbles.")."\n"); |
$r->print(&mt("Some questions have no scanned bubbles.")."\n"); |
Line 7595 sub scantron_validate_missingbubbles {
|
Line 7649 sub scantron_validate_missingbubbles {
|
return (0,$currentphase+1); |
return (0,$currentphase+1); |
} |
} |
|
|
|
sub hand_bubble_option { |
|
my (undef, undef, $sequence) = |
|
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
|
return if ($sequence eq ''); |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
unless (ref($navmap)) { |
|
return; |
|
} |
|
my $needs_hand_bubbles; |
|
my $map=$navmap->getResourceByUrl($sequence); |
|
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
|
foreach my $res (@resources) { |
|
if (ref($res)) { |
|
if ($res->is_problem()) { |
|
my $partlist = $res->parts(); |
|
foreach my $part (@{ $partlist }) { |
|
my @types = $res->responseType($part); |
|
if (grep(/^(chem|essay|image|formula|math|string|functionplot)$/,@types)) { |
|
$needs_hand_bubbles = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($needs_hand_bubbles) { |
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
|
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
|
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>'; |
|
} |
|
return; |
|
} |
|
|
sub scantron_process_students { |
sub scantron_process_students { |
my ($r,$symb) = @_; |
my ($r,$symb) = @_; |
Line 7659 SCANTRONFORM
|
Line 7748 SCANTRONFORM
|
|
|
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $count=&get_todo_count($scanlines,$scan_data); |
my $count=&get_todo_count($scanlines,$scan_data); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Bubblesheet Status', |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count); |
'Bubblesheet Progress',$count, |
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,'Processing first student'); |
'inline',undef,'scantronupload'); |
|
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
|
'Processing first student'); |
|
$r->print('<br />'); |
$r->print('<br />'); |
my $start=&Time::HiRes::time(); |
my $start=&Time::HiRes::time(); |
my $i=-1; |
my $i=-1; |
Line 7695 SCANTRONFORM
|
Line 7781 SCANTRONFORM
|
my $line=&scantron_get_line($scanlines,$scan_data,$i); |
my $line=&scantron_get_line($scanlines,$scan_data,$i); |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($started) { |
if ($started) { |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); |
'last student'); |
|
} |
} |
$started=1; |
$started=1; |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
Line 7803 SCANTRONFORM
|
Line 7888 SCANTRONFORM
|
$studentrecord .= $recording; |
$studentrecord .= $recording; |
} |
} |
if ($studentrecord ne $studentdata) { |
if ($studentrecord ne $studentdata) { |
$r->print('<p><span class="LC_error">'); |
$r->print('<p><span class="LC_warning">'); |
if ($scancode eq '') { |
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'})); |
$uname.':'.$udom,$scan_record->{'scantron.ID'})); |
} else { |
} 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)); |
$uname.':'.$udom,$scan_record->{'scantron.ID'},$scancode)); |
} |
} |
$r->print('</span><br />'.&Apache::loncommon::start_data_table()."\n". |
$r->print('</span><br />'.&Apache::loncommon::start_data_table()."\n". |
Line 7816 SCANTRONFORM
|
Line 7901 SCANTRONFORM
|
'<th>'.&mt('Source').'</th><th>'.&mt('Bubbled responses').'</th>'. |
'<th>'.&mt('Source').'</th><th>'.&mt('Bubbled responses').'</th>'. |
&Apache::loncommon::end_data_table_header_row()."\n". |
&Apache::loncommon::end_data_table_header_row()."\n". |
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td>'.&mt('Bubble Sheet').'</td>'. |
'<td>'.&mt('Bubblesheet').'</td>'. |
'<td><span class="LC_nobreak">'.$studentdata.'</span></td>'. |
'<td><span class="LC_nobreak"><tt>'.$studentdata.'</tt></span></td>'. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td>Stored submissions</td>'. |
'<td>'.&mt('Stored submissions').'</td>'. |
'<td><span class="LC_nobreak">'.$studentrecord.'</span></td>'."\n". |
'<td><span class="LC_nobreak"><tt>'.$studentrecord.'</tt></span></td>'."\n". |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table().'</p>'); |
&Apache::loncommon::end_data_table().'</p>'); |
} else { |
} else { |
Line 7886 sub grade_student_bubbles {
|
Line 7971 sub grade_student_bubbles {
|
if ($bubbles_per_row ne '') { |
if ($bubbles_per_row ne '') { |
$form{'bubbles_per_row'} = $bubbles_per_row; |
$form{'bubbles_per_row'} = $bubbles_per_row; |
} |
} |
|
if ($env{'form.scantron_lastbubblepoints'} ne '') { |
|
$form{'scantron_lastbubblepoints'} = $env{'form.scantron_lastbubblepoints'}; |
|
} |
if (ref($parts) eq 'HASH') { |
if (ref($parts) eq 'HASH') { |
if (ref($parts->{$ressymb}) eq 'ARRAY') { |
if (ref($parts->{$ressymb}) eq 'ARRAY') { |
foreach my $part (@{$parts->{$ressymb}}) { |
foreach my $part (@{$parts->{$ressymb}}) { |
Line 8184 sub checkscantron_results {
|
Line 8272 sub checkscantron_results {
|
my %completedstudents; |
my %completedstudents; |
|
|
my $count=&Apache::grades::get_todo_count($scanlines,$scan_data); |
my $count=&Apache::grades::get_todo_count($scanlines,$scan_data); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Bubblesheet/Submissions Comparison Status', |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count); |
'Progress of Bubblesheet Data/Submission Records Comparison',$count, |
|
'inline',undef,'checkscantron'); |
|
my ($username,$domain,$started); |
my ($username,$domain,$started); |
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. |
Line 8195 sub checkscantron_results {
|
Line 8281 sub checkscantron_results {
|
return ''; |
return ''; |
} |
} |
|
|
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,'Processing first student'); |
'Processing first student'); |
|
my $start=&Time::HiRes::time(); |
my $start=&Time::HiRes::time(); |
my $i=-1; |
my $i=-1; |
|
|
Line 8206 sub checkscantron_results {
|
Line 8291 sub checkscantron_results {
|
my $line=&Apache::grades::scantron_get_line($scanlines,$scan_data,$i); |
my $line=&Apache::grades::scantron_get_line($scanlines,$scan_data,$i); |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($line=~/^[\s\cz]*$/) { next; } |
if ($started) { |
if ($started) { |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); |
'last student'); |
|
} |
} |
$started=1; |
$started=1; |
my $scan_record= |
my $scan_record= |
Line 8459 sub letter_to_digits {
|
Line 8543 sub letter_to_digits {
|
|
|
sub href_symb_cmd { |
sub href_symb_cmd { |
my ($symb,$cmd)=@_; |
my ($symb,$cmd)=@_; |
return '/adm/grades?symb='.&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'<>&"').'&command='.$cmd; |
return '/adm/grades?symb='.&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'<>&"').'&command='.$cmd; |
} |
} |
|
|
sub grading_menu { |
sub grading_menu { |
Line 8819 sub process_clicker {
|
Line 8903 sub process_clicker {
|
my $pincorrect=&mt("Percentage points for incorrect solution"); |
my $pincorrect=&mt("Percentage points for incorrect solution"); |
my $selectform=&Apache::loncommon::select_form($env{'form.upfiletype'},'upfiletype', |
my $selectform=&Apache::loncommon::select_form($env{'form.upfiletype'},'upfiletype', |
{'iclicker' => 'i>clicker', |
{'iclicker' => 'i>clicker', |
'interwrite' => 'interwrite PRS'}); |
'interwrite' => 'interwrite PRS', |
|
'turning' => 'Turning Technologies'}); |
$symb = &Apache::lonenc::check_encrypt($symb); |
$symb = &Apache::lonenc::check_encrypt($symb); |
$result.= &Apache::lonhtmlcommon::scripttag(<<ENDUPFORM); |
$result.= &Apache::lonhtmlcommon::scripttag(<<ENDUPFORM); |
function sanitycheck() { |
function sanitycheck() { |
Line 8993 ENDHEADER
|
Line 9078 ENDHEADER
|
if ($env{'form.upfiletype'} eq 'interwrite') { |
if ($env{'form.upfiletype'} eq 'interwrite') { |
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses); |
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses); |
} |
} |
|
if ($env{'form.upfiletype'} eq 'turning') { |
|
($errormsg,$number)=&turning_eval(\@questiontitles,\%responses); |
|
} |
$result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'. |
$result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'. |
'<input type="hidden" name="number" value="'.$number.'" />'. |
'<input type="hidden" name="number" value="'.$number.'" />'. |
&mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses', |
&mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses', |
Line 9129 sub interwrite_eval {
|
Line 9217 sub interwrite_eval {
|
return ($errormsg,$number); |
return ($errormsg,$number); |
} |
} |
|
|
|
sub turning_eval { |
|
my ($questiontitles,$responses)=@_; |
|
my $number=0; |
|
my $errormsg=''; |
|
foreach my $line (split(/[\n\r]/,$env{'form.upfile'})) { |
|
my %components=&Apache::loncommon::record_sep($line); |
|
my @entries=map {$components{$_}} (sort(keys(%components))); |
|
if ($#entries>$number) { $number=$#entries; } |
|
my $id=$entries[0]; |
|
my @idresponses; |
|
$id=~s/^[\#0]+//; |
|
unless ($id) { next; } |
|
for (my $idx=1;$idx<=$#entries;$idx++) { |
|
$entries[$idx]=~s/\,/\;/g; |
|
$entries[$idx]=~s/[^a-zA-Z0-9\.\*\-\+\;]+//g; |
|
push(@idresponses,$entries[$idx]); |
|
} |
|
$$responses{$id}=join(',',@idresponses); |
|
} |
|
for (my $i=1; $i<=$number; $i++) { |
|
$$questiontitles[$i]=&mt('Question [_1]',$i); |
|
} |
|
return ($errormsg,$number); |
|
} |
|
|
|
|
sub assign_clicker_grades { |
sub assign_clicker_grades { |
my ($r,$symb)=@_; |
my ($r,$symb)=@_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
Line 9294 sub handler {
|
Line 9408 sub handler {
|
} |
} |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); |
|
|
|
# see what command we need to execute |
|
|
|
my @commands=&Apache::loncommon::get_env_multiple('form.command'); |
|
my $command=$commands[0]; |
|
|
&init_perm(); |
&init_perm(); |
if (!$env{'request.course.id'}) { |
if (!$env{'request.course.id'}) { |
# Not in a course. |
unless ((&Apache::lonnet::allowed('usc',$env{'request.role.domain'})) && |
$env{'user.error.msg'}="/adm/grades::vgr:0:0:Cannot display grades page outside course context"; |
($command =~ /^scantronupload/)) { |
return HTTP_NOT_ACCEPTABLE; |
# Not in a course. |
|
$env{'user.error.msg'}="/adm/grades::vgr:0:0:Cannot display grades page outside course context"; |
|
return HTTP_NOT_ACCEPTABLE; |
|
} |
} elsif (!%perm) { |
} elsif (!%perm) { |
$request->internal_redirect('/adm/quickgrades'); |
$request->internal_redirect('/adm/quickgrades'); |
} |
} |
&Apache::loncommon::content_type($request,'text/html'); |
&Apache::loncommon::content_type($request,'text/html'); |
$request->send_http_header; |
$request->send_http_header; |
|
|
|
|
# see what command we need to execute |
|
|
|
my @commands=&Apache::loncommon::get_env_multiple('form.command'); |
|
my $command=$commands[0]; |
|
|
|
if ($#commands > 0) { |
if ($#commands > 0) { |
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands)); |
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands)); |
} |
} |
Line 9473 sub handler {
|
Line 9589 sub handler {
|
&ssi_print_error($request); |
&ssi_print_error($request); |
} |
} |
&Apache::lonquickgrades::endGradeScreen($request); |
&Apache::lonquickgrades::endGradeScreen($request); |
$request->print(&Apache::loncommon::end_page()); |
|
&reset_caches(); |
&reset_caches(); |
return OK; |
return OK; |
} |
} |
Line 9604 ssi_with_retries()
|
Line 9719 ssi_with_retries()
|
|
|
=item scantron_process_students() : |
=item scantron_process_students() : |
|
|
Routine that does the actual grading of the bubble sheet information. |
Routine that does the actual grading of the bubblesheet information. |
|
|
The parsed scanline hash is added to %env |
The parsed scanline hash is added to %env |
|
|
Line 9624 ssi_with_retries()
|
Line 9739 ssi_with_retries()
|
|
|
=item scantron_upload_scantron_data() : |
=item scantron_upload_scantron_data() : |
|
|
Creates the screen for adding a new bubble sheet data file to a course. |
Creates the screen for adding a new bubblesheet data file to a course. |
|
|
=item scantron_upload_scantron_data_save() : |
=item scantron_upload_scantron_data_save() : |
|
|
Line 9638 ssi_with_retries()
|
Line 9753 ssi_with_retries()
|
=item scantron_download_scantron_data() : |
=item scantron_download_scantron_data() : |
|
|
Shows a list of the three internal files (original, corrected, |
Shows a list of the three internal files (original, corrected, |
skipped) for a specific bubble sheet data file that exists in the |
skipped) for a specific bubblesheet data file that exists in the |
course. |
course. |
|
|
=item scantron_validate_ID() : |
=item scantron_validate_ID() : |