Diff for /loncom/homework/grades.pm between versions 1.130.2.1.2.9 and 1.130.2.1.2.10

version 1.130.2.1.2.9, 2003/10/14 00:05:16 version 1.130.2.1.2.10, 2003/10/14 22:52:24
Line 3362  sub scantron_parse_scanline { Line 3362  sub scantron_parse_scanline {
     $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) {
     Apache->request->print("snippet is <pre>$currentquest</pre>");  
     push(@{$record{'scantron.doubleerror'}},$questnum);      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);
Line 3379  sub scantron_parse_scanline { Line 3378  sub scantron_parse_scanline {
   
 sub scantron_add_delay {  sub scantron_add_delay {
     my ($delayqueue,$scanline,$errormessage,$errorcode)=@_;      my ($delayqueue,$scanline,$errormessage,$errorcode)=@_;
     Apache->request->print('add_delay_error '.$_[2] );  
     push(@$delayqueue,      push(@$delayqueue,
  {'line' => $scanline, 'emsg' => $errormessage,   {'line' => $scanline, 'emsg' => $errormessage,
   'ecode' => $errorcode }    'ecode' => $errorcode }
Line 3393  sub scantron_find_student { Line 3391  sub scantron_find_student {
  return &scan_data($scan_data,"$line.user");   return &scan_data($scan_data,"$line.user");
     }      }
     foreach my $id (keys(%$idmap)) {      foreach my $id (keys(%$idmap)) {
  #Apache->request->print('<pre>checking studnet -'.$id.'- againt -'.$scanID.'- </pre>');  
  if (lc($id) eq lc($scanID)) {   if (lc($id) eq lc($scanID)) {
     #Apache->request->print('success');  
     return $$idmap{$id};      return $$idmap{$id};
  }   }
     }      }
Line 3493  SCANTRONFORM Line 3489  SCANTRONFORM
  }   }
     }      }
     if (!$stop) {      if (!$stop) {
  $r->print("Validation process complete, click 'Submit' to start proccssing");   $r->print("Validation process complete.<br />");
    $r->print('<input type="submit" name="submit" value="Start Grading" />');
  $r->print('<input type="hidden" name="command" value="scantron_process" />');   $r->print('<input type="hidden" name="command" value="scantron_process" />');
     } else {      } else {
  $r->print('<input type="hidden" name="command" value="scantron_validate" />');   $r->print('<input type="hidden" name="command" value="scantron_validate" />');
  $r->print("<input type='hidden' name='validatepass' value='".$currentphase."' />");   $r->print("<input type='hidden' name='validatepass' value='".$currentphase."' />");
     }      }
     $r->print('<input type="submit" name="submit" /></form></body></html>');      if ($stop) {
    $r->print('<input type="submit" name="submit" value="Continue ->" />');
    $r->print(' using corrected info <br />');
    $r->print("<input type='submit' value='Skip' name='scantron_skip_record' />");
    $r->print(" this scanline saving it for later.");
       }
       $r->print(" </form><br />".&show_grading_menu_form($symb,$url).
         "</body></html>");
     return '';      return '';
 }  }
   
Line 3599  sub scantron_validate_ID { Line 3603  sub scantron_validate_ID {
     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=~/^[\s\cz]*$/) { next; }
  my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,   my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
  $scan_data);   $scan_data);
  my $id=$$scan_record{'scantron.ID'};   my $id=$$scan_record{'scantron.ID'};
 # $r->print("<p>Checking ID ".$$scan_record{'scantron.ID'}.  
 #  " on paper ID ".$$scan_record{'scantron.PaperID'}."</p>\n");  
  my $found;   my $found;
  foreach my $checkid (keys(%idmap)) {   foreach my $checkid (keys(%idmap)) {
     if (lc($checkid) eq lc($id)) {      if (lc($checkid) eq lc($id)) { $found=$checkid;last; }
  if ($checkid ne $id) {  
     #$r->print("<p>Using $checkid for encoded $id</p>\n");  
  }  
  $found=$checkid;last;  
     }  
  }   }
  if ($found) {   if ($found) {
     my $username=$idmap{$found};      my $username=$idmap{$found};
Line 3661  sub scantron_get_correction { Line 3658  sub scantron_get_correction {
 #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 ($error). ");      $r->print("<p>An error was detected ($error) ");
     if ( defined($$scan_record{'scantron.PaperID'}) ) {      if ( defined($$scan_record{'scantron.PaperID'}) ) {
  $r->print("The current PaperID is <tt>".   $r->print(" for PaperID <tt>".
   $$scan_record{'scantron.PaperID'}."</tt> \n");    $$scan_record{'scantron.PaperID'}."</tt> \n");
     } else {      } else {
  $r->print("The current scanline is <pre>".   $r->print(" in scanline $i <pre>".
   $line."</pre> \n");    $line."</pre> \n");
     }      }
     $r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n");      $r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n");
Line 3677  sub scantron_get_correction { Line 3674  sub scantron_get_correction {
  } 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");
  }   }
  $r->print("<p>Original ID is <tt>".$$scan_record{'scantron.ID'}.   $r->print("<p>The ID on the form is  <tt>".
   "</tt><br />\n");    $$scan_record{'scantron.ID'}."</tt><br />\n");
  $r->print("Name on paper is ".$$scan_record{'scantron.LastName'}.",".   $r->print("The name on the paper is ".
     $$scan_record{'scantron.LastName'}.",".
   $$scan_record{'scantron.FirstName'}."</p>");    $$scan_record{'scantron.FirstName'}."</p>");
  $r->print("<p>Please correct <br /> \n");   $r->print("<p>How should I handle this? <br /> \n");
  $r->print("\n<ul><li> Pick a specific user -- username:<input type='text' name='scantron_username' value='' />");   $r->print("\n<ul><li> ");
  $r->print("\ndomain:".  
  &Apache::loncommon::select_dom_form(undef,'scantron_domain'));  
  #FIXME it would be nice if this sent back the user ID and   #FIXME it would be nice if this sent back the user ID and
  #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(": <input type='text' name='scantron_username' value='' />");
    $r->print("\n@".
    &Apache::loncommon::select_dom_form(undef,'scantron_domain'));
   
  $r->print('</li>');   $r->print('</li>');
     } elsif ($error eq 'doublebubble') {      } elsif ($error eq 'doublebubble') {
  $r->print("<pre>$line</pre>");  #FIXME Need to print out who this is along with the paper info
  $Apache::lonxml::debug=1;   $r->print("<p>There have been multiple bubbles scanned for a some question(s)</p>\n");
  &Apache::lonhomework::showhashsubset($scan_record,'.');  
  $Apache::lonxml::debug=0;  
  $r->print("There have been multiple bubbles scanned for a single question\n");  
  $r->print('<input type="hidden" name="scantron_questions" value="'.   $r->print('<input type="hidden" name="scantron_questions" value="'.
   join(',',@{$arg}).'" />');    join(',',@{$arg}).'" />');
    $r->print("<p>Please indicate which bubble should be used for grading</p>");
  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 ".      &scantron_bubble_selector($r,$scan_config,$question,split('',$selected));
       join(" ",split('',$selected,-1)).  
               " <br />Please pick which one should be used for grading<br />");  
     &scantron_bubble_selector($r,$scan_config,$question);  
  }   }
     } elsif ($error eq 'missingbubble') {      } elsif ($error eq 'missingbubble') {
    $r->print("<p>There have been <b>no</b> bubbles scanned for some question(s)</p>\n");
    $r->print("<p>Please indicate which bubble should be used for grading</p>");
  $r->print("Some questions have no scanned bubbles\n");   $r->print("Some questions have no scanned bubbles\n");
  $r->print('<input type="hidden" name="scantron_questions" value="'.   $r->print('<input type="hidden" name="scantron_questions" value="'.
   join(',',@{$arg}).'" />');    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>Question $question, Please select a bubble to use ");  
     &scantron_bubble_selector($r,$scan_config,$question);      &scantron_bubble_selector($r,$scan_config,$question);
  }   }
     } else {      } else {
  $r->print("\n<ul>");   $r->print("\n<ul>");
     }      }
     $r->print("<li>Skip this scanline saving it for later  ");      $r->print("\n</li></ul>");
     $r->print("\n<input type='checkbox' name='scantron_skip_record' /> </li></ul>");  
 }  }
   
 sub scantron_bubble_selector {  sub scantron_bubble_selector {
     my ($r,$scan_config,$quest)=@_;      my ($r,$scan_config,$quest,@selected)=@_;
     my $max=$$scan_config{'Qlength'};      my $max=$$scan_config{'Qlength'};
     my @alphabet=('A'..'Z');      my @alphabet=('A'..'Z');
       $r->print("<table border='1'><tr><td rowspan='2'>$quest</td>");
       for (my $i=0;$i<$max+1;$i++) {
    $r->print('<td align="center">');
    if ($selected[0] eq $alphabet[$i]) { $r->print('X'); shift(@selected) }
    else { $r->print('&nbsp;'); }
    $r->print('</td>');
       }
       $r->print('<td></td></tr><tr>');
     for (my $i=0;$i<$max;$i++) {      for (my $i=0;$i<$max;$i++) {
  $r->print('<input type="radio" name="scantron_correct_Q_'.$quest.   $r->print('<td><input type="radio" name="scantron_correct_Q_'.$quest.
   '" value="'.$i.'" />'.$alphabet[$i]);    '" value="'.$i.'" />'.$alphabet[$i]."</td>");
     }      }
     $r->print('<input type="radio" name="scantron_correct_Q_'.$quest.      $r->print('<td><input type="radio" name="scantron_correct_Q_'.$quest.
       '" value="none" /> Nothing');        '" value="none" /> No bubble </td>');
     $r->print('<br />');      $r->print('</tr></table>');
 }  }
   
 sub scantron_validate_CODE {  sub scantron_validate_CODE {
Line 3751  sub scantron_validate_doublebubble { Line 3755  sub scantron_validate_doublebubble {
     my ($scanlines,$scan_data)=&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=~/^[\s\cz]*$/) { next; }
  my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,   my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
  $scan_data);   $scan_data);
  if (!defined($$scan_record{'scantron.doubleerror'})) { next; }   if (!defined($$scan_record{'scantron.doubleerror'})) { next; }
Line 3776  sub scantron_validate_missingbubbles { Line 3780  sub scantron_validate_missingbubbles {
     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);
  if (!$line) { next; }   if ($line=~/^[\s\cz]*$/) { next; }
  my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,   my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
  $scan_data);   $scan_data);
  if (!defined($$scan_record{'scantron.missingerror'})) { next; }   if (!defined($$scan_record{'scantron.missingerror'})) { next; }
