Diff for /loncom/homework/grades.pm between versions 1.131 and 1.143

version 1.131, 2003/08/07 14:33:15 version 1.143, 2003/10/08 18:25:18
Line 185  sub cleanRecord { Line 185  sub cleanRecord {
     $ENV{'form.kwstyle'}  = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : '';      $ENV{'form.kwstyle'}  = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : '';
     $ENV{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob.      $ENV{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob.
  }   }
  return '<br /><br /><blockquote>'.&keywords_highlight($answer).'</blockquote>';   return '<br /><br /><blockquote><pre>'.&keywords_highlight($answer).'</pre></blockquote>';
     }      }
     return $answer;      return $answer;
 }  }
Line 218  sub commonJSfunctions { Line 218  sub commonJSfunctions {
  }   }
     }      }
  } else {   } else {
     if (selectOne.selected) return selectOne.value;              // only one value it must be the selected one
       return selectOne.value;
  }   }
     }      }
 </script>  </script>
Line 517  LISTJAVASCRIPT Line 518  LISTJAVASCRIPT
     my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'};      my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'};
     $ENV{'form.Status'} = $saveStatus;      $ENV{'form.Status'} = $saveStatus;
   
     $gradeTable.='<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last sub only'."\n".      $gradeTable.='<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last submission only'."\n".
  '<input type="radio" name="lastSub" value="last" /> last sub & parts info'."\n".   '<input type="radio" name="lastSub" value="last" /> last submission & parts info'."\n".
  '<input type="radio" name="lastSub" value="datesub" /> by dates and submissions'."\n".   '<input type="radio" name="lastSub" value="datesub" /> by dates and submissions'."\n".
  '<input type="radio" name="lastSub" value="all" /> all details'."\n".   '<input type="radio" name="lastSub" value="all" /> all details'."\n".
  '<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".   '<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".
Line 544  LISTJAVASCRIPT Line 545  LISTJAVASCRIPT
     $gradeTable.='<input type="button" '."\n".      $gradeTable.='<input type="button" '."\n".
  'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n".   'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n".
  'value="Next->" />'."\n";   'value="Next->" />'."\n";
       $gradeTable.='<input type="checkbox" name="checkPlag" checked="on">Check For Plagiarism</input>';
     my (undef, undef, $fullname) = &getclasslist($getsec,'1');        my (undef, undef, $fullname) = &getclasslist($getsec,'1');  
     $gradeTable.='<table border="0"><tr><td bgcolor="#777777">'.      $gradeTable.='<table border="0"><tr><td bgcolor="#777777">'.
  '<table border="0"><tr bgcolor="#e6ffff">';   '<table border="0"><tr bgcolor="#e6ffff">';
Line 1461  KEYWORDS Line 1462  KEYWORDS
  my ($ressub,$subval) = split(/:/,$_,2);   my ($ressub,$subval) = split(/:/,$_,2);
                             # Similarity check                              # Similarity check
  my $similar='';   my $similar='';
  my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval);   my $oname;
  if ($osim) {   my $odom;
     $osim=int($osim*100.0);   my $ocrsid;
     $similar='<hr /><h3><font color="#FF0000">Essay is '.$osim.   my $oessay;
  '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom).   my $osim;
  '</font></h3><blockquote><i>'.   if($ENV{'form.checkPlag'}){
  &keywords_highlight($oessay).'</i></blockquote><hr />';      ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval);
       if ($osim) {
    $osim=int($osim*100.0);
    $similar='<hr /><h3><font color="#FF0000">Essay is '.$osim.
       '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom).
       '</font></h3><blockquote><i>'.
       &keywords_highlight($oessay).'</i></blockquote><hr />';
       }
  }   }
  $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.   $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.
     $partid.'</b> <font color="#999999">( ID '.$respid.      $partid.'</b> <font color="#999999">( ID '.$respid.
Line 1480  KEYWORDS Line 1488  KEYWORDS
      'this file may contain virusses</font><br />':'').       'this file may contain virusses</font><br />':'').
      '<b>Submitted Answer: </b>'.       '<b>Submitted Answer: </b>'.
      &cleanRecord($subval,$responsetype,$symb).       &cleanRecord($subval,$responsetype,$symb).
       '<br /><br />'.$similar."\n"       '<br /><br />'.$similar."\n"
      if ($ENV{'form.lastSub'} eq 'lastonly' ||        if ($ENV{'form.lastSub'} eq 'lastonly' || 
  ($ENV{'form.lastSub'} eq 'hdgrade' &&    ($ENV{'form.lastSub'} eq 'hdgrade' && 
   $$handgrade{$part} =~ /:yes$/));    $$handgrade{$part} =~ /:yes$/));
