version 1.185, 2004/03/31 05:23:59
|
version 1.186, 2004/04/20 06:11:49
|
Line 3445 sub scantron_scantab {
|
Line 3445 sub scantron_scantab {
|
return $result; |
return $result; |
} |
} |
|
|
|
sub scantron_CODElist { |
|
my $cdom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; |
|
my $cnum = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
|
my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); |
|
my $namechoice='<option></option>'; |
|
foreach my $name (@names) { |
|
$namechoice.='<option value="'.$name.'">'.$name.'</option>'; |
|
} |
|
$namechoice='<select name="scantron_CODElist">'.$namechoice.'</select>'; |
|
return $namechoice; |
|
} |
|
|
|
sub scantron_CODEunique { |
|
my $result='<nobr> |
|
<input type="radio" name="scantron_CODEunique" |
|
value="Yes" checked="on" /> Yes |
|
</nobr> |
|
<nobr> |
|
<input type="radio" name="scantron_CODEunique" |
|
value="No" /> No |
|
</nobr>'; |
|
return $result; |
|
} |
|
|
sub scantron_selectphase { |
sub scantron_selectphase { |
my ($r) = @_; |
my ($r) = @_; |
my ($symb,$url)=&get_symb_and_url($r); |
my ($symb,$url)=&get_symb_and_url($r); |
Line 3454 sub scantron_selectphase {
|
Line 3478 sub scantron_selectphase {
|
my $grading_menu_button=&show_grading_menu_form($symb,$url); |
my $grading_menu_button=&show_grading_menu_form($symb,$url); |
my $file_selector=&scantron_uploads(); |
my $file_selector=&scantron_uploads(); |
my $format_selector=&scantron_scantab(); |
my $format_selector=&scantron_scantab(); |
|
my $CODE_selector=&scantron_CODElist(); |
|
my $CODE_unique=&scantron_CODEunique(); |
my $result; |
my $result; |
#FIXME allow instructor to be able to download the scantron file |
#FIXME allow instructor to be able to download the scantron file |
# and to upload it, |
# and to upload it, |
Line 3480 sub scantron_selectphase {
|
Line 3506 sub scantron_selectphase {
|
<td> Format of data file: </td><td> $format_selector </td> |
<td> Format of data file: </td><td> $format_selector </td> |
</tr> |
</tr> |
<tr bgcolor="#ffffe6"> |
<tr bgcolor="#ffffe6"> |
|
<td> Saved CODEs to validate against: </td><td> $CODE_selector</td> |
|
</tr> |
|
<tr bgcolor="#ffffe6"> |
|
<td> Each CODE is only to be used once:</td><td> $CODE_unique </td> |
|
</tr> |
|
<tr bgcolor="#ffffe6"> |
<td> |
<td> |
<!-- FIXME this is lazy, a single parse of the set should let me know what this is --> |
<!-- FIXME this is lazy, a single parse of the set should let me know what this is --> |
Last line to expect an answer on: </td><td> |
Last line to expect an answer on: </td><td> |
Line 3603 sub scantron_fixup_scanline {
|
Line 3635 sub scantron_fixup_scanline {
|
my ($scantron_config,$scan_data,$line,$whichline,$field,$args)=@_; |
my ($scantron_config,$scan_data,$line,$whichline,$field,$args)=@_; |
if ($field eq 'ID') { |
if ($field eq 'ID') { |
if (length($args->{'newid'}) > $$scantron_config{'IDlength'}) { |
if (length($args->{'newid'}) > $$scantron_config{'IDlength'}) { |
return ($line,1,'New value to large'); |
return ($line,1,'New value too large'); |
} |
} |
if (length($args->{'newid'}) < $$scantron_config{'IDlength'}) { |
if (length($args->{'newid'}) < $$scantron_config{'IDlength'}) { |
$args->{'newid'}=sprintf('%-'.$$scantron_config{'IDlength'}.'s', |
$args->{'newid'}=sprintf('%-'.$$scantron_config{'IDlength'}.'s', |
Line 3615 sub scantron_fixup_scanline {
|
Line 3647 sub scantron_fixup_scanline {
|
&scan_data($scan_data,"$whichline.user", |
&scan_data($scan_data,"$whichline.user", |
$args->{'username'}.':'.$args->{'domain'}); |
$args->{'username'}.':'.$args->{'domain'}); |
} |
} |
|
} elsif ($field eq 'CODE') { |
|
if (length($args->{'CODE'}) > $$scantron_config{'CODElength'}) { |
|
return ($line,1,'New CODE value too large'); |
|
} |
|
if (length($args->{'CODE'}) < $$scantron_config{'CODElength'}) { |
|
$args->{'CODE'}=sprintf('%-'.$$scantron_config{'CODElength'}.'s', |
|
$args->{'CODE'}); |
|
} |
|
substr($line,$$scantron_config{'CODEstart'}-1, |
|
$$scantron_config{'CODElength'})=$args->{'CODE'}; |
|
if ($args->{'CODE'}=~/^\s*$/) { |
|
&scan_data($scan_data,"$whichline.CODE",$args->{'CODE'}); |
|
} |
} elsif ($field eq 'answer') { |
} elsif ($field eq 'answer') { |
my $length=$scantron_config->{'Qlength'}; |
my $length=$scantron_config->{'Qlength'}; |
my $off=$scantron_config->{'Qoff'}; |
my $off=$scantron_config->{'Qoff'}; |
Line 3748 sub scantron_process_corrections {
|
Line 3793 sub scantron_process_corrections {
|
'ID',{'newid'=>$newid, |
'ID',{'newid'=>$newid, |
'username'=>$ENV{'form.scantron_username'}, |
'username'=>$ENV{'form.scantron_username'}, |
'domain'=>$ENV{'form.scantron_domain'}}); |
'domain'=>$ENV{'form.scantron_domain'}}); |
|
} elsif ($ENV{'form.scantron_corrections'} =~ /^(duplicate|incorrect)CODE$/) { |
|
my $newCODE=$ENV{'form.scantron_CODE'}; |
|
($line,$err,$errmsg)= |
|
&scantron_fixup_scanline(\%scantron_config,$scan_data,$line,$which, |
|
'CODE',{'CODE'=>$newCODE}); |
} elsif ($ENV{'form.scantron_corrections'} =~ /^(missing|double)bubble$/) { |
} elsif ($ENV{'form.scantron_corrections'} =~ /^(missing|double)bubble$/) { |
foreach my $question (split(',',$ENV{'form.scantron_questions'})) { |
foreach my $question (split(',',$ENV{'form.scantron_questions'})) { |
($line,$err,$errmsg)= |
($line,$err,$errmsg)= |
Line 3941 sub scantron_validate_ID {
|
Line 3991 sub scantron_validate_ID {
|
$line,'duplicateID',$username); |
$line,'duplicateID',$username); |
return(1); |
return(1); |
} |
} |
#FIXME store away line we prviously saw the ID on to use above |
#FIXME store away line we previously saw the ID on to use above |
$found{'ids'}{$found}++; |
$found{'ids'}{$found}++; |
$found{'usernames'}{$username}++; |
$found{'usernames'}{$username}++; |
} else { |
} else { |
Line 3988 sub scantron_get_correction {
|
Line 4038 sub scantron_get_correction {
|
$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 =~ /ID$/) { |
if ($error =~ /ID$/) { |
if ($error eq 'unknownID') { |
if ($error eq 'incorrectID') { |
$r->print("The encoded ID is not in the classlist</p>\n"); |
$r->print("The encoded ID is not in the classlist</p>\n"); |
} 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"); |
Line 4006 sub scantron_get_correction {
|
Line 4056 sub scantron_get_correction {
|
'scantron_username','scantron_domain')); |
'scantron_username','scantron_domain')); |
$r->print(": <input type='text' name='scantron_username' value='' />"); |
$r->print(": <input type='text' name='scantron_username' value='' />"); |
$r->print("\n@". |
$r->print("\n@". |
&Apache::loncommon::select_dom_form($ENV{'request.role..domain'},'scantron_domain')); |
&Apache::loncommon::select_dom_form($ENV{'request.role.domain'},'scantron_domain')); |
|
|
$r->print('</li>'); |
$r->print('</li>'); |
|
} elsif ($error =~ /CODE$/) { |
|
if ($error eq 'incorrectCODE') { |
|
$r->print("The encoded CODE is not in the list of possible CODEs</p>\n"); |
|
} elsif ($error eq 'duplicateCODE') { |
|
$r->print("The encoded CODE has also been used by a previous paper $arg, and CODEs were supposed to be unique</p>\n"); |
|
} |
|
$r->print("<p>The ID on the form is <tt>". |
|
$$scan_record{'scantron.ID'}."</tt><br />\n"); |
|
$r->print("The name on the paper is ". |
|
$$scan_record{'scantron.LastName'}.",". |
|
$$scan_record{'scantron.FirstName'}."</p>"); |
|
$r->print("<p>How should I handle this? <br /> \n"); |
|
$r->print("\n<ul><li> "); |
|
$r->print('</li>'); |
} elsif ($error eq 'doublebubble') { |
} elsif ($error eq 'doublebubble') { |
#FIXME Need to print out who this is along with the paper info |
#FIXME Need to print out who this is along with the paper info |
$r->print("<p>There have been multiple bubbles scanned for a some question(s)</p>\n"); |
$r->print("<p>There have been multiple bubbles scanned for a some question(s)</p>\n"); |
Line 4060 sub scantron_bubble_selector {
|
Line 4124 sub scantron_bubble_selector {
|
sub scantron_validate_CODE { |
sub scantron_validate_CODE { |
my ($r,$currentphase) = @_; |
my ($r,$currentphase) = @_; |
#FIXME doesn't do anything yet |
#FIXME doesn't do anything yet |
|
my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'}); |
|
if ($scantron_config{'CODElocation'} && |
|
$scantron_config{'CODEstart'} && |
|
$scantron_config{'CODElength'}) { |
|
if (!$ENV{'form.scantron_CODElist'}) { |
|
&FIXME_blow_up() |
|
} |
|
} else { |
|
&Apache::lonnet::logthis(" CODE stuf $scantron_config{'CODElocation'}:$scantron_config{'CODEstart'}:$scantron_config{'CODElength'}"); |
|
return (0,$currentphase+1); |
|
} |
|
|
|
my %usedCODEs; |
|
|
|
my $old_name=$ENV{'form.scantron_CODElist'}; |
|
my $cdom =$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; |
|
my $cnum =$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
|
my %result=&Apache::lonnet::get('CODEs',[$old_name],$cdom,$cnum); |
|
my %allcodes=map {($_,1)} split(',',$result{$old_name}); |
|
|
|
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
|
my $line=&scantron_get_line($scanlines,$i); |
|
if ($line=~/^[\s\cz]*$/) { next; } |
|
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config, |
|
$scan_data); |
|
my $CODE=$$scan_record{'scantron.CODE'}; |
|
my $error=0; |
|
if (!exists($allcodes{$CODE})) { |
|
&scantron_get_correction($r,$i,$scan_record, |
|
\%scantron_config, |
|
$line,'incorrectCODE',$CODE); |
|
return(1); |
|
} |
|
if (exists($usedCODEs{$CODE}) && $ENV{'form.scantron_CODEunique'}) { |
|
&scantron_get_correction($r,$i,$scan_record, |
|
\%scantron_config, |
|
$line,'duplicateCODE',$CODE); |
|
return(1); |
|
} |
|
$usedCODEs{$CODE}++; |
|
} |
return (0,$currentphase+1); |
return (0,$currentphase+1); |
} |
} |
|
|