version 1.190, 2004/04/24 09:01:52
|
version 1.192, 2004/04/29 07:21:16
|
Line 3422 sub scantron_uploads {
|
Line 3422 sub scantron_uploads {
|
my $cname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
my $cname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname, |
my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname, |
&Apache::loncommon::propath($cdom,$cname)); |
&Apache::loncommon::propath($cdom,$cname)); |
|
$result.="<option></option>"; |
foreach my $filename (@files) { |
foreach my $filename (@files) { |
($filename)=split(/&/,$filename); |
($filename)=split(/&/,$filename); |
if ($filename!~/^scantron_orig_/) { next ; } |
if ($filename!~/^scantron_orig_/) { next ; } |
Line 3435 sub scantron_uploads {
|
Line 3436 sub scantron_uploads {
|
sub scantron_scantab { |
sub scantron_scantab { |
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my $result='<select name="scantron_format">'."\n"; |
my $result='<select name="scantron_format">'."\n"; |
|
$result.='<option></option>'."\n"; |
foreach my $line (<$fh>) { |
foreach my $line (<$fh>) { |
my ($name,$descrip)=split(/:/,$line); |
my ($name,$descrip)=split(/:/,$line); |
if ($name =~ /^\#/) { next; } |
if ($name =~ /^\#/) { next; } |
Line 3451 sub scantron_CODElist {
|
Line 3453 sub scantron_CODElist {
|
my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); |
my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); |
my $namechoice='<option></option>'; |
my $namechoice='<option></option>'; |
foreach my $name (@names) { |
foreach my $name (@names) { |
|
if ($name =~ /^error: 2 /) { next; } |
$namechoice.='<option value="'.$name.'">'.$name.'</option>'; |
$namechoice.='<option value="'.$name.'">'.$name.'</option>'; |
} |
} |
$namechoice='<select name="scantron_CODElist">'.$namechoice.'</select>'; |
$namechoice='<select name="scantron_CODElist">'.$namechoice.'</select>'; |
Line 3512 sub scantron_selectphase {
|
Line 3515 sub scantron_selectphase {
|
<td> Each CODE is only to be used once:</td><td> $CODE_unique </td> |
<td> Each CODE is only to be used once:</td><td> $CODE_unique </td> |
</tr> |
</tr> |
<tr bgcolor="#ffffe6"> |
<tr bgcolor="#ffffe6"> |
<td> |
|
<!-- 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> |
|
<input type="text" name="scantron_maxbubble" /> |
|
</td> |
|
</tr> |
|
<tr bgcolor="#ffffe6"> |
|
<td> Options: </td> |
<td> Options: </td> |
<td> |
<td> |
<input type="checkbox" name="scantron_options_redo" value="redo_skipped"/> Redo skipped records <br /> |
<input type="checkbox" name="scantron_options_redo" value="redo_skipped"/> Do only skipped records <br /> |
<input type="checkbox" name="scantron_options_ignore" value="ignore_corrections"/> Ignore Original Corrections |
<input type="checkbox" name="scantron_options_ignore" value="ignore_corrections"/> Remove any exisiting corrections |
</td> |
</td> |
</tr> |
</tr> |
<tr bgcolor="#ffffe6"> |
<tr bgcolor="#ffffe6"> |
Line 3689 sub scantron_fixup_scanline {
|
Line 3685 sub scantron_fixup_scanline {
|
$args->{'username'}.':'.$args->{'domain'}); |
$args->{'username'}.':'.$args->{'domain'}); |
} |
} |
} elsif ($field eq 'CODE') { |
} elsif ($field eq 'CODE') { |
if (length($args->{'CODE'}) > $$scantron_config{'CODElength'}) { |
if ($args->{'CODE_ignore_dup'}) { |
return ($line,1,'New CODE value too large'); |
&scan_data($scan_data,"$whichline.CODE_ignore_dup",'1'); |
} |
} |
if (length($args->{'CODE'}) < $$scantron_config{'CODElength'}) { |
&scan_data($scan_data,"$whichline.useCODE",'1'); |
$args->{'CODE'}=sprintf('%-'.$$scantron_config{'CODElength'}.'s', |
if ($args->{'CODE'} ne 'use_unfound') { |
$args->{'CODE'}); |
if (length($args->{'CODE'}) > $$scantron_config{'CODElength'}) { |
} |
return ($line,1,'New CODE value too large'); |
substr($line,$$scantron_config{'CODEstart'}-1, |
} |
$$scantron_config{'CODElength'})=$args->{'CODE'}; |
if (length($args->{'CODE'}) < $$scantron_config{'CODElength'}) { |
if ($args->{'CODE'}=~/^\s*$/) { |
$args->{'CODE'}=sprintf('%-'.$$scantron_config{'CODElength'}.'s',$args->{'CODE'}); |
&scan_data($scan_data,"$whichline.CODE",$args->{'CODE'}); |
} |
|
substr($line,$$scantron_config{'CODEstart'}-1, |
|
$$scantron_config{'CODElength'})=$args->{'CODE'}; |
} |
} |
} elsif ($field eq 'answer') { |
} elsif ($field eq 'answer') { |
my $length=$scantron_config->{'Qlength'}; |
my $length=$scantron_config->{'Qlength'}; |
Line 3737 sub scantron_parse_scanline {
|
Line 3735 sub scantron_parse_scanline {
|
my $data=substr($line,0,$$scantron_config{'Qstart'}-1); |
my $data=substr($line,0,$$scantron_config{'Qstart'}-1); |
if ($$scantron_config{'CODElocation'} ne 0) { |
if ($$scantron_config{'CODElocation'} ne 0) { |
if ($$scantron_config{'CODElocation'} < 0) { |
if ($$scantron_config{'CODElocation'} < 0) { |
$record{'scantron.CODE'}=substr($data,$$scantron_config{'CODEstart'}-1, |
$record{'scantron.CODE'}=substr($data, |
|
$$scantron_config{'CODEstart'}-1, |
$$scantron_config{'CODElength'}); |
$$scantron_config{'CODElength'}); |
|
if (&scan_data($scan_data,"$whichline.useCODE")) { |
|
$record{'scantron.useCODE'}=1; |
|
} |
|
if (&scan_data($scan_data,"$whichline.CODE_ignore_dup")) { |
|
$record{'scantron.CODE_ignore_dup'}=1; |
|
} |
} else { |
} else { |
#FIXME interpret first N questions |
#FIXME interpret first N questions |
} |
} |
Line 3838 sub scantron_process_corrections {
|
Line 3843 sub scantron_process_corrections {
|
} elsif ($ENV{'form.scantron_corrections'} =~ /^(duplicate|incorrect)CODE$/) { |
} elsif ($ENV{'form.scantron_corrections'} =~ /^(duplicate|incorrect)CODE$/) { |
my $resolution=$ENV{'form.scantron_CODE_resolution'}; |
my $resolution=$ENV{'form.scantron_CODE_resolution'}; |
my $newCODE; |
my $newCODE; |
|
my %args; |
if ($resolution eq 'use_unfound') { |
if ($resolution eq 'use_unfound') { |
&FIXME_blow_up(); |
$newCODE='use_unfound'; |
} elsif ($resolution eq 'use_found') { |
} elsif ($resolution eq 'use_found') { |
$newCODE=$ENV{'form.scantron_CODE_selectedvalue'}; |
$newCODE=$ENV{'form.scantron_CODE_selectedvalue'}; |
} elsif ($resolution eq 'use_typed') { |
} elsif ($resolution eq 'use_typed') { |
$newCODE=$ENV{'form.scantron_CODE_newvalue'}; |
$newCODE=$ENV{'form.scantron_CODE_newvalue'}; |
} |
} |
|
if ($ENV{'form.scantron_corrections'} eq 'duplicateCODE') { |
|
$args{'CODE_ignore_dup'}=1; |
|
} |
|
$args{'CODE'}=$newCODE; |
($line,$err,$errmsg)= |
($line,$err,$errmsg)= |
&scantron_fixup_scanline(\%scantron_config,$scan_data,$line,$which, |
&scantron_fixup_scanline(\%scantron_config,$scan_data,$line,$which, |
'CODE',{'CODE'=>$newCODE}); |
'CODE',\%args); |
} 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 3872 sub scantron_validate_file {
|
Line 3882 sub scantron_validate_file {
|
my ($symb,$url)=&get_symb_and_url($r); |
my ($symb,$url)=&get_symb_and_url($r); |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $default_form_data=&defaultFormData($symb,$url); |
my $default_form_data=&defaultFormData($symb,$url); |
|
if ($ENV{'form.scantron_options_ignore'} eq 'ignore_corrections') { |
|
my $result=&scantron_remove('corrected'); |
|
&Apache::lonnet::logthis("result was $result"); |
|
if ($result ne 'ok' && $result ne 'not_found' ) { |
|
$r->print("An error occured ($result) when trying to Remove the existing corrections."); |
|
} |
|
$ENV{'form.scantron_options_ignore'}='done'; |
|
} |
if ($ENV{'form.scantron_corrections'}) { |
if ($ENV{'form.scantron_corrections'}) { |
&scantron_process_corrections($r); |
&scantron_process_corrections($r); |
} |
} |
|
$r->print("<p>Gathering neccessary info.</p>");$r->rflush(); |
|
my $max_bubble=&scantron_get_maxbubble($r); |
#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 $result= <<SCANTRONFORM; |
my $result= <<SCANTRONFORM; |
Line 3883 sub scantron_validate_file {
|
Line 3902 sub scantron_validate_file {
|
<input type="hidden" name="selectpage" value="$ENV{'form.selectpage'}" /> |
<input type="hidden" name="selectpage" value="$ENV{'form.selectpage'}" /> |
<input type="hidden" name="scantron_format" value="$ENV{'form.scantron_format'}" /> |
<input type="hidden" name="scantron_format" value="$ENV{'form.scantron_format'}" /> |
<input type="hidden" name="scantron_selectfile" value="$ENV{'form.scantron_selectfile'}" /> |
<input type="hidden" name="scantron_selectfile" value="$ENV{'form.scantron_selectfile'}" /> |
<input type="hidden" name="scantron_maxbubble" value="$ENV{'form.scantron_maxbubble'}" /> |
<input type="hidden" name="scantron_maxbubble" value="$max_bubble'" /> |
<input type="hidden" name="scantron_CODElist" value="$ENV{'form.scantron_CODElist'}" /> |
<input type="hidden" name="scantron_CODElist" value="$ENV{'form.scantron_CODElist'}" /> |
<input type="hidden" name="scantron_CODEunique" value="$ENV{'form.scantron_CODEunique'}" /> |
<input type="hidden" name="scantron_CODEunique" value="$ENV{'form.scantron_CODEunique'}" /> |
<input type="hidden" name="scantron_options_redo" value="$ENV{'form.scantron_optiond_redo'}" /> |
<input type="hidden" name="scantron_options_redo" value="$ENV{'form.scantron_options_redo'}" /> |
<input type="hidden" name="scantron_options_ignore" value="$ENV{'form.scantron_optiond_ignore'}" /> |
<input type="hidden" name="scantron_options_ignore" value="$ENV{'form.scantron_options_ignore'}" /> |
$default_form_data |
$default_form_data |
SCANTRONFORM |
SCANTRONFORM |
$r->print($result); |
$r->print($result); |
Line 3934 SCANTRONFORM
|
Line 3953 SCANTRONFORM
|
return ''; |
return ''; |
} |
} |
|
|
|
sub scantron_remove { |
|
my ($which)=@_; |
|
my $cname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
|
my $cdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; |
|
my $file='scantron_'; |
|
if ($which eq 'corrected') { |
|
$file.='corrected_'; |
|
} else { |
|
return 'refused'; |
|
} |
|
$file.=$ENV{'form.scantron_selectfile'}; |
|
&Apache::lonnet::logthis("removeing $file"); |
|
my $result=&Apache::lonnet::removeuserfile($cname,$cdom,$file); |
|
my @keys=&Apache::lonnet::getkeys('nohist_scantrondata',$cdom,$cname); |
|
&Apache::lonnet::logthis('got keys '.join(':',@keys)); |
|
&Apache::lonnet::logthis("cdom $cdom cname $cname"); |
|
my @todelete; |
|
my $filename=$ENV{'form.scantron_selectfile'}; |
|
&Apache::lonnet::logthis('filename '.$filename); |
|
foreach my $key (@keys) { |
|
if ($key=~/^\Q$filename\E_/) { |
|
push(@todelete,$key); |
|
} |
|
} |
|
&Apache::lonnet::logthis('todelete '.join(':',@todelete)); |
|
if (@todelete) { |
|
&Apache::lonnet::del('nohist_scantrondata',\@todelete,$cdom,$cname); |
|
} |
|
return $result; |
|
} |
|
|
sub scantron_getfile { |
sub scantron_getfile { |
#FIXME really would prefer a scantron directory but tokenwrapper |
#FIXME really would prefer a scantron directory but tokenwrapper |
# doesn't allow access to subdirs of userfiles |
# doesn't allow access to subdirs of userfiles |
Line 4206 sub scantron_validate_CODE {
|
Line 4256 sub scantron_validate_CODE {
|
if ($scantron_config{'CODElocation'} && |
if ($scantron_config{'CODElocation'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODElength'}) { |
$scantron_config{'CODElength'}) { |
if (!$ENV{'form.scantron_CODElist'}) { |
if (!defined($ENV{'form.scantron_CODElist'})) { |
&FIXME_blow_up() |
&FIXME_blow_up() |
} |
} |
} else { |
} else { |
Line 4229 sub scantron_validate_CODE {
|
Line 4279 sub scantron_validate_CODE {
|
$scan_data); |
$scan_data); |
my $CODE=$$scan_record{'scantron.CODE'}; |
my $CODE=$$scan_record{'scantron.CODE'}; |
my $error=0; |
my $error=0; |
if (!exists($allcodes{$CODE})) { |
if (!exists($allcodes{$CODE}) && !$$scan_record{'scantron.useCODE'}) { |
&scantron_get_correction($r,$i,$scan_record, |
&scantron_get_correction($r,$i,$scan_record, |
\%scantron_config, |
\%scantron_config, |
$line,'incorrectCODE',$CODE); |
$line,'incorrectCODE',$CODE); |
return(1); |
return(1); |
} |
} |
if (exists($usedCODEs{$CODE}) && $ENV{'form.scantron_CODEunique'}) { |
if (exists($usedCODEs{$CODE}) && $ENV{'form.scantron_CODEunique'} |
|
&& !$$scan_record{'scantron.CODE_ignore_dup'}) { |
&scantron_get_correction($r,$i,$scan_record, |
&scantron_get_correction($r,$i,$scan_record, |
\%scantron_config, |
\%scantron_config, |
$line,'duplicateCODE',$CODE); |
$line,'duplicateCODE',$CODE); |
Line 4269 sub scantron_validate_doublebubble {
|
Line 4320 sub scantron_validate_doublebubble {
|
return (0,$currentphase+1); |
return (0,$currentphase+1); |
} |
} |
|
|
|
sub scantron_get_maxbubble { |
|
my ($r)=@_; |
|
if (defined($ENV{'form.scantron_maxbubble'}) && |
|
$ENV{'form.scantron_maxbubble'}) { |
|
return $ENV{'form.scantron_maxbubble'}; |
|
} |
|
my $navmap=Apache::lonnavmaps::navmap->new(); |
|
my (undef,undef,$sequence)= |
|
&Apache::lonnet::decode_symb($ENV{'form.selectpage'}); |
|
my $map=$navmap->getResourceByUrl($sequence); |
|
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
|
&Apache::lonnet::delenv('form.counter'); |
|
foreach my $resource (@resources) { |
|
my $result=&Apache::lonnet::ssi($resource->src()); |
|
} |
|
&Apache::lonnet::delenv('scantron\.'); |
|
my $envfile=$ENV{'user.environment'}; |
|
$envfile=~/\/([^\/]+)\.id$/; |
|
$envfile=$1; |
|
&Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'), |
|
$envfile); |
|
$ENV{'form.scantron_maxbubble'}=$ENV{'form.counter'}-1; |
|
return $ENV{'form.scantron_maxbubble'}; |
|
} |
|
|
sub scantron_validate_missingbubbles { |
sub scantron_validate_missingbubbles { |
my ($r,$currentphase) = @_; |
my ($r,$currentphase) = @_; |
#get student info |
#get student info |
Line 4278 sub scantron_validate_missingbubbles {
|
Line 4354 sub scantron_validate_missingbubbles {
|
#get scantron line setup |
#get scantron line setup |
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 $max_bubble=$ENV{'form.scantron_maxbubble'}; |
my $max_bubble=&scantron_get_maxbubble(); |
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); |