Diff for /loncom/homework/grades.pm between versions 1.130.2.1.2.4 and 1.130.2.1.2.5

version 1.130.2.1.2.4, 2003/09/27 01:59:10 version 1.130.2.1.2.5, 2003/09/29 20:58:50
Line 3214  sub scantron_selectphase { Line 3214  sub scantron_selectphase {
               Format of data file: $format_selector                Format of data file: $format_selector
     </td>      </td>
           </tr>            </tr>
             <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: 
                   <input type="text" name="scantron_maxbubble" />
       </td>
             </tr>
         </table>          </table>
       </td>        </td>
     </tr>      </tr>
Line 3269  sub username_to_idmap { Line 3276  sub username_to_idmap {
 }  }
   
 sub scantron_fixup_scanline {  sub scantron_fixup_scanline {
     my ($scantron_config,$line,$field,$newvalue) = @_;      my ($scantron_config,$scan_data,$line,$field,$newvalue,$arg) = @_;
     if ($field eq 'ID') {      if ($field eq 'ID') {
  if ($newvalue > $$scantron_config{'IDlength'}) {   if ($newvalue > $$scantron_config{'IDlength'}) {
     return ($line,1,'New value to large');      return ($line,1,'New value to large');
Line 3280  sub scantron_fixup_scanline { Line 3287  sub scantron_fixup_scanline {
  }   }
  substr($line,$$scantron_config{'IDstart'}-1,   substr($line,$$scantron_config{'IDstart'}-1,
        $$scantron_config{'IDlength'})=$newvalue;         $$scantron_config{'IDlength'})=$newvalue;
       } elsif ($field eq 'answer') {
    my $length=$scantron_config->{'Qlength'};
    my $off=$scantron_config->{'Qoff'};
    my $on=$scantron_config->{'Qon'};
    my $answer=${off}x$length;
    if ($arg ne 'none') {
       substr($answer,$arg,1)=$on;
       &scan_data($scan_data,"no_bubble.$newvalue",undef,'1');
    } else {
       &scan_data($scan_data,"no_bubble.$newvalue",'1');
    }
    my $where=$length*($newvalue-1)+$scantron_config->{'Qstart'};
    Apache->request->print("where $where arg $arg ");
    Apache->request->print('b:<pre>'.$line.'</pre>');
    substr($line,$where-1,$length)=$answer;
    Apache->request->print('a:<pre>'.$line.'</pre>');
     }      }
     return $line;      return $line;
 }  }
   
   sub scan_data {
       my ($scan_data,$key,$value,$delete);
       my $filename=$ENV{'form.scantron_selectfile'};
       if (defined($value)) {
    $scan_data->{$filename.'_'.$key} = $value;
       }
       if ($delete) { delete($scan_data->{$filename.'_'.$key}); }
       return $scan_data->{$filename.'_'.$key};
   }
   
 sub scantron_parse_scanline {  sub scantron_parse_scanline {
     my ($line,$scantron_config)=@_;      my ($line,$scantron_config,$scan_data)=@_;
     my %record;      my %record;
     my $questions=substr($line,$$scantron_config{'Qstart'}-1);      my $questions=substr($line,$$scantron_config{'Qstart'}-1);
     my $data=substr($line,0,$$scantron_config{'Qstart'}-1);      my $data=substr($line,0,$$scantron_config{'Qstart'}-1);
Line 3315  sub scantron_parse_scanline { Line 3348  sub scantron_parse_scanline {
  my $currentquest=substr($questions,0,$$scantron_config{'Qlength'});   my $currentquest=substr($questions,0,$$scantron_config{'Qlength'});
  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,-1);
  if (length($array[0]) eq $$scantron_config{'Qlength'}) {   if (length($array[0]) eq $$scantron_config{'Qlength'}) {
     $record{"scantron.$questnum.answer"}='';      $record{"scantron.$questnum.answer"}='';
       if (!&scan_data($scan_data,"no_bubble.$questnum")) {
    push(@{$record{"scantron.missingerror"}},$questnum);
       }
  } else {   } else {
     $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) {
     push(@{$record{'scantron.doubleerror'}},$currentquest);      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);
     while (@ans) {      while (@ans) {
  $i+=length($ans[0])+1;   $i+=length($ans[0])+1;
  $record{"scantron.$questnum.answer"}.=$alphabet[$i];   $record{"scantron.$questnum.answer"}.=$alphabet[$i];
    shift(@ans);
     }      }
  }   }
     }      }
Line 3375  sub scantron_filter { Line 3412  sub scantron_filter {
   
 sub scantron_process_corrections {  sub scantron_process_corrections {
     my ($r) = @_;      my ($r) = @_;
     if ($ENV{'form.scantron_corrections'} =~ /^(duplicate|incorrect)ID$/) {      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=&scantron_getfile();      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 ($skip,$err,$errmsg);
  my ($skip,$err,$errmsg);      if ($ENV{'form.scantron_skip_record'}) {
  if ($ENV{'form.scantron_skip_record'}) {   $skip=1;
     $skip=1;      } elsif ($ENV{'form.scantron_corrections'} =~ /^(duplicate|incorrect)ID$/) {
  } else {   my $newstudent=$ENV{'form.scantron_username'}.':'.
     my $newstudent=$ENV{'form.scantron_username'}.':'.      $ENV{'form.scantron_domain'};
  $ENV{'form.scantron_domain'};   my $newid=$classlist->{$newstudent}->[&Apache::loncoursedata::CL_ID];
     my $newid=$classlist->{$newstudent}->[&Apache::loncoursedata::CL_ID];   ($line,$err,$errmsg)=
       &scantron_fixup_scanline(\%scantron_config,$scan_data,$line,'ID',
        $newid);
       } elsif ($ENV{'form.scantron_corrections'} =~ /^(missing|double)bubble$/) {
    foreach my $question (split(',',$ENV{'form.scantron_questions'})) {
     ($line,$err,$errmsg)=      ($line,$err,$errmsg)=
  &scantron_fixup_scanline(\%scantron_config,$line,'ID',$newid);   &scantron_fixup_scanline(\%scantron_config,$scan_data,$line,
  }   'answer',$question,
  if ($err) {      $ENV{"form.scantron_correct_Q_$question"});
     $r->print("Unable to accept last correction, an error occurred :$errmsg:");      if ($err) { last; }
  } else {  
     &scantron_put_line($scanlines,$which,$line,$skip);  
     &scantron_putfile($scanlines);  
  }   }
     }      }
       if ($err) {
    $r->print("Unable to accept last correction, an error occurred :$errmsg:");
       } else {
    &scantron_put_line($scanlines,$which,$line,$skip);
    &scantron_putfile($scanlines,$scan_data);
       }
 }  }
   
   
 sub scantron_validate_file {  sub scantron_validate_file {
     my ($r) = @_;      my ($r) = @_;
     my ($symb,$url)=&get_symb_and_url($r);      my ($symb,$url)=&get_symb_and_url($r);
Line 3417  sub scantron_validate_file { Line 3462  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'}" />
   $default_form_data    $default_form_data
 SCANTRONFORM  SCANTRONFORM
     $r->print($result);      $r->print($result);
Line 3450  sub scantron_getfile { Line 3496  sub scantron_getfile {
     #my $scanlines=Apache::File->new($Apache::lonnet::perlvar{'lonScansDir'}."/$ENV{'form.scantron_selectfile'}");      #my $scanlines=Apache::File->new($Apache::lonnet::perlvar{'lonScansDir'}."/$ENV{'form.scantron_selectfile'}");
     #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
       my $cname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
       my $cdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
     my $lines;      my $lines;
     $lines=&Apache::lonnet::getfile('/uploaded/'.      $lines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.
    $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.  
    $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.  
        'scantron_orig_'.$ENV{'form.scantron_selectfile'});         'scantron_orig_'.$ENV{'form.scantron_selectfile'});
     if ($lines eq '-1') {      if ($lines eq '-1') {
        #FIXME need to actually replicate file to course space         #FIXME need to actually replicate file to course space
Line 3463  sub scantron_getfile { Line 3509  sub scantron_getfile {
     my $temp=$scanlines{'orig'};      my $temp=$scanlines{'orig'};
     $scanlines{'count'}=$#$temp;      $scanlines{'count'}=$#$temp;
   
     $lines=&Apache::lonnet::getfile('/uploaded/'.      $lines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.
    $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.  
    $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.  
        'scantron_corrected_'.$ENV{'form.scantron_selectfile'});         'scantron_corrected_'.$ENV{'form.scantron_selectfile'});
     if ($lines eq '-1') {      if ($lines eq '-1') {
  $scanlines{'corrected'}=[];   $scanlines{'corrected'}=[];
     } else {      } else {
  $scanlines{'corrected'}=[split("\n",$lines)];   $scanlines{'corrected'}=[split("\n",$lines)];
     }      }
     $lines=&Apache::lonnet::getfile('/uploaded/'.      $lines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.
    $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.  
    $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.  
        'scantron_skipped_'.$ENV{'form.scantron_selectfile'});         'scantron_skipped_'.$ENV{'form.scantron_selectfile'});
     if ($lines eq '-1') {      if ($lines eq '-1') {
  $scanlines{'skipped'}=[];   $scanlines{'skipped'}=[];
     } else {      } else {
  $scanlines{'skipped'}=[split("\n",$lines)];   $scanlines{'skipped'}=[split("\n",$lines)];
     }      }
     return \%scanlines;      my @tmp=&Apache::lonnet::dump('scantrondata',$cdom,$cname);
       if ($tmp[0] =~ /^(error:|no_such_host)/) { @tmp=(); }
       my %scan_data = @tmp;
       return (\%scanlines,\%scan_data);
 }  }
   
 sub lonnet_putfile {  sub lonnet_putfile {
Line 3495  sub lonnet_putfile { Line 3540  sub lonnet_putfile {
 }  }
   
 sub scantron_putfile {  sub scantron_putfile {
     my ($scanlines) = @_;      my ($scanlines,$scan_data) = @_;
     #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
     my $prefix='/uploaded/'.      my $cname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
  $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.      my $cdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
  $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.  
  'scantron_';  
     my $prefix='scantron_';      my $prefix='scantron_';
 # no need to update orig, shouldn't change  # no need to update orig, shouldn't change
 #   &lonnet_putfile(join("\n",@{$scanlines->{'orig'}}),$prefix.'orig_'.  #   &lonnet_putfile(join("\n",@{$scanlines->{'orig'}}),$prefix.'orig_'.
Line 3512  sub scantron_putfile { Line 3555  sub scantron_putfile {
     &lonnet_putfile(join("\n",@{$scanlines->{'skipped'}}),      &lonnet_putfile(join("\n",@{$scanlines->{'skipped'}}),
     $prefix.'skipped_'.      $prefix.'skipped_'.
     $ENV{'form.scantron_selectfile'});      $ENV{'form.scantron_selectfile'});
       &Apache::lonnet::put('scantrondata',$scan_data,$cdom,$cname);
 }  }
   
 sub scantron_get_line {  sub scantron_get_line {
Line 3536  sub scantron_validate_ID { Line 3580  sub scantron_validate_ID {
   
     #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=&scantron_getfile();      my ($scanlines,$scan_data)=&scantron_getfile();
   
     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) { next; }
  my $scan_record=&scantron_parse_scanline($line,\%scantron_config);   my $scan_record=&scantron_parse_scanline($line,\%scantron_config,$scan_data);
  my $id=$$scan_record{'scantron.ID'};   my $id=$$scan_record{'scantron.ID'};
  $r->print("<p>Checking ID ".$$scan_record{'scantron.ID'}.   $r->print("<p>Checking ID ".$$scan_record{'scantron.ID'}.
   " on paper ID ".$$scan_record{'scantron.PaperID'}."</p>\n");    " on paper ID ".$$scan_record{'scantron.PaperID'}."</p>\n");
Line 3558  sub scantron_validate_ID { Line 3602  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_correction($r,$i,$scan_record,$line,   &scantron_get_correction($r,$i,$scan_record,\%scantron_config,
  'duplicateID',$found);   $line,'duplicateID',$found);
  return(1);   return(1);
     } else {      } else {
  $found{'ids'}{$found}++;   $found{'ids'}{$found}++;
     }      }
  } else {   } else {
     &scantron_get_correction($r,$i,$scan_record,$line,      &scantron_get_correction($r,$i,$scan_record,\%scantron_config,
      'incorrectID');       $line,'incorrectID');
     return(1);      return(1);
  }   }
     }      }
Line 3575  sub scantron_validate_ID { Line 3619  sub scantron_validate_ID {
 }  }
   
 sub scantron_get_correction {  sub scantron_get_correction {
     my ($r,$i,$scan_record,$line,$error,$arg)=@_;      my ($r,$i,$scan_record,$scan_config,$line,$error,$arg)=@_;
   
 #FIXME in the case of a duplicated ID the previous line, probaly need  #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  #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.");      $r->print("<p>This scantron record has an error ($error). ");
     if ( defined($$scan_record{'scantron.PaperID'}) ) {      if ( defined($$scan_record{'scantron.PaperID'}) ) {
  $r->print("The current PaperID is <tt>".   $r->print("The current PaperID is <tt>".
   $$scan_record{'scantron.PaperID'}."</tt> \n");    $$scan_record{'scantron.PaperID'}."</tt> \n");
Line 3609  sub scantron_get_correction { Line 3653  sub scantron_get_correction {
  #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('</li>');
     } elsif ($error eq 'doublebubble') {      } elsif ($error eq 'doublebubble') {
  $r->print("There have been muttiple bubbles scanned for a single question\n");   $r->print("There have been multiple bubbles scanned for a single question\n");
    $r->print('<input type="hidden" name="scantron_questions" value="'.
     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> For question $question, selected bubbles were".      $r->print("<p> For question $question, selected bubbles were ".
       join(" ",split('',$selected)).        join(" ",split('',$selected)).
       " Please pick which one should be used for grading");                " <br />Please pick which one should be used for grading<br />");
     #FIXMENEXT need to have radio buttons to chose which one to use      &scantron_bubble_selector($r,$scan_config,$question);
       
  }   }
       } elsif ($error eq 'missingbubble') {
    $r->print("Some questions have no scanned bubbles\n");
    $r->print('<input type="hidden" name="scantron_questions" value="'.
     join(',',@{$arg}).'" />');
    foreach my $question (@{$arg}) {
       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);
    }
       } else {
    $r->print("\n<ul>");
     }      }
     $r->print("</li> <li>Skip this scanline saving it for later  ");      $r->print("<li>Skip this scanline saving it for later  ");
     $r->print("\n<input type='checkbox' name='scantron_skip_record' /> </li></ul>");      $r->print("\n<input type='checkbox' name='scantron_skip_record' /> </li></ul>");
     &scantron_end_validate_form($r);      &scantron_end_validate_form($r);
 }  }
   
   sub scantron_bubble_selector {
       my ($r,$scan_config,$quest)=@_;
       my $max=$$scan_config{'Qlength'};
       my @alphabet=('A'..'Z');
       for (my $i=0;$i<$max;$i++) {
    $r->print('<input type="radio" name="scantron_correct_Q_'.$quest.
     '" value="'.$i.'" />'.$alphabet[$i]);
       }
       $r->print('<input type="radio" name="scantron_correct_Q_'.$quest.
         '" value="none" /> Nothing');
       $r->print('<br />');
   }
   
 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
Line 3639  sub scantron_validate_doublebubble { Line 3709  sub scantron_validate_doublebubble {
   
     #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=&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) { next; }
  my $scan_record=&scantron_parse_scanline($line,\%scantron_config);   my $scan_record=&scantron_parse_scanline($line,\%scantron_config,$scan_data);
  if (!defined($$scan_record{'scantron.doubleerror'})) { next; }   if (!defined($$scan_record{'scantron.doubleerror'})) { next; }
  &scantron_get_correction($r,$i,$scan_record,$line,'double',   &scantron_get_correction($r,$i,$scan_record,\%scantron_config,$line,
    'doublebubble',
  $$scan_record{'scantron.doubleerror'});   $$scan_record{'scantron.doubleerror'});
     return (1,$currentphase);      return (1,$currentphase);
     }      }
     return (0,$currentphase+1);      return (0,$currentphase+1);
 }  }
   
   sub scantron_validate_missingbubbles {
       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,$scan_data)=&scantron_getfile();
       my $max_bubble=$ENV{'form.scantron_maxbubble'};
       if (!$max_bubble) { $max_bubble=2**31; }
       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,$scan_data);
    if (!defined($$scan_record{'scantron.missingerror'})) { next; }
    my @to_correct;
    foreach my $missing (@{$$scan_record{'scantron.missingerror'}}) {
       if ($missing gt $max_bubble) { next; }
       push(@to_correct,$missing);
    }
    if (@to_correct) {
       &scantron_get_correction($r,$i,$scan_record,\%scantron_config,
        $line,'missingbubble',\@to_correct);
       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>');
Line 3665  sub scantron_process_students { Line 3767  sub scantron_process_students {
     my $default_form_data=&defaultFormData($symb,$url);      my $default_form_data=&defaultFormData($symb,$url);
   
     my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'});      my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'});
     my $scanlines=Apache::File->new($Apache::lonnet::perlvar{'lonScansDir'}."/$ENV{'form.scantron_selectfile'}");      my ($scanlines,$scan_data)=&scantron_getfile();
     my @scanlines=<$scanlines>;  
     my $classlist=&Apache::loncoursedata::get_classlist();      my $classlist=&Apache::loncoursedata::get_classlist();
     my %idmap=&username_to_idmap($classlist);      my %idmap=&username_to_idmap($classlist);
     my $navmap=Apache::lonnavmaps::navmap->new($ENV{'request.course.fn'}.'.db',$ENV{'request.course.fn'}.'_parms.db',1, 1);      my $navmap=Apache::lonnavmaps::navmap->new($ENV{'request.course.fn'}.'.db',$ENV{'request.course.fn'}.'_parms.db',1, 1);
Line 3683  SCANTRONFORM Line 3784  SCANTRONFORM
     my @delayqueue;      my @delayqueue;
     my %completedstudents;      my %completedstudents;
           
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,      my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Scantron Status',
            'Scantron Status','Scantron Progress',scalar(@scanlines));      'Scantron Progress',$scanlines->{'count'});
     &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,      &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
   'Processing first student');    'Processing first student');
     my $start=&Time::HiRes::time();      my $start=&Time::HiRes::time();
     foreach my $line (@scanlines) {      my $i=0;
       while ($i<=$scanlines->{'count'}) {
    $i++;
    my $line=&scantron_get_line($scanlines,$i);
    if (!$line) { next; }
  $r->print('<pre>line is'.$line.'</pre>');   $r->print('<pre>line is'.$line.'</pre>');
    my $scan_record=&scantron_parse_scanline($line,\%scantron_config,$scan_data);
  chomp($line);  
  my $scan_record=&scantron_parse_scanline($line,\%scantron_config);  
  my ($uname,$udom);   my ($uname,$udom);
  unless ($uname=&scantron_find_student($scan_record,\%idmap)) {   unless ($uname=&scantron_find_student($scan_record,\%idmap)) {
     &scantron_add_delay(\@delayqueue,$line,      &scantron_add_delay(\@delayqueue,$line,

Removed from v.1.130.2.1.2.4  
changed lines
  Added in v.1.130.2.1.2.5


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>