version 1.130.2.1.2.3, 2003/09/25 08:30:57
|
version 1.130.2.1.2.4, 2003/09/27 01:59:10
|
Line 3299 sub scantron_parse_scanline {
|
Line 3299 sub scantron_parse_scanline {
|
} |
} |
$record{'scantron.ID'}=substr($data,$$scantron_config{'IDstart'}-1, |
$record{'scantron.ID'}=substr($data,$$scantron_config{'IDstart'}-1, |
$$scantron_config{'IDlength'}); |
$$scantron_config{'IDlength'}); |
$record{'scantron.paperID'}= |
$record{'scantron.PaperID'}= |
substr($data,$$scantron_config{'PaperID'}-1, |
substr($data,$$scantron_config{'PaperID'}-1, |
$$scantron_config{'PaperIDlength'}); |
$$scantron_config{'PaperIDlength'}); |
$record{'scantron.FirstName'}= |
$record{'scantron.FirstName'}= |
Line 3316 sub scantron_parse_scanline {
|
Line 3316 sub scantron_parse_scanline {
|
substr($questions,0,$$scantron_config{'Qlength'})=''; |
substr($questions,0,$$scantron_config{'Qlength'})=''; |
if (length($currentquest) < $$scantron_config{'Qlength'}) { next; } |
if (length($currentquest) < $$scantron_config{'Qlength'}) { next; } |
my (@array)=split(/$$scantron_config{'Qon'}/,$currentquest); |
my (@array)=split(/$$scantron_config{'Qon'}/,$currentquest); |
if (scalar(@array) gt 2) { |
|
#FIXME do something intelligent with double bubbles |
|
#actually not a concern right now, should be taking care of later |
|
Apache->request->print("<br ><b>Wha!!!</b> <pre>".scalar(@array). |
|
'-'.$currentquest.'-'.$questnum.'</pre><br />'); |
|
} |
|
if (length($array[0]) eq $$scantron_config{'Qlength'}) { |
if (length($array[0]) eq $$scantron_config{'Qlength'}) { |
$record{"scantron.$questnum.answer"}=''; |
$record{"scantron.$questnum.answer"}=''; |
} else { |
} else { |
$record{"scantron.$questnum.answer"}=$alphabet[length($array[0])]; |
$record{"scantron.$questnum.answer"}=$alphabet[length($array[0])]; |
} |
} |
|
if (scalar(@array) gt 2) { |
|
push(@{$record{'scantron.doubleerror'}},$currentquest); |
|
my @ans=@array; |
|
my $i=length($ans[0]);shift(@ans); |
|
while (@ans) { |
|
$i+=length($ans[0])+1; |
|
$record{"scantron.$questnum.answer"}.=$alphabet[$i]; |
|
} |
|
} |
} |
} |
$record{'scantron.maxquest'}=$questnum; |
$record{'scantron.maxquest'}=$questnum; |
return \%record; |
return \%record; |
Line 3378 sub scantron_process_corrections {
|
Line 3381 sub scantron_process_corrections {
|
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $which=$ENV{'form.scantron_line'}; |
my $which=$ENV{'form.scantron_line'}; |
my $line=&scantron_get_line($scanlines,$which); |
my $line=&scantron_get_line($scanlines,$which); |
my $newstudent=$ENV{'form.scantron_username'}.':'. |
my ($skip,$err,$errmsg); |
$ENV{'form.scantron_domain'}; |
if ($ENV{'form.scantron_skip_record'}) { |
my $newid=$classlist->{$newstudent}->[&Apache::loncoursedata::CL_ID]; |
$skip=1; |
($line,my $err,my $errmsg)= |
} else { |
&scantron_fixup_scanline(\%scantron_config,$line,'ID',$newid); |
my $newstudent=$ENV{'form.scantron_username'}.':'. |
|
$ENV{'form.scantron_domain'}; |
|
my $newid=$classlist->{$newstudent}->[&Apache::loncoursedata::CL_ID]; |
|
($line,$err,$errmsg)= |
|
&scantron_fixup_scanline(\%scantron_config,$line,'ID',$newid); |
|
} |
if ($err) { |
if ($err) { |
$r->print("Unable to accept last correction, an error occurred :$errmsg:"); |
$r->print("Unable to accept last correction, an error occurred :$errmsg:"); |
} else { |
} else { |
&scantron_put_line($scanlines,$which,$line); |
&scantron_put_line($scanlines,$which,$line,$skip); |
&scantron_putfile($scanlines); |
&scantron_putfile($scanlines); |
} |
} |
} |
} |
Line 3536 sub scantron_validate_ID {
|
Line 3544 sub scantron_validate_ID {
|
if (!$line) { next; } |
if (!$line) { next; } |
my $scan_record=&scantron_parse_scanline($line,\%scantron_config); |
my $scan_record=&scantron_parse_scanline($line,\%scantron_config); |
my $id=$$scan_record{'scantron.ID'}; |
my $id=$$scan_record{'scantron.ID'}; |
$r->print("<p>Checking ID ".$$scan_record{'scantron.ID'}."</p>\n"); |
$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)) { |
if ($checkid ne $id) { |
if ($checkid ne $id) { |
$r->print("<p>Using $checkid for bubbled $id</p>\n"); |
$r->print("<p>Using $checkid for encoded $id</p>\n"); |
} |
} |
$found=$checkid;last; |
$found=$checkid;last; |
} |
} |
Line 3549 sub scantron_validate_ID {
|
Line 3558 sub scantron_validate_ID {
|
if ($found) { |
if ($found) { |
if ($found{'ids'}{$found}) { |
if ($found{'ids'}{$found}) { |
#FIXME store away line we prviously saw the ID on |
#FIXME store away line we prviously saw the ID on |
&scantron_get_ID_correction($r,$i,$scan_record, |
&scantron_get_correction($r,$i,$scan_record,$line, |
'duplicateID',$found); |
'duplicateID',$found); |
return(1); |
return(1); |
} else { |
} else { |
$found{'ids'}{$found}++; |
$found{'ids'}{$found}++; |
} |
} |
} else { |
} else { |
&scantron_get_ID_correction($r,$i,$scan_record,'incorrectID'); |
&scantron_get_correction($r,$i,$scan_record,$line, |
|
'incorrectID'); |
return(1); |
return(1); |
} |
} |
} |
} |
Line 3564 sub scantron_validate_ID {
|
Line 3574 sub scantron_validate_ID {
|
return (0,$currentphase+1); |
return (0,$currentphase+1); |
} |
} |
|
|
sub scantron_get_ID_correction { |
sub scantron_get_correction { |
my ($r,$i,$scan_record,$error,$arg)=@_; |
my ($r,$i,$scan_record,$line,$error,$arg)=@_; |
#FIXME allow th poosibility of skipping a line, or in the case of a duplicated ID the previous line, probaly need to show both the current line and the previous one. |
|
$r->print("<p>need to correct ID</p>\n"); |
#FIXME in the case of a duplicated ID the previous line, probaly need |
|
#to show both the current line and the previous one and allow skipping |
|
#the previous one or the current one |
|
|
|
$r->print("<p>This scantron record has an error."); |
|
if ( defined($$scan_record{'scantron.PaperID'}) ) { |
|
$r->print("The current PaperID is <tt>". |
|
$$scan_record{'scantron.PaperID'}."</tt> \n"); |
|
} else { |
|
$r->print("The current scanline is <pre>". |
|
$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"); |
$r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n"); |
$r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n"); |
if ($error eq 'unknownID') { |
if ($error =~ /ID$/) { |
$r->print("<p> Unknown ID </p>\n"); |
if ($error eq 'unknownID') { |
} elsif ($error eq 'duplicateID') { |
$r->print("The encoded ID is not in the classlist</p>\n"); |
$r->print("<p> Duplicated ID </p>\n"); |
} elsif ($error eq 'duplicateID') { |
} |
$r->print("The encoded ID has also been used by a previous paper $arg</p>\n"); |
$r->print("<p>Original ID is ".$$scan_record{'scantron.ID'}."</p>\n"); |
} |
$r->print("<p>Name on paper is ".$$scan_record{'scantron.LastName'}.",". |
$r->print("<p>Original ID is <tt>".$$scan_record{'scantron.ID'}. |
$$scan_record{'scantron.FirstName'}."</p>"); |
"</tt><br />\n"); |
$r->print("Corrected User -- "); |
$r->print("Name on paper is ".$$scan_record{'scantron.LastName'}.",". |
$r->print("\nusername:<input type='text' name='scantron_username' value='' />"); |
$$scan_record{'scantron.FirstName'}."</p>"); |
$r->print("\ndomain:". |
$r->print("<p>Please correct <br /> \n"); |
&Apache::loncommon::select_dom_form(undef,'scantron_domain')); |
$r->print("\n<ul><li> Pick a specific user -- username:<input type='text' name='scantron_username' value='' />"); |
#FIXME it would be nice if this sent back the user ID and |
$r->print("\ndomain:". |
#could do partial userID matches |
&Apache::loncommon::select_dom_form(undef,'scantron_domain')); |
$r->print(&Apache::loncommon::selectstudent_link('scantronupload', |
#FIXME it would be nice if this sent back the user ID and |
'scantron_username','scantron_domain')); |
#could do partial userID matches |
|
$r->print(&Apache::loncommon::selectstudent_link('scantronupload', |
|
'scantron_username','scantron_domain')); |
|
} elsif ($error eq 'doublebubble') { |
|
$r->print("There have been muttiple bubbles scanned for a single question\n"); |
|
foreach my $question (@{$arg}) { |
|
my $selected=$$scan_record{"scantron.$question.answer"}; |
|
$r->print("<p> For question $question, selected bubbles were". |
|
join(" ",split('',$selected)). |
|
" Please pick which one should be used for grading"); |
|
#FIXMENEXT need to have radio buttons to chose which one to use |
|
|
|
} |
|
} |
|
$r->print("</li> <li>Skip this scanline saving it for later "); |
|
$r->print("\n<input type='checkbox' name='scantron_skip_record' /> </li></ul>"); |
&scantron_end_validate_form($r); |
&scantron_end_validate_form($r); |
} |
} |
|
|
|
sub scantron_validate_CODE { |
|
my ($r,$currentphase) = @_; |
|
#FIXME doesn't do anything yet |
|
return (0,$currentphase+1); |
|
} |
|
|
|
sub scantron_validate_doublebubble { |
|
my ($r,$currentphase) = @_; |
|
#get student info |
|
my $classlist=&Apache::loncoursedata::get_classlist(); |
|
my %idmap=&username_to_idmap($classlist); |
|
|
|
#get scantron line setup |
|
my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'}); |
|
my $scanlines=&scantron_getfile(); |
|
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
|
my $line=&scantron_get_line($scanlines,$i); |
|
if (!$line) { next; } |
|
my $scan_record=&scantron_parse_scanline($line,\%scantron_config); |
|
if (!defined($$scan_record{'scantron.doubleerror'})) { next; } |
|
&scantron_get_correction($r,$i,$scan_record,$line,'double', |
|
$$scan_record{'scantron.doubleerror'}); |
|
return (1,$currentphase); |
|
} |
|
return (0,$currentphase+1); |
|
} |
|
|
sub scantron_end_validate_form { |
sub scantron_end_validate_form { |
my ($r) = @_; |
my ($r) = @_; |
$r->print('<input type="submit" name="submit" /></form></body></html>'); |
$r->print('<input type="submit" name="submit" /></form></body></html>'); |