version 1.130.2.1.2.7, 2003/09/30 06:35:20
|
version 1.130.2.1.2.10, 2003/10/14 22:52:24
|
Line 3146 sub getSequenceDropDown {
|
Line 3146 sub getSequenceDropDown {
|
} |
} |
|
|
sub scantron_uploads { |
sub scantron_uploads { |
#FIXME need to support scantron files put in another location, |
|
# maybe the course directory? a scantron dir in the course directory? |
|
if (!-e $Apache::lonnet::perlvar{'lonScansDir'}) { return ''}; |
if (!-e $Apache::lonnet::perlvar{'lonScansDir'}) { return ''}; |
my $result= '<select name="scantron_selectfile">'; |
my $result= '<select name="scantron_selectfile">'; |
opendir(DIR,$Apache::lonnet::perlvar{'lonScansDir'}); |
my $cdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; |
my @files=sort(readdir(DIR)); |
my $cname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
|
my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname, |
|
&Apache::loncreatecourse::propath($cdom,$cname)); |
foreach my $filename (@files) { |
foreach my $filename (@files) { |
if ($filename eq '.' or $filename eq '..') { next; } |
($filename)=split(/&/,$filename); |
|
if ($filename!~/^scantron_orig_/) { next ; } |
|
$filename=~s/^scantron_orig_//; |
$result.="<option>$filename</option>\n"; |
$result.="<option>$filename</option>\n"; |
} |
} |
closedir(DIR); |
|
$result.="</select>"; |
$result.="</select>"; |
return $result; |
return $result; |
} |
} |
Line 3361 sub scantron_parse_scanline {
|
Line 3362 sub scantron_parse_scanline {
|
$record{"scantron.$questnum.answer"}=$alphabet[length($array[0])]; |
$record{"scantron.$questnum.answer"}=$alphabet[length($array[0])]; |
} |
} |
if (scalar(@array) gt 2) { |
if (scalar(@array) gt 2) { |
Apache->request->print("snippet is <pre>$currentquest</pre>"); |
|
push(@{$record{'scantron.doubleerror'}},$questnum); |
push(@{$record{'scantron.doubleerror'}},$questnum); |
my @ans=@array; |
my @ans=@array; |
my $i=length($ans[0]);shift(@ans); |
my $i=length($ans[0]);shift(@ans); |
Line 3378 sub scantron_parse_scanline {
|
Line 3378 sub scantron_parse_scanline {
|
|
|
sub scantron_add_delay { |
sub scantron_add_delay { |
my ($delayqueue,$scanline,$errormessage,$errorcode)=@_; |
my ($delayqueue,$scanline,$errormessage,$errorcode)=@_; |
Apache->request->print('add_delay_error '.$_[2] ); |
|
push(@$delayqueue, |
push(@$delayqueue, |
{'line' => $scanline, 'emsg' => $errormessage, |
{'line' => $scanline, 'emsg' => $errormessage, |
'ecode' => $errorcode } |
'ecode' => $errorcode } |
Line 3392 sub scantron_find_student {
|
Line 3391 sub scantron_find_student {
|
return &scan_data($scan_data,"$line.user"); |
return &scan_data($scan_data,"$line.user"); |
} |
} |
foreach my $id (keys(%$idmap)) { |
foreach my $id (keys(%$idmap)) { |
#Apache->request->print('<pre>checking studnet -'.$id.'- againt -'.$scanID.'- </pre>'); |
|
if (lc($id) eq lc($scanID)) { |
if (lc($id) eq lc($scanID)) { |
#Apache->request->print('success'); |
|
return $$idmap{$id}; |
return $$idmap{$id}; |
} |
} |
} |
} |
Line 3492 SCANTRONFORM
|
Line 3489 SCANTRONFORM
|
} |
} |
} |
} |
if (!$stop) { |
if (!$stop) { |
$r->print("Validation process complete, click 'Submit' to start proccssing"); |
$r->print("Validation process complete.<br />"); |
|
$r->print('<input type="submit" name="submit" value="Start Grading" />'); |
$r->print('<input type="hidden" name="command" value="scantron_process" />'); |
$r->print('<input type="hidden" name="command" value="scantron_process" />'); |
} else { |
} else { |
$r->print('<input type="hidden" name="command" value="scantron_validate" />'); |
$r->print('<input type="hidden" name="command" value="scantron_validate" />'); |
$r->print("<input type='hidden' name='validatepass' value='".$currentphase."' />"); |
$r->print("<input type='hidden' name='validatepass' value='".$currentphase."' />"); |
} |
} |
$r->print('<input type="submit" name="submit" /></form></body></html>'); |
if ($stop) { |
|
$r->print('<input type="submit" name="submit" value="Continue ->" />'); |
|
$r->print(' using corrected info <br />'); |
|
$r->print("<input type='submit' value='Skip' name='scantron_skip_record' />"); |
|
$r->print(" this scanline saving it for later."); |
|
} |
|
$r->print(" </form><br />".&show_grading_menu_form($symb,$url). |
|
"</body></html>"); |
return ''; |
return ''; |
} |
} |
|
|
Line 3598 sub scantron_validate_ID {
|
Line 3603 sub scantron_validate_ID {
|
my %found=('ids'=>{},'usernames'=>{}); |
my %found=('ids'=>{},'usernames'=>{}); |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
my $line=&scantron_get_line($scanlines,$i); |
my $line=&scantron_get_line($scanlines,$i); |
if (!$line) { next; } |
if ($line=~/^[\s\cz]*$/) { next; } |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
$scan_data); |
$scan_data); |
my $id=$$scan_record{'scantron.ID'}; |
my $id=$$scan_record{'scantron.ID'}; |
# $r->print("<p>Checking ID ".$$scan_record{'scantron.ID'}. |
|
# " on paper ID ".$$scan_record{'scantron.PaperID'}."</p>\n"); |
|
my $found; |
my $found; |
foreach my $checkid (keys(%idmap)) { |
foreach my $checkid (keys(%idmap)) { |
if (lc($checkid) eq lc($id)) { |
if (lc($checkid) eq lc($id)) { $found=$checkid;last; } |
if ($checkid ne $id) { |
|
#$r->print("<p>Using $checkid for encoded $id</p>\n"); |
|
} |
|
$found=$checkid;last; |
|
} |
|
} |
} |
if ($found) { |
if ($found) { |
my $username=$idmap{$found}; |
my $username=$idmap{$found}; |
Line 3660 sub scantron_get_correction {
|
Line 3658 sub scantron_get_correction {
|
#to show both the current line and the previous one and allow skipping |
#to show both the current line and the previous one and allow skipping |
#the previous one or the current one |
#the previous one or the current one |
|
|
$r->print("<p>This scantron record has an error ($error). "); |
$r->print("<p>An error was detected ($error) "); |
if ( defined($$scan_record{'scantron.PaperID'}) ) { |
if ( defined($$scan_record{'scantron.PaperID'}) ) { |
$r->print("The current PaperID is <tt>". |
$r->print(" for PaperID <tt>". |
$$scan_record{'scantron.PaperID'}."</tt> \n"); |
$$scan_record{'scantron.PaperID'}."</tt> \n"); |
} else { |
} else { |
$r->print("The current scanline is <pre>". |
$r->print(" in scanline $i <pre>". |
$line."</pre> \n"); |
$line."</pre> \n"); |
} |
} |
$r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n"); |
$r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n"); |
Line 3676 sub scantron_get_correction {
|
Line 3674 sub scantron_get_correction {
|
} elsif ($error eq 'duplicateID') { |
} elsif ($error eq 'duplicateID') { |
$r->print("The encoded ID has also been used by a previous paper $arg</p>\n"); |
$r->print("The encoded ID has also been used by a previous paper $arg</p>\n"); |
} |
} |
$r->print("<p>Original ID is <tt>".$$scan_record{'scantron.ID'}. |
$r->print("<p>The ID on the form is <tt>". |
"</tt><br />\n"); |
$$scan_record{'scantron.ID'}."</tt><br />\n"); |
$r->print("Name on paper is ".$$scan_record{'scantron.LastName'}.",". |
$r->print("The name on the paper is ". |
|
$$scan_record{'scantron.LastName'}.",". |
$$scan_record{'scantron.FirstName'}."</p>"); |
$$scan_record{'scantron.FirstName'}."</p>"); |
$r->print("<p>Please correct <br /> \n"); |
$r->print("<p>How should I handle this? <br /> \n"); |
$r->print("\n<ul><li> Pick a specific user -- username:<input type='text' name='scantron_username' value='' />"); |
$r->print("\n<ul><li> "); |
$r->print("\ndomain:". |
|
&Apache::loncommon::select_dom_form(undef,'scantron_domain')); |
|
#FIXME it would be nice if this sent back the user ID and |
#FIXME it would be nice if this sent back the user ID and |
#could do partial userID matches |
#could do partial userID matches |
$r->print(&Apache::loncommon::selectstudent_link('scantronupload', |
$r->print(&Apache::loncommon::selectstudent_link('scantronupload', |
'scantron_username','scantron_domain')); |
'scantron_username','scantron_domain')); |
|
$r->print(": <input type='text' name='scantron_username' value='' />"); |
|
$r->print("\n@". |
|
&Apache::loncommon::select_dom_form(undef,'scantron_domain')); |
|
|
$r->print('</li>'); |
$r->print('</li>'); |
} elsif ($error eq 'doublebubble') { |
} elsif ($error eq 'doublebubble') { |
$r->print("<pre>$line</pre>"); |
#FIXME Need to print out who this is along with the paper info |
$Apache::lonxml::debug=1; |
$r->print("<p>There have been multiple bubbles scanned for a some question(s)</p>\n"); |
&Apache::lonhomework::showhashsubset($scan_record,'.'); |
|
$Apache::lonxml::debug=0; |
|
$r->print("There have been multiple bubbles scanned for a single question\n"); |
|
$r->print('<input type="hidden" name="scantron_questions" value="'. |
$r->print('<input type="hidden" name="scantron_questions" value="'. |
join(',',@{$arg}).'" />'); |
join(',',@{$arg}).'" />'); |
|
$r->print("<p>Please indicate which bubble should be used for grading</p>"); |
foreach my $question (@{$arg}) { |
foreach my $question (@{$arg}) { |
my $selected=$$scan_record{"scantron.$question.answer"}; |
my $selected=$$scan_record{"scantron.$question.answer"}; |
$r->print("<p> For question $question, selected bubbles were ". |
&scantron_bubble_selector($r,$scan_config,$question,split('',$selected)); |
join(" ",split('',$selected,-1)). |
|
" <br />Please pick which one should be used for grading<br />"); |
|
&scantron_bubble_selector($r,$scan_config,$question); |
|
} |
} |
} elsif ($error eq 'missingbubble') { |
} elsif ($error eq 'missingbubble') { |
|
$r->print("<p>There have been <b>no</b> bubbles scanned for some question(s)</p>\n"); |
|
$r->print("<p>Please indicate which bubble should be used for grading</p>"); |
$r->print("Some questions have no scanned bubbles\n"); |
$r->print("Some questions have no scanned bubbles\n"); |
$r->print('<input type="hidden" name="scantron_questions" value="'. |
$r->print('<input type="hidden" name="scantron_questions" value="'. |
join(',',@{$arg}).'" />'); |
join(',',@{$arg}).'" />'); |
foreach my $question (@{$arg}) { |
foreach my $question (@{$arg}) { |
my $selected=$$scan_record{"scantron.$question.answer"}; |
my $selected=$$scan_record{"scantron.$question.answer"}; |
$r->print("<p>Question $question, Please select a bubble to use "); |
|
&scantron_bubble_selector($r,$scan_config,$question); |
&scantron_bubble_selector($r,$scan_config,$question); |
} |
} |
} else { |
} else { |
$r->print("\n<ul>"); |
$r->print("\n<ul>"); |
} |
} |
$r->print("<li>Skip this scanline saving it for later "); |
$r->print("\n</li></ul>"); |
$r->print("\n<input type='checkbox' name='scantron_skip_record' /> </li></ul>"); |
|
} |
} |
|
|
sub scantron_bubble_selector { |
sub scantron_bubble_selector { |
my ($r,$scan_config,$quest)=@_; |
my ($r,$scan_config,$quest,@selected)=@_; |
my $max=$$scan_config{'Qlength'}; |
my $max=$$scan_config{'Qlength'}; |
my @alphabet=('A'..'Z'); |
my @alphabet=('A'..'Z'); |
|
$r->print("<table border='1'><tr><td rowspan='2'>$quest</td>"); |
|
for (my $i=0;$i<$max+1;$i++) { |
|
$r->print('<td align="center">'); |
|
if ($selected[0] eq $alphabet[$i]) { $r->print('X'); shift(@selected) } |
|
else { $r->print(' '); } |
|
$r->print('</td>'); |
|
} |
|
$r->print('<td></td></tr><tr>'); |
for (my $i=0;$i<$max;$i++) { |
for (my $i=0;$i<$max;$i++) { |
$r->print('<input type="radio" name="scantron_correct_Q_'.$quest. |
$r->print('<td><input type="radio" name="scantron_correct_Q_'.$quest. |
'" value="'.$i.'" />'.$alphabet[$i]); |
'" value="'.$i.'" />'.$alphabet[$i]."</td>"); |
} |
} |
$r->print('<input type="radio" name="scantron_correct_Q_'.$quest. |
$r->print('<td><input type="radio" name="scantron_correct_Q_'.$quest. |
'" value="none" /> Nothing'); |
'" value="none" /> No bubble </td>'); |
$r->print('<br />'); |
$r->print('</tr></table>'); |
} |
} |
|
|
sub scantron_validate_CODE { |
sub scantron_validate_CODE { |
Line 3750 sub scantron_validate_doublebubble {
|
Line 3755 sub scantron_validate_doublebubble {
|
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
my $line=&scantron_get_line($scanlines,$i); |
my $line=&scantron_get_line($scanlines,$i); |
if (!$line) { next; } |
if ($line=~/^[\s\cz]*$/) { next; } |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
$scan_data); |
$scan_data); |
if (!defined($$scan_record{'scantron.doubleerror'})) { next; } |
if (!defined($$scan_record{'scantron.doubleerror'})) { next; } |
Line 3775 sub scantron_validate_missingbubbles {
|
Line 3780 sub scantron_validate_missingbubbles {
|
if (!$max_bubble) { $max_bubble=2**31; } |
if (!$max_bubble) { $max_bubble=2**31; } |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
my $line=&scantron_get_line($scanlines,$i); |
my $line=&scantron_get_line($scanlines,$i); |
if (!$line) { next; } |
if ($line=~/^[\s\cz]*$/) { next; } |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
$scan_data); |
$scan_data); |
if (!defined($$scan_record{'scantron.missingerror'})) { next; } |
if (!defined($$scan_record{'scantron.missingerror'})) { next; } |
Line 3825 SCANTRONFORM
|
Line 3830 SCANTRONFORM
|
'Processing first student'); |
'Processing first student'); |
my $start=&Time::HiRes::time(); |
my $start=&Time::HiRes::time(); |
my $i=-1; |
my $i=-1; |
|
my ($uname,$udom); |
while ($i<$scanlines->{'count'}) { |
while ($i<$scanlines->{'count'}) { |
|
($uname,$udom)=('',''); |
$i++; |
$i++; |
my $line=&scantron_get_line($scanlines,$i); |
my $line=&scantron_get_line($scanlines,$i); |
$r->print('<pre>line is'.$line.'</pre>'); |
# $r->print('<pre>line is'.$line.'</pre>'); |
if (!defined($line)) { |
if ($line=~/^[\s\cz]*$/) { next; } |
$r->print('skipping'); |
|
next; |
|
} |
|
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
$scan_data); |
$scan_data); |
my ($uname,$udom); |
|
unless ($uname=&scantron_find_student($scan_record,$scan_data, |
unless ($uname=&scantron_find_student($scan_record,$scan_data, |
\%idmap,$i)) { |
\%idmap,$i)) { |
&scantron_add_delay(\@delayqueue,$line, |
&scantron_add_delay(\@delayqueue,$line, |
Line 3847 SCANTRONFORM
|
Line 3850 SCANTRONFORM
|
'Student '.$uname.' has multiple sheets',2); |
'Student '.$uname.' has multiple sheets',2); |
next; |
next; |
} |
} |
$r->print('<pre>doing studnet'.$uname.'</pre>'); |
# $r->print('<pre>doing studnet'.$uname.'</pre>'); |
($uname,$udom)=split(/:/,$uname); |
($uname,$udom)=split(/:/,$uname); |
&Apache::lonnet::delenv('form.counter'); |
&Apache::lonnet::delenv('form.counter'); |
&Apache::lonnet::appenv(%$scan_record); |
&Apache::lonnet::appenv(%$scan_record); |
Line 3887 SCANTRONFORM
|
Line 3890 SCANTRONFORM
|
} continue { |
} continue { |
&Apache::lonnet::delenv('form.counter'); |
&Apache::lonnet::delenv('form.counter'); |
&Apache::lonnet::delenv('scantron\.'); |
&Apache::lonnet::delenv('scantron\.'); |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,$uname); |
'last student'); |
|
#last; |
#last; |
#FIXME |
#FIXME |
#get iterator for $sequence |
#get iterator for $sequence |
Line 3899 SCANTRONFORM
|
Line 3901 SCANTRONFORM
|
} |
} |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
my $lasttime = &Time::HiRes::time()-$start; |
my $lasttime = &Time::HiRes::time()-$start; |
$r->print("<p>took $lasttime</p>"); |
#$r->print("<p>took $lasttime</p>"); |
|
|
#$Apache::lonxml::debug=0; |
#$Apache::lonxml::debug=0; |
foreach my $delay (@delayqueue) { |
foreach my $delay (@delayqueue) { |
Line 3916 SCANTRONFORM
|
Line 3918 SCANTRONFORM
|
# to ignore delayed students, possibly saving the delay queue for later |
# to ignore delayed students, possibly saving the delay queue for later |
|
|
$navmap->untieHashes(); |
$navmap->untieHashes(); |
|
$r->print("<p>Done</p>"); |
|
$r->print(&show_grading_menu_form($symb,$url)); |
|
return ''; |
|
} |
|
|
|
sub scantron_upload_scantron_data { |
|
my ($r)=@_; |
|
$r->print(&Apache::loncommon::coursebrowser_javascript($ENV{'request.role.domain'})); |
|
my $select_link=&Apache::loncommon::selectcourse_link('rules','courseid', |
|
'domainid'); |
|
my $domsel=&Apache::loncommon::select_dom_form($ENV{'request.role.domain'}, |
|
'domainid'); |
|
$r->print(<<UPLOAD); |
|
<script type="text/javascript" language="javascript"> |
|
function checkUpload(formname) { |
|
if (formname.upfile.value == "") { |
|
alert("Please use the browse button to select a file from your local directory."); |
|
return false; |
|
} |
|
formname.submit(); |
|
} |
|
</script> |
|
|
|
<form enctype='multipart/form-data' action='/adm/grades' name='rules' method='post'> |
|
Course: <input name='courseid' type='text' /> |
|
Domain: $domsel $select_link |
|
<br /> |
|
<input name='command' value='scantronupload_save' type='hidden' /> |
|
File to upload:<input type="file" name="upfile" size="50" /> |
|
<br /> |
|
<input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Scantron Data" /> |
|
</form> |
|
UPLOAD |
|
return ''; |
|
} |
|
|
|
sub scantron_upload_scantron_data_save { |
|
my($r)=@_; |
|
$r->print("Doing upload to ".$ENV{'form.courseid'}); |
|
my $home=&Apache::lonnet::homeserver($ENV{'form.courseid'}, |
|
$ENV{'form.domainid'}); |
|
my $fname='scantron_orig_'.$ENV{'form.upfile.filename'}; |
|
$r->print(&Apache::lonnet::finishuserfileupload($ENV{'form.courseid'}, |
|
$ENV{'form.domainid'}, |
|
$home,'upfile',$fname)); |
|
return ''; |
} |
} |
|
|
|
|
#-------- end of section for handling grading scantron forms ------- |
#-------- end of section for handling grading scantron forms ------- |
# |
# |
#------------------------------------------------------------------- |
#------------------------------------------------------------------- |
Line 4103 sub handler {
|
Line 4153 sub handler {
|
$url = $ENV{'form.url'}; |
$url = $ENV{'form.url'}; |
} |
} |
&send_header($request); |
&send_header($request); |
if ($url eq '' && $symb eq '') { |
if ($url eq '' && $symb eq '' && $command eq '') { |
if ($ENV{'user.adv'}) { |
if ($ENV{'user.adv'}) { |
if (($ENV{'form.codeone'}) && ($ENV{'form.codetwo'}) && |
if (($ENV{'form.codeone'}) && ($ENV{'form.codetwo'}) && |
($ENV{'form.codethree'})) { |
($ENV{'form.codethree'})) { |
Line 4144 sub handler {
|
Line 4194 sub handler {
|
delete($perm{'mgr'}); |
delete($perm{'mgr'}); |
} |
} |
} |
} |
|
|
if ($command eq 'submission' && $perm{'vgr'}) { |
if ($command eq 'submission' && $perm{'vgr'}) { |
($ENV{'form.student'} eq '' ? &listStudents($request) : &submission($request,0,0)); |
($ENV{'form.student'} eq '' ? &listStudents($request) : &submission($request,0,0)); |
} elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) { |
} elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) { |
Line 4188 sub handler {
|
Line 4237 sub handler {
|
$request->print(&scantron_validate_file($request)); |
$request->print(&scantron_validate_file($request)); |
} elsif ($command eq 'scantron_process' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_process' && $perm{'mgr'}) { |
$request->print(&scantron_process_students($request)); |
$request->print(&scantron_process_students($request)); |
|
} elsif ($command eq 'scantronupload' && |
|
&Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) { |
|
$request->print(&scantron_upload_scantron_data($request)); |
|
|
|
} elsif ($command eq 'scantronupload_save' && |
|
&Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) { |
|
$request->print(&scantron_upload_scantron_data_save($request)); |
} elsif ($command) { |
} elsif ($command) { |
$request->print("Access Denied"); |
$request->print("$command ".join(':',%perm)."Access Denied"); |
} |
} |
} |
} |
&send_footer($request); |
&send_footer($request); |