version 1.646, 2011/03/31 17:58:25
|
version 1.656, 2011/10/09 16:23:34
|
Line 213 sub reset_caches {
|
Line 213 sub reset_caches {
|
} |
} |
|
|
sub get_analyze { |
sub get_analyze { |
my ($symb,$uname,$udom,$no_increment,$add_to_hash,$type,$trial,$rndseed)=@_; |
my ($symb,$uname,$udom,$no_increment,$add_to_hash,$type,$trial,$rndseed,$bubbles_per_row)=@_; |
my $key = "$symb\0$uname\0$udom"; |
my $key = "$symb\0$uname\0$udom"; |
if ($type eq 'randomizetry') { |
if ($type eq 'randomizetry') { |
if ($trial ne '') { |
if ($trial ne '') { |
Line 247 sub reset_caches {
|
Line 247 sub reset_caches {
|
'grade_courseid' => $env{'request.course.id'}, |
'grade_courseid' => $env{'request.course.id'}, |
'grade_username' => $uname, |
'grade_username' => $uname, |
'grade_noincrement' => $no_increment); |
'grade_noincrement' => $no_increment); |
|
if ($bubbles_per_row ne '') { |
|
$form{'bubbles_per_row'} = $bubbles_per_row; |
|
} |
if ($type eq 'randomizetry') { |
if ($type eq 'randomizetry') { |
$form{'grade_questiontype'} = $type; |
$form{'grade_questiontype'} = $type; |
if ($rndseed ne '') { |
if ($rndseed ne '') { |
Line 287 sub reset_caches {
|
Line 290 sub reset_caches {
|
} |
} |
|
|
sub scantron_partids_tograde { |
sub scantron_partids_tograde { |
my ($resource,$cid,$uname,$udom,$check_for_randomlist) = @_; |
my ($resource,$cid,$uname,$udom,$check_for_randomlist,$bubbles_per_row) = @_; |
my (%analysis,@parts); |
my (%analysis,@parts); |
if (ref($resource)) { |
if (ref($resource)) { |
my $symb = $resource->symb(); |
my $symb = $resource->symb(); |
Line 295 sub reset_caches {
|
Line 298 sub reset_caches {
|
if ($check_for_randomlist) { |
if ($check_for_randomlist) { |
$add_to_form = { 'check_parts_withrandomlist' => 1,}; |
$add_to_form = { 'check_parts_withrandomlist' => 1,}; |
} |
} |
my $analyze = &get_analyze($symb,$uname,$udom,undef,$add_to_form); |
my $analyze = |
|
&get_analyze($symb,$uname,$udom,undef,$add_to_form, |
|
undef,undef,undef,$bubbles_per_row); |
if (ref($analyze) eq 'HASH') { |
if (ref($analyze) eq 'HASH') { |
%analysis = %{$analyze}; |
%analysis = %{$analyze}; |
} |
} |
Line 1403 INNERJS
|
Line 1408 INNERJS
|
|
|
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
$docopen=~s/^document\.//; |
$docopen=~s/^document\.//; |
my $alertmsg = &mt('Please select a word or group of words from document and then click this link.'); |
my %lt = &Apache::lonlocal::texthash( |
|
keyw => 'Keywords list, separated by a space. Add/delete to list if desired.', |
|
plse => 'Please select a word or group of words from document and then click this link.', |
|
adds => 'Add selection to keyword list? Edit if desired.', |
|
comp => 'Compose Message for: ', |
|
incl => 'Include', |
|
type => 'Type', |
|
subj => 'Subject', |
|
mesa => 'Message', |
|
new => 'New', |
|
save => 'Save', |
|
canc => 'Cancel', |
|
kehi => 'Keyword Highlight Options', |
|
txtc => 'Text Color', |
|
font => 'Font Size', |
|
fnst => 'Font Style', |
|
); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
$request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT)); |
|
|
//===================== Show list of keywords ==================== |
//===================== Show list of keywords ==================== |
function keywords(formname) { |
function keywords(formname) { |
var nret = prompt("Keywords list, separated by a space. Add/delete to list if desired.",formname.keywords.value); |
var nret = prompt("$lt{'keyw'}",formname.keywords.value); |
if (nret==null) return; |
if (nret==null) return; |
formname.keywords.value = nret; |
formname.keywords.value = nret; |
|
|
Line 1435 INNERJS
|
Line 1456 INNERJS
|
else return; |
else return; |
var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); |
var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," "); |
if (cleantxt=="") { |
if (cleantxt=="") { |
alert("$alertmsg"); |
alert("$lt{'plse'}"); |
return; |
return; |
} |
} |
var nret = prompt("Add selection to keyword list? Edit if desired.",cleantxt); |
var nret = prompt("$lt{'adds'}",cleantxt); |
if (nret==null) return; |
if (nret==null) return; |
document.SCORE.keywords.value = document.SCORE.keywords.value+" "+nret; |
document.SCORE.keywords.value = document.SCORE.keywords.value+" "+nret; |
if (document.SCORE.keywords.value != "") { |
if (document.SCORE.keywords.value != "") { |
Line 1512 INNERJS
|
Line 1533 INNERJS
|
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=600,height='+height); |
pWin = window.open('', 'MessageCenter', 'resizable=yes,toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=700,height='+height); |
pWin.focus(); |
pWin.focus(); |
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.$docopen; |
pDoc.$docopen; |
Line 1520 INNERJS
|
Line 1541 INNERJS
|
|
|
pDoc.write("<form action=\\"inactive\\" name=\\"msgcenter\\">"); |
pDoc.write("<form action=\\"inactive\\" name=\\"msgcenter\\">"); |
pDoc.write("<input value=\\""+usrctr+"\\" name=\\"usrctr\\" type=\\"hidden\\">"); |
pDoc.write("<input value=\\""+usrctr+"\\" name=\\"usrctr\\" type=\\"hidden\\">"); |
pDoc.write("<h3><span class=\\"LC_info\\"> Compose Message for \"+fullname+\"<\\/span><\\/h3><br /><br />"); |
pDoc.write("<h3><span class=\\"LC_info\\"> $lt{'comp'}\"+fullname+\"<\\/span><\\/h3><br /><br />"); |
|
|
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>Include<\\/b><\\/td><td><b>Message<\\/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; |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<td>Subject<\\/td>"); |
pDoc.write("<td>$lt{'subj'}<\\/td>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"subchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"subchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"60\\" maxlength=\\"80\\"><\\/td><\\/tr>"); |
pDoc.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"60\\" maxlength=\\"80\\"><\\/td><\\/tr>"); |
} |
} |
Line 1545 INNERJS
|
Line 1566 INNERJS
|
function newMsg(newmsg,shwsel) { |
function newMsg(newmsg,shwsel) { |
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<tr bgcolor=\\"#ffffdd\\">"); |
pDoc.write("<td align=\\"center\\">New<\\/td>"); |
pDoc.write("<td align=\\"center\\">$lt{'new'}<\\/td>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"newmsgchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td align=\\"center\\"><input name=\\"newmsgchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>"); |
pDoc.write("<td><textarea name=\\"newmsg\\" cols=\\"60\\" rows=\\"3\\" onchange=\\"javascript:this.form.newmsgchk.checked=true\\" >"+newmsg+"<\\/textarea><\\/td><\\/tr>"); |
pDoc.write("<td><textarea name=\\"newmsg\\" cols=\\"60\\" rows=\\"3\\" onchange=\\"javascript:this.form.newmsgchk.checked=true\\" >"+newmsg+"<\\/textarea><\\/td><\\/tr>"); |
} |
} |
Line 1554 INNERJS
|
Line 1575 INNERJS
|
pDoc = pWin.document; |
pDoc = pWin.document; |
pDoc.write("<\\/table>"); |
pDoc.write("<\\/table>"); |
pDoc.write("<\\/td><\\/tr><\\/table> "); |
pDoc.write("<\\/td><\\/tr><\\/table> "); |
pDoc.write("<input type=\\"button\\" value=\\"Save\\" onclick=\\"javascript:checkInput()\\"> "); |
pDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:checkInput()\\"> "); |
pDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onclick=\\"self.close()\\"><br /><br />"); |
pDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\"><br /><br />"); |
pDoc.write("<\\/form>"); |
pDoc.write("<\\/form>"); |
pDoc.write('$end_page_msg_central'); |
pDoc.write('$end_page_msg_central'); |
pDoc.close(); |
pDoc.close(); |
Line 1605 INNERJS
|
Line 1626 INNERJS
|
hDoc.$docopen; |
hDoc.$docopen; |
hDoc.write('$start_page_highlight_central'); |
hDoc.write('$start_page_highlight_central'); |
hDoc.write("<form action=\\"inactive\\" name=\\"hlCenter\\">"); |
hDoc.write("<form action=\\"inactive\\" name=\\"hlCenter\\">"); |
hDoc.write("<h3><span class=\\"LC_info\\"> Keyword Highlight Options<\\/span><\\/h3><br /><br />"); |
hDoc.write("<h3><span class=\\"LC_info\\"> $lt{'kehi'}<\\/span><\\/h3><br /><br />"); |
|
|
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>Text Color<\\/b><\\/td><td><b>Font Size<\\/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 1628 INNERJS
|
Line 1649 INNERJS
|
var hDoc = hwdWin.document; |
var hDoc = hwdWin.document; |
hDoc.write("<\\/table>"); |
hDoc.write("<\\/table>"); |
hDoc.write("<\\/td><\\/tr><\\/table> "); |
hDoc.write("<\\/td><\\/tr><\\/table> "); |
hDoc.write("<input type=\\"button\\" value=\\"Save\\" onclick=\\"javascript:updateChoice(1)\\"> "); |
hDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:updateChoice(1)\\"> "); |
hDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onclick=\\"self.close()\\"><br /><br />"); |
hDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\"><br /><br />"); |
hDoc.write("<\\/form>"); |
hDoc.write("<\\/form>"); |
hDoc.write('$end_page_highlight_central'); |
hDoc.write('$end_page_highlight_central'); |
hDoc.close(); |
hDoc.close(); |
Line 1744 sub handback_box {
|
Line 1765 sub handback_box {
|
my ($symb,$uname,$udom,$counter,$partid,$record,$res_error_pointer) = @_; |
my ($symb,$uname,$udom,$counter,$partid,$record,$res_error_pointer) = @_; |
my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error_pointer); |
my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error_pointer); |
my (@respids); |
my (@respids); |
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,$resp) = @{ $part_response_id }; |
my ($part,$resp) = @{ $part_response_id }; |
if ($part eq $partid) { |
if ($part eq $partid) { |
Line 1756 sub handback_box {
|
Line 1777 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 1766 sub handback_box {
|
Line 1788 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 1996 sub submission {
|
Line 2021 sub submission {
|
|
|
# if ($env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.handgrade'} eq 'yes') { |
if (1) { |
if (1) { |
|
|
|
my %lt = &Apache::lonlocal::texthash( |
|
keyw => 'Keyword Options', |
|
list => 'List', |
|
past => 'Paste Selection to List', |
|
high => 'Hightlight Attribute', |
|
); |
# |
# |
# Print out the keyword options line |
# Print out the keyword options line |
# |
# |
$request->print(<<KEYWORDS); |
$request->print(<<KEYWORDS); |
<b>Keyword Options:</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">Paste Selection to List</a> |
CLASS="page">$lt{'past'}</a> |
<a href="javascript:kwhighlight();" target="_self">Highlight Attribute</a><br /><br /> |
<a href="javascript:kwhighlight();" target="_self">$lt{'high'}</a><br /><br /> |
KEYWORDS |
KEYWORDS |
# |
# |
# Load the other essays for similarity check |
# Load the other essays for similarity check |
Line 2526 sub processHandGrade {
|
Line 2558 sub processHandGrade {
|
undef,undef,$showsymb, |
undef,undef,$showsymb, |
$restitle); |
$restitle); |
$request->print('<br />'.&mt('Sending message to [_1]',$uname.':'.$udom).': '. |
$request->print('<br />'.&mt('Sending message to [_1]',$uname.':'.$udom).': '. |
$msgstatus); |
$msgstatus.'<br />'); |
} |
} |
if ($env{'form.collaborator'.$ctr}) { |
if ($env{'form.collaborator'.$ctr}) { |
my @collabstrs=&Apache::loncommon::get_env_multiple("form.collaborator$ctr"); |
my @collabstrs=&Apache::loncommon::get_env_multiple("form.collaborator$ctr"); |
Line 2704 sub processHandGrade {
|
Line 2736 sub processHandGrade {
|
$ctr++; |
$ctr++; |
} |
} |
if ($total < 0) { |
if ($total < 0) { |
my $the_end.=&mt('<b>Message: </b> No more students for this section or class.').'<br /><br />'."\n"; |
my $the_end.='<p>'.&mt('[_1]Message:[_2] No more students for this section or class.','<b>','</b>').'</p>'."\n"; |
$request->print($the_end); |
$request->print($the_end); |
} |
} |
return ''; |
return ''; |
Line 2855 sub handback_files {
|
Line 2887 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 == $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(.*)/); |
Line 2876 sub handback_files {
|
Line 2909 sub handback_files {
|
# 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 />".$fname." will be the uploaded file name"); |
$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>')); |
$request->print(" ".$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter}); |
|
$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 5350 sub scantron_selectphase {
|
Line 5395 sub scantron_selectphase {
|
|
|
LastName - column that the last name starts in |
LastName - column that the last name starts in |
LastNameLength - number of columns that the last name spans |
LastNameLength - number of columns that the last name spans |
|
BubblesPerRow - number of bubbles available in each row used to |
|
bubble an answer. (If not specified, 10 assumed). |
=cut |
=cut |
|
|
sub get_scantron_config { |
sub get_scantron_config { |
Line 5380 sub get_scantron_config {
|
Line 5426 sub get_scantron_config {
|
$config{'FirstNamelength'}=$config[14]; |
$config{'FirstNamelength'}=$config[14]; |
$config{'LastName'}=$config[15]; |
$config{'LastName'}=$config[15]; |
$config{'LastNamelength'}=$config[16]; |
$config{'LastNamelength'}=$config[16]; |
|
$config{'BubblesPerRow'}=$config[17]; |
last; |
last; |
} |
} |
return %config; |
return %config; |
Line 6151 sub check_for_error {
|
Line 6198 sub check_for_error {
|
=cut |
=cut |
|
|
sub scantron_warning_screen { |
sub scantron_warning_screen { |
my ($button_text)=@_; |
my ($button_text,$symb)=@_; |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my $CODElist; |
my $CODElist; |
Line 6174 sub scantron_warning_screen {
|
Line 6221 sub scantron_warning_screen {
|
<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.' |
</table> |
</table> |
<br /> |
<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)).'</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> |
<p> '.&mt('If something is incorrect, please click the \'Grading Menu\' button to start over.').'</p> |
|
|
|
<br /> |
<br /> |
'); |
'); |
Line 6210 sub scantron_do_warning {
|
Line 6256 sub scantron_do_warning {
|
$r->print('<p><span class="LC_error">'.&mt("You have not selected the format of the student's response data.").'</span></p>'); |
$r->print('<p><span class="LC_error">'.&mt("You have not selected the format of the student's response data.").'</span></p>'); |
} |
} |
} else { |
} else { |
my $warning=&scantron_warning_screen('Grading: Validate Records'); |
my $warning=&scantron_warning_screen('Grading: Validate Records',$symb); |
$r->print(' |
$r->print(' |
'.$warning.' |
'.$warning.' |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
<input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" /> |
Line 6301 sub scantron_validate_file {
|
Line 6347 sub scantron_validate_file {
|
#get the student pick code ready |
#get the student pick code ready |
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
my $nav_error; |
my $nav_error; |
my $max_bubble=&scantron_get_maxbubble(\$nav_error); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
|
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config); |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return ''; |
return ''; |
Line 6331 sub scantron_validate_file {
|
Line 6378 sub scantron_validate_file {
|
} |
} |
} |
} |
if (!$stop) { |
if (!$stop) { |
my $warning=&scantron_warning_screen('Start Grading'); |
my $warning=&scantron_warning_screen('Start Grading',$symb); |
$r->print(&mt('Validation process complete.').'<br />'. |
$r->print(&mt('Validation process complete.').'<br />'. |
$warning. |
$warning. |
&mt('Perform verification for each student after storage of submissions?'). |
&mt('Perform verification for each student after storage of submissions?'). |
Line 6341 sub scantron_validate_file {
|
Line 6388 sub scantron_validate_file {
|
'<input type="radio" name="verifyrecord" value="0" checked="checked" />'.&mt('No'). |
'<input type="radio" name="verifyrecord" value="0" checked="checked" />'.&mt('No'). |
'</label></span><br />'. |
'</label></span><br />'. |
&mt('Grading will take longer if you use verification.').'<br />'. |
&mt('Grading will take longer if you use verification.').'<br />'. |
&mt("Alternatively, the 'Review bubblesheet data' utility (see grading menu) can be used for all students after grading is complete.").'<br /><br />'. |
&mt('Otherwise, Grade/Manage/Review Bubblesheets [_1] Review bubblesheet data can be used once grading is complete.','»').'<br /><br />'. |
'<input type="submit" name="submit" value="'.&mt('Start Grading').'" />'. |
'<input type="submit" name="submit" value="'.&mt('Start Grading').'" />'. |
'<input type="hidden" name="command" value="scantron_process" />'."\n"); |
'<input type="hidden" name="command" value="scantron_process" />'."\n"); |
} else { |
} else { |
Line 6353 sub scantron_validate_file {
|
Line 6400 sub scantron_validate_file {
|
$r->print('<input type="submit" name="submit" value="'.&mt('Ignore').' → " />'); |
$r->print('<input type="submit" name="submit" value="'.&mt('Ignore').' → " />'); |
$r->print(' '.&mt('this error').' <br />'); |
$r->print(' '.&mt('this error').' <br />'); |
|
|
$r->print(" <p>".&mt("Or click the 'Grading Menu' button to start over.")."</p>"); |
$r->print('<p>'.&mt('Or 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>'); |
} else { |
} else { |
if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') { |
if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') { |
$r->print('<input type="button" name="submitbutton" value="'.&mt('Continue').' →" onclick="javascript:verify_bubble_radio(this.form)" />'); |
$r->print('<input type="button" name="submitbutton" value="'.&mt('Continue').' →" onclick="javascript:verify_bubble_radio(this.form)" />'); |
Line 6754 sub scantron_validate_ID {
|
Line 6801 sub scantron_validate_ID {
|
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
|
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # parse needs the bubble_lines.. array. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble_lines.. array. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return(1,$currentphase); |
return(1,$currentphase); |
Line 7153 sub scantron_bubble_selector {
|
Line 7200 sub scantron_bubble_selector {
|
my $max=$$scan_config{'Qlength'}; |
my $max=$$scan_config{'Qlength'}; |
|
|
my $scmode=$$scan_config{'Qon'}; |
my $scmode=$$scan_config{'Qon'}; |
if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; } |
if ($scmode eq 'number' || $scmode eq 'letter') { |
|
if (($$scan_config{'BubblesPerRow'} =~ /^\d+$/) && |
|
($$scan_config{'BubblesPerRow'} > 0)) { |
|
$max=$$scan_config{'BubblesPerRow'}; |
|
if (($scmode eq 'number') && ($max > 10)) { |
|
$max = 10; |
|
} elsif (($scmode eq 'letter') && $max > 26) { |
|
$max = 26; |
|
} |
|
} else { |
|
$max = 10; |
|
} |
|
} |
|
|
my @alphabet=('A'..'Z'); |
my @alphabet=('A'..'Z'); |
$r->print(&Apache::loncommon::start_data_table(). |
$r->print(&Apache::loncommon::start_data_table(). |
Line 7308 sub scantron_validate_CODE {
|
Line 7367 sub scantron_validate_CODE {
|
my %allcodes=&get_codes(); |
my %allcodes=&get_codes(); |
|
|
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # parse needs the lines per response array. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the lines per response array. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return(1,$currentphase); |
return(1,$currentphase); |
Line 7367 sub scantron_validate_doublebubble {
|
Line 7426 sub scantron_validate_doublebubble {
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # parse needs the bubble line array. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble line array. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return(1,$currentphase); |
return(1,$currentphase); |
Line 7389 sub scantron_validate_doublebubble {
|
Line 7448 sub scantron_validate_doublebubble {
|
|
|
|
|
sub scantron_get_maxbubble { |
sub scantron_get_maxbubble { |
my ($nav_error) = @_; |
my ($nav_error,$scantron_config) = @_; |
if (defined($env{'form.scantron_maxbubble'}) && |
if (defined($env{'form.scantron_maxbubble'}) && |
$env{'form.scantron_maxbubble'}) { |
$env{'form.scantron_maxbubble'}) { |
&restore_bubble_lines(); |
&restore_bubble_lines(); |
Line 7408 sub scantron_get_maxbubble {
|
Line 7467 sub scantron_get_maxbubble {
|
} |
} |
my $map=$navmap->getResourceByUrl($sequence); |
my $map=$navmap->getResourceByUrl($sequence); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
|
my $bubbles_per_row = &bubblesheet_bubbles_per_row($scantron_config); |
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
|
|
Line 7423 sub scantron_get_maxbubble {
|
Line 7483 sub scantron_get_maxbubble {
|
my $response_number = 0; |
my $response_number = 0; |
my $bubble_line = 0; |
my $bubble_line = 0; |
foreach my $resource (@resources) { |
foreach my $resource (@resources) { |
my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,$udom); |
my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,$udom,undef,$bubbles_per_row); |
if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) { |
if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) { |
foreach my $part_id (@{$parts}) { |
foreach my $part_id (@{$parts}) { |
my $lines; |
my $lines; |
Line 7452 sub scantron_get_maxbubble {
|
Line 7512 sub scantron_get_maxbubble {
|
if (ref($analysis->{$part_id.'.shown'}) eq 'ARRAY') { |
if (ref($analysis->{$part_id.'.shown'}) eq 'ARRAY') { |
$numshown = scalar(@{$analysis->{$part_id.'.shown'}}); |
$numshown = scalar(@{$analysis->{$part_id.'.shown'}}); |
} |
} |
my $bubbles_per_line = 10; |
my $bubbles_per_row = |
my $inner_bubble_lines = int($numbub/$bubbles_per_line); |
&bubblesheet_bubbles_per_row($scantron_config); |
if (($numbub % $bubbles_per_line) != 0) { |
my $inner_bubble_lines = int($numbub/$bubbles_per_row); |
|
if (($numbub % $bubbles_per_row) != 0) { |
$inner_bubble_lines++; |
$inner_bubble_lines++; |
} |
} |
for (my $i=0; $i<$numshown; $i++) { |
for (my $i=0; $i<$numshown; $i++) { |
Line 7465 sub scantron_get_maxbubble {
|
Line 7526 sub scantron_get_maxbubble {
|
$lines = $numshown * $inner_bubble_lines; |
$lines = $numshown * $inner_bubble_lines; |
} else { |
} else { |
$lines = $analysis->{"$part_id.bubble_lines"}; |
$lines = $analysis->{"$part_id.bubble_lines"}; |
} |
} |
|
|
$first_bubble_line{$response_number} = $bubble_line; |
$first_bubble_line{$response_number} = $bubble_line; |
$bubble_lines_per_response{$response_number} = $lines; |
$bubble_lines_per_response{$response_number} = $lines; |
Line 7486 sub scantron_get_maxbubble {
|
Line 7547 sub scantron_get_maxbubble {
|
return $env{'form.scantron_maxbubble'}; |
return $env{'form.scantron_maxbubble'}; |
} |
} |
|
|
|
sub bubblesheet_bubbles_per_row { |
|
my ($scantron_config) = @_; |
|
my $bubbles_per_row; |
|
if (ref($scantron_config) eq 'HASH') { |
|
$bubbles_per_row = $scantron_config->{'BubblesPerRow'}; |
|
} |
|
if ((!$bubbles_per_row) || ($bubbles_per_row < 1)) { |
|
$bubbles_per_row = 10; |
|
} |
|
return $bubbles_per_row; |
|
} |
|
|
sub scantron_validate_missingbubbles { |
sub scantron_validate_missingbubbles { |
my ($r,$currentphase) = @_; |
my ($r,$currentphase) = @_; |
#get student info |
#get student info |
Line 7496 sub scantron_validate_missingbubbles {
|
Line 7569 sub scantron_validate_missingbubbles {
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $nav_error; |
my $nav_error; |
my $max_bubble=&scantron_get_maxbubble(\$nav_error); |
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config); |
if ($nav_error) { |
if ($nav_error) { |
return(1,$currentphase); |
return(1,$currentphase); |
} |
} |
Line 7554 sub scantron_process_students {
|
Line 7627 sub scantron_process_students {
|
my $default_form_data=&defaultFormData($symb); |
my $default_form_data=&defaultFormData($symb); |
|
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
|
my $bubbles_per_row = |
|
&bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my %idmap=&username_to_idmap($classlist); |
my %idmap=&username_to_idmap($classlist); |
Line 7566 sub scantron_process_students {
|
Line 7641 sub scantron_process_students {
|
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my (%grader_partids_by_symb,%grader_randomlists_by_symb); |
my (%grader_partids_by_symb,%grader_randomlists_by_symb); |
&graders_resources_pass(\@resources,\%grader_partids_by_symb, |
&graders_resources_pass(\@resources,\%grader_partids_by_symb, |
\%grader_randomlists_by_symb); |
\%grader_randomlists_by_symb,$bubbles_per_row); |
my $resource_error; |
my $resource_error; |
foreach my $resource (@resources) { |
foreach my $resource (@resources) { |
my $ressymb; |
my $ressymb; |
Line 7578 sub scantron_process_students {
|
Line 7653 sub scantron_process_students {
|
} |
} |
my ($analysis,$parts) = |
my ($analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
$env{'user.name'},$env{'user.domain'},1); |
$env{'user.name'},$env{'user.domain'},1,$bubbles_per_row); |
$grader_partids_by_symb{$ressymb} = $parts; |
$grader_partids_by_symb{$ressymb} = $parts; |
if (ref($analysis) eq 'HASH') { |
if (ref($analysis) eq 'HASH') { |
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') { |
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') { |
Line 7616 SCANTRONFORM
|
Line 7691 SCANTRONFORM
|
my $started; |
my $started; |
|
|
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return ''; |
return ''; |
Line 7672 SCANTRONFORM
|
Line 7747 SCANTRONFORM
|
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
my ($analysis,$parts) = |
my ($analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom); |
&scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom,undef,$bubbles_per_row); |
$partids_by_symb{$ressymb} = $parts; |
$partids_by_symb{$ressymb} = $parts; |
} else { |
} else { |
$partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb}; |
$partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb}; |
Line 7701 SCANTRONFORM
|
Line 7776 SCANTRONFORM
|
} |
} |
|
|
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
\@resources,\%partids_by_symb) eq 'ssi_error') { |
\@resources,\%partids_by_symb, |
|
$bubbles_per_row) eq 'ssi_error') { |
$ssi_error = 0; # So end of handler error message does not trigger. |
$ssi_error = 0; # So end of handler error message does not trigger. |
$r->print("</form>"); |
$r->print("</form>"); |
&ssi_print_error($r); |
&ssi_print_error($r); |
Line 7728 SCANTRONFORM
|
Line 7804 SCANTRONFORM
|
if ($studentrecord ne $studentdata) { |
if ($studentrecord ne $studentdata) { |
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode, |
\@resources,\%partids_by_symb) eq 'ssi_error') { |
\@resources,\%partids_by_symb, |
|
$bubbles_per_row) eq 'ssi_error') { |
$ssi_error = 0; # So end of handler error message does not trigger. |
$ssi_error = 0; # So end of handler error message does not trigger. |
$r->print("</form>"); |
$r->print("</form>"); |
&ssi_print_error($r); |
&ssi_print_error($r); |
Line 7791 SCANTRONFORM
|
Line 7868 SCANTRONFORM
|
} |
} |
|
|
sub graders_resources_pass { |
sub graders_resources_pass { |
my ($resources,$grader_partids_by_symb,$grader_randomlists_by_symb) = @_; |
my ($resources,$grader_partids_by_symb,$grader_randomlists_by_symb, |
|
$bubbles_per_row) = @_; |
if ((ref($resources) eq 'ARRAY') && (ref($grader_partids_by_symb)) && |
if ((ref($resources) eq 'ARRAY') && (ref($grader_partids_by_symb)) && |
(ref($grader_randomlists_by_symb) eq 'HASH')) { |
(ref($grader_randomlists_by_symb) eq 'HASH')) { |
foreach my $resource (@{$resources}) { |
foreach my $resource (@{$resources}) { |
my $ressymb = $resource->symb(); |
my $ressymb = $resource->symb(); |
my ($analysis,$parts) = |
my ($analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
&scantron_partids_tograde($resource,$env{'request.course.id'}, |
$env{'user.name'},$env{'user.domain'},1); |
$env{'user.name'},$env{'user.domain'},1,$bubbles_per_row); |
$grader_partids_by_symb->{$ressymb} = $parts; |
$grader_partids_by_symb->{$ressymb} = $parts; |
if (ref($analysis) eq 'HASH') { |
if (ref($analysis) eq 'HASH') { |
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') { |
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') { |
Line 7812 sub graders_resources_pass {
|
Line 7890 sub graders_resources_pass {
|
} |
} |
|
|
sub grade_student_bubbles { |
sub grade_student_bubbles { |
my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts) = @_; |
my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts,$bubbles_per_row) = @_; |
|
# Walk folder as student here to get resources in order student sees. |
if (ref($resources) eq 'ARRAY') { |
if (ref($resources) eq 'ARRAY') { |
my $count = 0; |
my $count = 0; |
foreach my $resource (@{$resources}) { |
foreach my $resource (@{$resources}) { |
Line 7825 sub grade_student_bubbles {
|
Line 7904 sub grade_student_bubbles {
|
'grade_symb' => $ressymb, |
'grade_symb' => $ressymb, |
'CODE' => $scancode |
'CODE' => $scancode |
); |
); |
|
if ($bubbles_per_row ne '') { |
|
$form{'bubbles_per_row'} = $bubbles_per_row; |
|
} |
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 7884 sub scantron_upload_scantron_data {
|
Line 7966 sub scantron_upload_scantron_data {
|
|
|
')); |
')); |
$r->print(' |
$r->print(' |
<h3>'.&mt('Send scanned bubblesheet data to a course').'</h3> |
<h3>'.&mt('Send bubblesheet data to a course').'</h3> |
|
|
<form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> |
<form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> |
'.$default_form_data. |
'.$default_form_data. |
Line 8100 sub checkscantron_results {
|
Line 8182 sub checkscantron_results {
|
my %record; |
my %record; |
my %scantron_config = |
my %scantron_config = |
&Apache::grades::get_scantron_config($env{'form.scantron_format'}); |
&Apache::grades::get_scantron_config($env{'form.scantron_format'}); |
|
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile(); |
my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my %idmap=&Apache::grades::username_to_idmap($classlist); |
my %idmap=&Apache::grades::username_to_idmap($classlist); |
Line 8127 sub checkscantron_results {
|
Line 8210 sub checkscantron_results {
|
'inline',undef,'checkscantron'); |
'inline',undef,'checkscantron'); |
my ($username,$domain,$started); |
my ($username,$domain,$started); |
my $nav_error; |
my $nav_error; |
&scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse. |
&scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse. |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return ''; |
return ''; |
Line 8177 sub checkscantron_results {
|
Line 8260 sub checkscantron_results {
|
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
if ((exists($grader_randomlists_by_symb{$ressymb})) || |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) { |
(my $analysis,$parts) = |
(my $analysis,$parts) = |
&scantron_partids_tograde($resource,$env{'request.course.id'},$username,$domain); |
&scantron_partids_tograde($resource,$env{'request.course.id'},$username,$domain,undef,$bubbles_per_row); |
} else { |
} else { |
$parts = $grader_partids_by_symb{$ressymb}; |
$parts = $grader_partids_by_symb{$ressymb}; |
} |
} |
Line 8222 sub checkscantron_results {
|
Line 8305 sub checkscantron_results {
|
} |
} |
} |
} |
} |
} |
$r->print('<p>'.&mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for <b>[quant,_1,student]</b> ([_2] scantron lines/student).',$numstudents,$env{'form.scantron_maxbubble'}).'</p>'); |
$r->print( |
|
'<p>' |
|
.&mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for [_1][quant,_2,student][_3] ([quant,_4,bubblesheet line] per student).', |
|
'<b>', |
|
$numstudents, |
|
'</b>', |
|
$env{'form.scantron_maxbubble'}) |
|
.'</p>' |
|
); |
$r->print('<p>'.&mt('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>'); |
$r->print('<p>'.&mt('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>'); |
if ($passed) { |
if ($passed) { |
$r->print(&mt('Students with exact correspondence between bubblesheet data and submissions are as follows:').'<br /><br />'); |
$r->print(&mt('Students with exact correspondence between bubblesheet data and submissions are as follows:').'<br /><br />'); |
Line 8477 sub grading_menu {
|
Line 8568 sub grading_menu {
|
url => $url4, |
url => $url4, |
permission => 'F', |
permission => 'F', |
icon => 'bubblesheet.png', |
icon => 'bubblesheet.png', |
linktitle => 'Grade scantron exams, upload/download scantron data files, and review previously graded scantron exams.' |
linktitle => 'Grade bubblesheet exams, upload/download bubblesheet data files, and review previously graded bubblesheet exams.' |
}, |
}, |
{ linktext => 'Verify Receipt Number', |
{ linktext => 'Verify Receipt Number', |
url => $url5, |
url => $url5, |
Line 9509 ssi_with_retries()
|
Line 9600 ssi_with_retries()
|
calling routine should trap the error condition and display the warning |
calling routine should trap the error condition and display the warning |
found in &navmap_errormsg(). |
found in &navmap_errormsg(). |
|
|
|
$scantron_config - Reference to bubblesheet format configuration hash. |
|
|
Returns the maximum number of bubble lines that are expected to |
Returns the maximum number of bubble lines that are expected to |
occur. Does this by walking the selected sequence rendering the |
occur. Does this by walking the selected sequence rendering the |
resource and then checking &Apache::lonxml::get_problem_counter() |
resource and then checking &Apache::lonxml::get_problem_counter() |