Line 2327  sub editgrades { Line 2335  sub editgrades {
  $newrecord{'resource.'.$_.'.awarded'} = 0;   $newrecord{'resource.'.$_.'.awarded'} = 0;
  $newrecord{'resource.'.$_.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";   $newrecord{'resource.'.$_.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
  $updateflag = 1;   $updateflag = 1;
       } elsif (!($old_part eq $partial && $old_score eq $score)) {
    $updateflag = 1;
    $newrecord{'resource.'.$_.'.awarded'}  = $partial if $partial ne '';
    $newrecord{'resource.'.$_.'.solved'}   = $score;
    $rec_update++;
     }      }
   
     $line .= '<td align="center">'.$old_aw.'&nbsp;</td>'.      $line .= '<td align="center">'.$old_aw.'&nbsp;</td>'.
  '<td align="center">'.$awarded.   '<td align="center">'.$awarded.
  ($score eq 'excused' ? $score : '').'&nbsp;</td>';   ($score eq 'excused' ? $score : '').'&nbsp;</td>';
   
     if (!($old_part eq $partial && $old_score eq $score)) {  
  $updateflag = 1;  
  $newrecord{'resource.'.$_.'.awarded'}  = $partial if $partial ne '';  
  $newrecord{'resource.'.$_.'.solved'}   = $score;  
  $rec_update++;  
     }  
   
     my $partid=$_;      my $partid=$_;
     foreach my $stores (@parts) {      foreach my $stores (@parts) {
Line 2510  to this page if the data selected is ins Line 2517  to this page if the data selected is ins
 $javascript  $javascript
 </script>  </script>
 ENDPICK  ENDPICK
     $request->print(&show_grading_menu_form($symb,$url));  
     return '';      return '';
   
 }  }
Line 2727  LISTJAVASCRIPT Line 2733  LISTJAVASCRIPT
     $result.='<form action="/adm/grades" method="post" name="displayPage">'."\n";      $result.='<form action="/adm/grades" method="post" name="displayPage">'."\n";
     $result.='&nbsp;<b>Problems from:</b> <select name="selectpage">'."\n";      $result.='&nbsp;<b>Problems from:</b> <select name="selectpage">'."\n";
     my ($titles,$symbx) = &getSymbMap($request);      my ($titles,$symbx) = &getSymbMap($request);
     my ($curpage,$type,$mapId) = ($symb =~ /(.*?\.(page|sequence))___(\d+)___/);       my ($curpage) =&Apache::lonnet::decode_symb($symb); 
   #    my ($curpage,$mapId) =&Apache::lonnet::decode_symb($symb); 
   #    my $type=($curpage =~ /\.(page|sequence)/);
     my $ctr=0;      my $ctr=0;
     foreach (@$titles) {      foreach (@$titles) {
  my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);   my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);
Line 2799  LISTJAVASCRIPT Line 2807  LISTJAVASCRIPT
   
 sub getSymbMap {  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'}.'_parms.db');  
     $navmap->init();  
   
     my %symbx = ();      my %symbx = ();
     my @titles = ();      my @titles = ();
Line 2846  sub displayPage { Line 2852  sub displayPage {
     &sub_page_js($request);      &sub_page_js($request);
     $request->print($result);      $request->print($result);
   
     my $navmap = Apache::lonnavmaps::navmap-> new($ENV{'request.course.fn'}.'.db',      my $navmap = Apache::lonnavmaps::navmap->new();
   $ENV{'request.course.fn'}.'_parms.db',1, 1);      my ($mapUrl, $id, $resUrl)=&Apache::lonnet::decode_symb($ENV{'form.page'});
     my ($mapUrl, $id, $resUrl) = split(/___/, $ENV{'form.page'});  
     my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps      my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
   
     my $iterator = $navmap->getIterator($map->map_start(),      my $iterator = $navmap->getIterator($map->map_start(),
Line 3009  sub updateGradeByPage { Line 3014  sub updateGradeByPage {
   
     $request->print($result);      $request->print($result);
   
     my $navmap = Apache::lonnavmaps::navmap-> new($ENV{'request.course.fn'}.'.db',      my $navmap = Apache::lonnavmaps::navmap->new();
   $ENV{'request.course.fn'}.'_parms.db',1, 1);      my ($mapUrl, $id, $resUrl) = &Apache::lonnet::decode_symb( $ENV{'form.page'});
     my ($mapUrl, $id, $resUrl) = split(/___/, $ENV{'form.page'});  
     my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps      my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
   
     my $iterator = $navmap->getIterator($map->map_start(),      my $iterator = $navmap->getIterator($map->map_start(),
Line 3133  sub getSequenceDropDown { Line 3137  sub getSequenceDropDown {
     my ($request,$symb)=@_;      my ($request,$symb)=@_;
     my $result='<select name="selectpage">'."\n";      my $result='<select name="selectpage">'."\n";
     my ($titles,$symbx) = &getSymbMap($request);      my ($titles,$symbx) = &getSymbMap($request);
     my ($curpage,$type,$mapId) = ($symb =~ /(.*?\.(page|sequence))___(\d+)___/);       my ($curpage)=&Apache::lonnet::decode_symb($symb); 
     my $ctr=0;      my $ctr=0;
     foreach (@$titles) {      foreach (@$titles) {
  my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);   my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);
Line 3185  sub scantron_selectphase { Line 3189  sub scantron_selectphase {
     my $result;      my $result;
     $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 3215  sub scantron_selectphase { Line 3219  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 3297  sub scantron_parse_scanline { Line 3301  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 3317  sub scantron_filter { Line 3330  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_validate_file {
       my ($r) = @_;
   }
   
 sub scantron_process_students {  sub scantron_process_students {
     my ($r) = @_;      my ($r) = @_;
     my (undef,undef,$sequence)=split(/___/,$ENV{'form.selectpage'});      my (undef,undef,$sequence)=&Apache::lonnet::decode_symb($ENV{'form.selectpage'});
     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);
Line 3329  sub scantron_process_students { Line 3354  sub scantron_process_students {
     my @scanlines=<$scanlines>;      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(1, 1);      my $navmap=Apache::lonnavmaps::navmap->new();
     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 3341  SCANTRONFORM Line 3366  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,
    'Unable to find a student that matches',1);
       next;
    }
    if (exists $completedstudents{$uname}) {
     &scantron_add_delay(\@delayqueue,$line,      &scantron_add_delay(\@delayqueue,$line,
  'Unable to find a student that matches');   '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 3375  SCANTRONFORM Line 3407  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 3407  SCANTRONFORM Line 3439  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 3593  sub handler { Line 3629  sub handler {
   
     undef(%perm);      undef(%perm);
     if ($ENV{'browser.mathml'}) {      if ($ENV{'browser.mathml'}) {
  $request->content_type('text/xml');   &Apache::loncommon::content_type($request,'text/xml');
     } else {      } else {
  $request->content_type('text/html');   &Apache::loncommon::content_type($request,'text/html');
     }      }
     $request->send_http_header;      $request->send_http_header;
     return '' if $request->header_only;      return '' if $request->header_only;
Line 3605  sub handler { Line 3641  sub handler {
     my $command=$ENV{'form.command'};      my $command=$ENV{'form.command'};
     if (!$url) {      if (!$url) {
  my ($temp1,$temp2);   my ($temp1,$temp2);
  ($temp1,$temp2,$ENV{'form.url'})=split(/___/,$symb);   ($temp1,$temp2,$ENV{'form.url'})=&Apache::lonnet::decode_symb($symb);
  $url = $ENV{'form.url'};   $url = $ENV{'form.url'};
     }      }
     &send_header($request);      &send_header($request);
Line 3618  sub handler { Line 3654  sub handler {
  my ($tsymb,$tuname,$tudom,$tcrsid)=   my ($tsymb,$tuname,$tudom,$tcrsid)=
     &Apache::lonnet::checkin($token);      &Apache::lonnet::checkin($token);
  if ($tsymb) {   if ($tsymb) {
     my ($map,$id,$url)=split(/\_\_\_/,$tsymb);      my ($map,$id,$url)=&Apache::lonnet::decode_symb($tsymb);
     if (&Apache::lonnet::allowed('mgr',$tcrsid)) {      if (&Apache::lonnet::allowed('mgr',$tcrsid)) {
  $request->print(&Apache::lonnet::ssi_body('/res/'.$url,   $request->print(&Apache::lonnet::ssi_body('/res/'.$url,
   ('grade_username' => $tuname,    ('grade_username' => $tuname,
Line 3690  sub handler { Line 3726  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.131  
changed lines
  Added in v.1.143


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