Diff for /loncom/homework/grades.pm between versions 1.130.2.1 and 1.130.2.1.2.3

version 1.130.2.1, 2003/08/17 18:36:46 version 1.130.2.1.2.3, 2003/09/25 08:30:57
Line 2800  sub getSymbMap { Line 2800  sub getSymbMap {
     my ($request) = @_;      my ($request) = @_;
     my $navmap = Apache::lonnavmaps::navmap-> new($ENV{'request.course.fn'}.'.db',      my $navmap = Apache::lonnavmaps::navmap-> new($ENV{'request.course.fn'}.'.db',
   $ENV{'request.course.fn'}.'_parms.db');    $ENV{'request.course.fn'}.'_parms.db');
     $navmap->init();  #    $navmap->init();
   
     my %symbx = ();      my %symbx = ();
     my @titles = ();      my @titles = ();
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'});      opendir(DIR,$Apache::lonnet::perlvar{'lonScansDir'});
Line 3182  sub scantron_selectphase { Line 3184  sub scantron_selectphase {
     my $file_selector=&scantron_uploads();      my $file_selector=&scantron_uploads();
     my $format_selector=&scantron_scantab();      my $format_selector=&scantron_scantab();
     my $result;      my $result;
       #FIXME allow instructor to be able to download the scantron file
       # and to upload it,
     $result.= <<SCANTRONFORM;      $result.= <<SCANTRONFORM;
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process">  <form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process">
   <input type="hidden" name="command" value="scantron_process" />    <input type="hidden" name="command" value="scantron_validate" />
   $default_form_data    $default_form_data
   <table width="100%" border="0">    <table width="100%" border="0">
     <tr>      <tr>
Line 3214  sub scantron_selectphase { Line 3218  sub scantron_selectphase {
       </td>        </td>
     </tr>      </tr>
   </table>    </table>
   <input type="submit" value="Submit" />    <input type="submit" value="Validate Scantron Records" />
 </form>  </form>
 $grading_menu_button  $grading_menu_button
 SCANTRONFORM  SCANTRONFORM
Line 3226  sub get_scantron_config { Line 3230  sub get_scantron_config {
     my ($which) = @_;      my ($which) = @_;
     my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');      my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
     my %config;      my %config;
       #FIXME probably should move to XML it has already gotten a bit much now
     foreach my $line (<$fh>) {      foreach my $line (<$fh>) {
  my ($name,$descrip)=split(/:/,$line);   my ($name,$descrip)=split(/:/,$line);
  if ($name ne $which ) { next; }   if ($name ne $which ) { next; }
Line 3242  sub get_scantron_config { Line 3247  sub get_scantron_config {
  $config{'Qlength'}=$config[8];   $config{'Qlength'}=$config[8];
  $config{'Qoff'}=$config[9];   $config{'Qoff'}=$config[9];
  $config{'Qon'}=$config[10];   $config{'Qon'}=$config[10];
    $config{'PaperID'}=$config[11];
    $config{'PaperIDlength'}=$config[12];
    $config{'FirstName'}=$config[13];
    $config{'FirstNamelength'}=$config[14];
    $config{'LastName'}=$config[15];
    $config{'LastNamelength'}=$config[16];
  last;   last;
     }      }
     return %config;      return %config;
Line 3257  sub username_to_idmap { Line 3268  sub username_to_idmap {
     return %idmap;      return %idmap;
 }  }
   
   sub scantron_fixup_scanline {
       my ($scantron_config,$line,$field,$newvalue) = @_;
       if ($field eq 'ID') {
    if ($newvalue > $$scantron_config{'IDlength'}) {
       return ($line,1,'New value to large');
    }
    if ($newvalue < $$scantron_config{'IDlength'}) {
       $newvalue=sprintf('%-'.$$scantron_config{'IDlength'}.'s',
         $newvalue);
    }
    substr($line,$$scantron_config{'IDstart'}-1,
          $$scantron_config{'IDlength'})=$newvalue;
       }
       return $line;
   }
   
 sub scantron_parse_scanline {  sub scantron_parse_scanline {
     my ($line,$scantron_config)=@_;      my ($line,$scantron_config)=@_;
     my %record;      my %record;
Line 3272  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'}=
    substr($data,$$scantron_config{'PaperID'}-1,
          $$scantron_config{'PaperIDlength'});
       $record{'scantron.FirstName'}=
    substr($data,$$scantron_config{'FirstName'}-1,
          $$scantron_config{'FirstNamelength'});
       $record{'scantron.LastName'}=
    substr($data,$$scantron_config{'LastName'}-1,
          $$scantron_config{'LastNamelength'});
     my @alphabet=('A'..'Z');      my @alphabet=('A'..'Z');
     my $questnum=0;      my $questnum=0;
     while ($questions) {      while ($questions) {
Line 3282  sub scantron_parse_scanline { Line 3318  sub scantron_parse_scanline {
  my (@array)=split(/$$scantron_config{'Qon'}/,$currentquest);   my (@array)=split(/$$scantron_config{'Qon'}/,$currentquest);
  if (scalar(@array) gt 2) {   if (scalar(@array) gt 2) {
     #FIXME do something intelligent with double bubbles      #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).      Apache->request->print("<br ><b>Wha!!!</b> <pre>".scalar(@array).
    '-'.$currentquest.'-'.$questnum.'</pre><br />');     '-'.$currentquest.'-'.$questnum.'</pre><br />');
  }   }
Line 3296  sub scantron_parse_scanline { Line 3333  sub scantron_parse_scanline {
 }  }
   
 sub scantron_add_delay {  sub scantron_add_delay {
       my ($delayqueue,$scanline,$errormessage,$errorcode)=@_;
       Apache->request->print('add_delay_error '.$_[2] );
       push(@$delayqueue,
    {'line' => $scanline, 'emsg' => $errormessage,
     'ecode' => $errorcode }
    );
 }  }
   
 sub scantron_find_student {  sub scantron_find_student {
     my ($scantron_record,$idmap)=@_;      my ($scantron_record,$idmap)=@_;
     my $scanID=$$scantron_record{'scantron.ID'};      my $scanID=$$scantron_record{'scantron.ID'};
     foreach my $id (keys(%$idmap)) {      foreach my $id (keys(%$idmap)) {
  Apache->request->print('<pre>checking studnet -'.$id.'- againt -'.$scanID.'- </pre>');   #Apache->request->print('<pre>checking studnet -'.$id.'- againt -'.$scanID.'- </pre>');
  if (lc($id) eq lc($scanID)) { Apache->request->print('success');return $$idmap{$id}; }   if (lc($id) eq lc($scanID)) {
       #Apache->request->print('success');
       return $$idmap{$id};
    }
     }      }
     return undef;      return undef;
 }  }
Line 3316  sub scantron_filter { Line 3362  sub scantron_filter {
     return 0;      return 0;
 }  }
   
   #FIXME I think I am doing this in the wrong order, I think it would be
   #better to make a several passes analyzing all of the lines in the
   #file for common errors wrong/invalid PID/username duplicated
   #PID/username, missing bubbles, double bubbles, missing/invalid CODE
   #and then get the instructor to fix all of these errors, then grade
   #the corrected one, I'll still need to catch error conditions, but
   #maybe most will taken care even before we start
   
   sub scantron_process_corrections {
       my ($r) = @_;
       if ($ENV{'form.scantron_corrections'} =~ /^(duplicate|incorrect)ID$/) {
    my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'});
    my $scanlines=&scantron_getfile();
    my $classlist=&Apache::loncoursedata::get_classlist();
    my $which=$ENV{'form.scantron_line'};
    my $line=&scantron_get_line($scanlines,$which);
    my $newstudent=$ENV{'form.scantron_username'}.':'.
       $ENV{'form.scantron_domain'};
    my $newid=$classlist->{$newstudent}->[&Apache::loncoursedata::CL_ID];
    ($line,my $err,my $errmsg)=
       &scantron_fixup_scanline(\%scantron_config,$line,'ID',$newid);
    if ($err) {
       $r->print("Unable to accept last correction, an error occurred :$errmsg:");
    } else {
       &scantron_put_line($scanlines,$which,$line);
       &scantron_putfile($scanlines);
    }
       }
   }
   
   sub scantron_validate_file {
       my ($r) = @_;
       my ($symb,$url)=&get_symb_and_url($r);
       if (!$symb) {return '';}
       my $default_form_data=&defaultFormData($symb,$url);
   
       if ($ENV{'form.scantron_corrections'}) {
    &scantron_process_corrections($r);
       }
       #get the student pick code ready
       $r->print(&Apache::loncommon::studentbrowser_javascript());
       my $result= <<SCANTRONFORM;
   <form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantronupload">
     <input type="hidden" name="command" value="scantron_validate" />
     <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_selectfile" value="$ENV{'form.scantron_selectfile'}" />
     $default_form_data
   SCANTRONFORM
       $r->print($result);
       
       my @validate_phases=( 'ID',
     'CODE',
     'doublebubble',
     'missingbubbles');
       if (!$ENV{'form.validatepass'}) {
    $ENV{'form.valiadatepass'} = 0;
       }
       my $currentphase=$ENV{'form.valiadatepass'};
   
       if ($ENV{'form.scantron_selectfile'}=~m-^/-) {
    #first pass copy file to classdir
   
       }
       my $stop=0;
       while (!$stop && $currentphase < scalar(@validate_phases)) {
    my $which="scantron_validate_".$validate_phases[$currentphase];
    {
       no strict 'refs';
       ($stop,$currentphase)=&$which($r,$currentphase);
    }
       }
       $r->print("<input type='hidden' name='validatepass' value='".$currentphase."' />");
       return '';
   }
   
   sub scantron_getfile {
       #my $scanlines=Apache::File->new($Apache::lonnet::perlvar{'lonScansDir'}."/$ENV{'form.scantron_selectfile'}");
       #FIXME really would prefer a scantron directory but tokenwrapper
       # doesn't allow access to subdirs of userfiles
       my $lines;
       $lines=&Apache::lonnet::getfile('/uploaded/'.
      $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
      $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
          'scantron_orig_'.$ENV{'form.scantron_selectfile'});
       if ($lines eq '-1') {
          #FIXME need to actually replicate file to course space
       }
       my %scanlines;
       $scanlines{'orig'}=[split("\n",$lines)];
       my $temp=$scanlines{'orig'};
       $scanlines{'count'}=$#$temp;
   
       $lines=&Apache::lonnet::getfile('/uploaded/'.
      $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
      $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
          'scantron_corrected_'.$ENV{'form.scantron_selectfile'});
       if ($lines eq '-1') {
    $scanlines{'corrected'}=[];
       } else {
    $scanlines{'corrected'}=[split("\n",$lines)];
       }
       $lines=&Apache::lonnet::getfile('/uploaded/'.
      $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
      $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
          'scantron_skipped_'.$ENV{'form.scantron_selectfile'});
       if ($lines eq '-1') {
    $scanlines{'skipped'}=[];
       } else {
    $scanlines{'skipped'}=[split("\n",$lines)];
       }
       return \%scanlines;
   }
   
   sub lonnet_putfile {
       my ($contents,$filename)=@_;
       my $docuname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
       my $docudom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
       my $docuhome=$ENV{'course.'.$ENV{'request.course.id'}.'.home'};
       $ENV{'form.sillywaytopassafilearound'}=$contents;
       &Apache::lonnet::finishuserfileupload($docuname,$docudom,$docuhome,'sillywaytopassafilearound',$filename);
   
   }
   
   sub scantron_putfile {
       my ($scanlines) = @_;
       #FIXME really would prefer a scantron directory but tokenwrapper
       # doesn't allow access to subdirs of userfiles
       my $prefix='/uploaded/'.
    $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
    $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
    'scantron_';
       my $prefix='scantron_';
   # no need to update orig, shouldn't change
   #   &lonnet_putfile(join("\n",@{$scanlines->{'orig'}}),$prefix.'orig_'.
   #    $ENV{'form.scantron_selectfile'});
       &lonnet_putfile(join("\n",@{$scanlines->{'corrected'}}),
       $prefix.'corrected_'.
       $ENV{'form.scantron_selectfile'});
       &lonnet_putfile(join("\n",@{$scanlines->{'skipped'}}),
       $prefix.'skipped_'.
       $ENV{'form.scantron_selectfile'});
   }
   
   sub scantron_get_line {
       my ($scanlines,$i)=@_;
       if ($scanlines->{'skipped'}[$i]) {return undef;}
       if ($scanlines->{'corrected'}[$i]) {return $scanlines->{'corrected'}[$i];}
       return $scanlines->{'orig'}[$i]; 
   }
   
   sub scantron_put_line {
       my ($scanlines,$i,$newline,$skip)=@_;
       if ($skip) { $scanlines->{'skipped'}[$i]=$newline;return; }
       $scanlines->{'corrected'}[$i]=$newline;
   }
   
   sub scantron_validate_ID {
       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();
   
       my %found=('ids'=>{},'usernames'=>{});
       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);
    my $id=$$scan_record{'scantron.ID'};
    $r->print("<p>Checking ID ".$$scan_record{'scantron.ID'}."</p>\n");
    my $found;
    foreach my $checkid (keys(%idmap)) {
       if (lc($checkid) eq lc($id)) {
    if ($checkid ne $id) {
       $r->print("<p>Using $checkid for bubbled $id</p>\n");
    }
    $found=$checkid;last;
       }
    }
    if ($found) {
       if ($found{'ids'}{$found}) {
    #FIXME store away line we prviously saw the ID on
    &scantron_get_ID_correction($r,$i,$scan_record,
       'duplicateID',$found);
    return(1);
       } else {
    $found{'ids'}{$found}++;
       }
    } else {
       &scantron_get_ID_correction($r,$i,$scan_record,'incorrectID');
       return(1);
    }
       }
   
       return (0,$currentphase+1);
   }
   
   sub scantron_get_ID_correction {
       my ($r,$i,$scan_record,$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");
       $r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n");
       $r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n");
       if ($error eq 'unknownID') {
    $r->print("<p> Unknown ID </p>\n");
       } elsif ($error eq 'duplicateID') {
    $r->print("<p> Duplicated ID </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'}.",".
         $$scan_record{'scantron.FirstName'}."</p>");
       $r->print("Corrected User -- ");
       $r->print("\nusername:<input type='text' name='scantron_username' value='' />");
       $r->print("\ndomain:".
         &Apache::loncommon::select_dom_form(undef,'scantron_domain'));
       #FIXME it would be nice if this sent back the user ID and
       #could do partial userID matches
       $r->print(&Apache::loncommon::selectstudent_link('scantronupload',
          'scantron_username','scantron_domain'));
       &scantron_end_validate_form($r);
   }
   
   sub scantron_end_validate_form {
       my ($r) = @_;
       $r->print('<input type="submit" name="submit" /></form></body></html>');
   }
   
 sub scantron_process_students {  sub scantron_process_students {
     my ($r) = @_;      my ($r) = @_;
     my (undef,undef,$sequence)=split(/___/,$ENV{'form.selectpage'});      my (undef,undef,$sequence)=split(/___/,$ENV{'form.selectpage'});
Line 3331  sub scantron_process_students { Line 3609  sub scantron_process_students {
     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);
     my $map=$navmap->getResourceByUrl($sequence);      my $map=$navmap->getResourceByUrl($sequence);
     my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);      my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
     $r->print("geto ".scalar(@resources)."<br />");  #    $r->print("geto ".scalar(@resources)."<br />");
     my $result= <<SCANTRONFORM;      my $result= <<SCANTRONFORM;
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantronupload">  <form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantronupload">
   <input type="hidden" name="command" value="scantron_configphase" />    <input type="hidden" name="command" value="scantron_configphase" />
Line 3340  SCANTRONFORM Line 3618  SCANTRONFORM
     $r->print($result);      $r->print($result);
   
     my @delayqueue;      my @delayqueue;
     my $totalcorrect;      my %completedstudents;
     my $totalincorrect;      
   
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,      my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,
            'Scantron Status','Scantron Progress',scalar(@scanlines));             'Scantron Status','Scantron Progress',scalar(@scanlines));
       &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
     'Processing first student');
       my $start=&Time::HiRes::time();
     foreach my $line (@scanlines) {      foreach my $line (@scanlines) {
  my $studentcorrect;   $r->print('<pre>line is'.$line.'</pre>');
  my $studentincorrect;  
   
  chomp($line);   chomp($line);
  my $scan_record=&scantron_parse_scanline($line,\%scantron_config);   my $scan_record=&scantron_parse_scanline($line,\%scantron_config);
  my ($uname,$udom);   my ($uname,$udom);
  if ($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,
  'Unable to find a student that matches');   'Unable to find a student that matches',1);
       next;
    }
    if (exists $completedstudents{$uname}) {
       &scantron_add_delay(\@delayqueue,$line,
    'Student '.$uname.' has multiple sheets',2);
       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);
 #    &Apache::lonhomework::showhash(%ENV);  #    &Apache::lonhomework::showhash(%ENV);
     $Apache::lonxml::debug=1;  #    $Apache::lonxml::debug=1;
  &Apache::lonxml::debug("line is $line");  # &Apache::lonxml::debug("line is $line");
   
     my $i=0;      my $i=0;
  foreach my $resource (@resources) {   foreach my $resource (@resources) {
Line 3374  SCANTRONFORM Line 3659  SCANTRONFORM
   'grade_domain'  =>$udom,    'grade_domain'  =>$udom,
   'grade_courseid'=>$ENV{'request.course.id'},    'grade_courseid'=>$ENV{'request.course.id'},
   'grade_symb'    =>$resource->symb()));    'grade_symb'    =>$resource->symb()));
     my %score=&Apache::lonnet::restore($resource->symb(),  #    my %score=&Apache::lonnet::restore($resource->symb(),
        $ENV{'request.course.id'},  #       $ENV{'request.course.id'},
        $udom,$uname);  #       $udom,$uname);
     foreach my $part ($resource->{PARTS}) {  #    foreach my $part ($resource->{PARTS}) {
  if ($score{'resource.'.$part.'.solved'} =~ /^correct/) {  # if ($score{'resource.'.$part.'.solved'} =~ /^correct/) {
     $studentcorrect++;  #    $studentcorrect++;
     $totalcorrect++;  #    $totalcorrect++;
  } else {  # } else {
     $studentincorrect++;  #    $studentincorrect++;
     $totalincorrect++;  #    $totalincorrect++;
  }  # }
     }  #    }
     $r->print('<pre>'.  #    $r->print('<pre>'.
       $resource->symb().'-'.  #      $resource->symb().'-'.
       $resource->src().'-'.'</pre>result is'.$result);  #      $resource->src().'-'.'</pre>result is'.$result);
     &Apache::lonhomework::showhash(%score);  #    &Apache::lonhomework::showhash(%score);
  #    if ($i eq 3) {last;}   #    if ($i eq 3) {last;}
  }   }
    $completedstudents{$uname}={'line'=>$line};
       } 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,
              'last student Who got a '.$studentcorrect.' correct and '.   'last student');
      $studentincorrect.' incorrect. The class has gotten '.   #last;
              $totalcorrect.' correct and '.$totalincorrect.' incorrect');  
  last;  
  #FIXME   #FIXME
  #get iterator for $sequence   #get iterator for $sequence
  #foreach question 'submit' the students answer to the server   #foreach question 'submit' the students answer to the server
Line 3406  SCANTRONFORM Line 3691  SCANTRONFORM
  #   generate data to pass back that includes grade recevied   #   generate data to pass back that includes grade recevied
  #}   #}
     }      }
     $Apache::lonxml::debug=0;      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
       my $lasttime = &Time::HiRes::time()-$start;
       $r->print("<p>took $lasttime</p>");
   
       #$Apache::lonxml::debug=0;
     foreach my $delay (@delayqueue) {      foreach my $delay (@delayqueue) {
  #FIXME   #FIXME
  #print out each delayed student with interface to select how   #print out each delayed student with interface to select how
Line 3689  sub handler { Line 3978  sub handler {
     }      }
  } elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) {   } elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) {
     $request->print(&scantron_selectphase($request));      $request->print(&scantron_selectphase($request));
    } elsif ($command eq 'scantron_validate' && $perm{'mgr'}) {
       $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) {   } elsif ($command) {

Removed from v.1.130.2.1  
changed lines
  Added in v.1.130.2.1.2.3


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