Line 3826  SCANTRONFORM Line 3830  SCANTRONFORM
   'Processing first student');    'Processing first student');
     my $start=&Time::HiRes::time();      my $start=&Time::HiRes::time();
     my $i=-1;      my $i=-1;
       my ($uname,$udom);
     while ($i<$scanlines->{'count'}) {      while ($i<$scanlines->{'count'}) {
    ($uname,$udom)=('','');
  $i++;   $i++;
  my $line=&scantron_get_line($scanlines,$i);   my $line=&scantron_get_line($scanlines,$i);
  $r->print('<pre>line is'.$line.'</pre>');  # $r->print('<pre>line is'.$line.'</pre>');
  if (!defined($line)) {    if ($line=~/^[\s\cz]*$/) { next; }
     $r->print('skipping');  
     next;  
  }  
  my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,   my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
  $scan_data);   $scan_data);
  my ($uname,$udom);  
  unless ($uname=&scantron_find_student($scan_record,$scan_data,   unless ($uname=&scantron_find_student($scan_record,$scan_data,
       \%idmap,$i)) {        \%idmap,$i)) {
     &scantron_add_delay(\@delayqueue,$line,      &scantron_add_delay(\@delayqueue,$line,
Line 3848  SCANTRONFORM Line 3850  SCANTRONFORM
  'Student '.$uname.' has multiple sheets',2);   'Student '.$uname.' has multiple sheets',2);
     next;      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);
Line 3888  SCANTRONFORM Line 3890  SCANTRONFORM
     } continue {      } 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,$uname);
  'last student');  
  #last;   #last;
  #FIXME   #FIXME
  #get iterator for $sequence   #get iterator for $sequence
Line 3900  SCANTRONFORM Line 3901  SCANTRONFORM
     }      }
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
     my $lasttime = &Time::HiRes::time()-$start;      my $lasttime = &Time::HiRes::time()-$start;
     $r->print("<p>took $lasttime</p>");      #$r->print("<p>took $lasttime</p>");
   
     #$Apache::lonxml::debug=0;      #$Apache::lonxml::debug=0;
     foreach my $delay (@delayqueue) {      foreach my $delay (@delayqueue) {
Line 3917  SCANTRONFORM Line 3918  SCANTRONFORM
     #     to ignore delayed students, possibly saving the delay queue for later      #     to ignore delayed students, possibly saving the delay queue for later
           
     $navmap->untieHashes();      $navmap->untieHashes();
       $r->print("<p>Done</p>");
       $r->print(&show_grading_menu_form($symb,$url));
       return '';
 }  }
   
 sub scantron_upload_scantron_data {  sub scantron_upload_scantron_data {
Line 4241  sub handler { Line 4245  sub handler {
  &Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) {   &Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) {
     $request->print(&scantron_upload_scantron_data_save($request));      $request->print(&scantron_upload_scantron_data_save($request));
  } elsif ($command) {   } elsif ($command) {
     $request->print("Access Denied");      $request->print("$command ".join(':',%perm)."Access Denied");
  }   }
     }      }
     &send_footer($request);      &send_footer($request);

Removed from v.1.130.2.1.2.9  
changed lines
  Added in v.1.130.2.1.2.10


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