Diff for /loncom/homework/grades.pm between versions 1.130.2.1.2.8 and 1.130.2.1.2.11

version 1.130.2.1.2.8, 2003/10/13 22:36:59 version 1.130.2.1.2.11, 2003/10/16 03:51:52
Line 3145  sub getSequenceDropDown { Line 3145  sub getSequenceDropDown {
     return $result;      return $result;
 }  }
   
   #FIXME, I am in loncreatecourse, use that one instead
   sub propath {
       my ($udom,$uname)=@_;
       $udom=~s/\W//g;
       $uname=~s/\W//g;
       my $subdir=$uname.'__';
       $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
       my $proname="$Apache::lonnet::perlvar{'lonUsersDir'}/$udom/$subdir/$uname";
       return $proname;
   } 
   
 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'});      my $cdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
     my @files=sort(readdir(DIR));      my $cname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
       my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname,
          &propath($cdom,$cname));
     foreach my $filename (@files) {      foreach my $filename (@files) {
  if ($filename eq '.' or $filename eq '..') { next; }   ($filename)=split(/&/,$filename);
    if ($filename!~/^scantron_orig_/) { next ; }
    $filename=~s/^scantron_orig_//;
  $result.="<option>$filename</option>\n";   $result.="<option>$filename</option>\n";
     }      }
     closedir(DIR);  
     $result.="</select>";      $result.="</select>";
     return $result;      return $result;
 }  }
Line 3361  sub scantron_parse_scanline { Line 3373  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 3378  sub scantron_parse_scanline { Line 3389  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 3392  sub scantron_find_student { Line 3402  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 3492  SCANTRONFORM Line 3500  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 3598  sub scantron_validate_ID { Line 3614  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 3660  sub scantron_get_correction { Line 3669  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 3676  sub scantron_get_correction { Line 3685  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 3750  sub scantron_validate_doublebubble { Line 3766  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 3775  sub scantron_validate_missingbubbles { Line 3791  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 3825  SCANTRONFORM Line 3841  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 3847  SCANTRONFORM Line 3861  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 3887  SCANTRONFORM Line 3901  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 3899  SCANTRONFORM Line 3912  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 3916  SCANTRONFORM Line 3929  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 {
     my ($r)=@_;      my ($r)=@_;
     $r->print(&Apache::loncommon::coursebrowser_javascript($ENV{'request.role.domain'}));      $r->print(&Apache::loncommon::coursebrowser_javascript($ENV{'request.role.domain'}));
     $r->print(&Apache::loncommon::selectcourse_link('rules',      my $select_link=&Apache::loncommon::selectcourse_link('rules','courseid',
   'courseid','domain'));    'domainid');
     $r->print("Course: <input name='courseid' type='text'/>");      my $domsel=&Apache::loncommon::select_dom_form($ENV{'request.role.domain'},
     $r->print("Domain: <input name='domain' type='text'/>");     'domainid');
       $r->print(<<UPLOAD);
   <script type="text/javascript" language="javascript">
       function checkUpload(formname) {
    if (formname.upfile.value == "") {
       alert("Please use the browse button to select a file from your local directory.");
       return false;
    }
    formname.submit();
       }
   </script>
   
   <form enctype='multipart/form-data' action='/adm/grades' name='rules' method='post'>
   Course: <input name='courseid' type='text' />
   Domain: $domsel $select_link
   <br />
   <input name='command' value='scantronupload_save' type='hidden' />
   File to upload:<input type="file" name="upfile" size="50" />
   <br />
   <input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Scantron Data" />
   </form>
   UPLOAD
     return '';      return '';
   }
   
   sub scantron_upload_scantron_data_save {
       my($r)=@_;
       $r->print("Doing upload to ".$ENV{'form.courseid'});
       my $home=&Apache::lonnet::homeserver($ENV{'form.courseid'},
    $ENV{'form.domainid'});
       my $fname=$ENV{'form.upfile.filename'};
       #FIXME
       #copied from lonnet::userfileupload()
       #make that function able to target a specified course
       # Replace Windows backslashes by forward slashes
       $fname=~s/\\/\//g;
       # Get rid of everything but the actual filename
       $fname=~s/^.*\/([^\/]+)$/$1/;
       # Replace spaces by underscores
       $fname=~s/\s+/\_/g;
       # Replace all other weird characters by nothing
       $fname=~s/[^\w\.\-]//g;
       # See if there is anything left
       unless ($fname) { return 'error: no uploaded file'; }
       $fname='scantron_orig_'.$fname;
       &Apache::lonnet::logthis("fname is $fname");
       $r->print(&Apache::lonnet::finishuserfileupload($ENV{'form.courseid'},
       $ENV{'form.domainid'},
       $home,'upfile',$fname));
       return '';
 }  }
   
   
 #-------- end of section for handling grading scantron forms -------  #-------- end of section for handling grading scantron forms -------
 #  #
 #-------------------------------------------------------------------  #-------------------------------------------------------------------
Line 4115  sub handler { Line 4179  sub handler {
  $url = $ENV{'form.url'};   $url = $ENV{'form.url'};
     }      }
     &send_header($request);      &send_header($request);
     if ($url eq '' && $symb eq '') {      if ($url eq '' && $symb eq '' && $command eq '') {
  if ($ENV{'user.adv'}) {   if ($ENV{'user.adv'}) {
     if (($ENV{'form.codeone'}) && ($ENV{'form.codetwo'}) &&      if (($ENV{'form.codeone'}) && ($ENV{'form.codetwo'}) &&
  ($ENV{'form.codethree'})) {   ($ENV{'form.codethree'})) {
Line 4199  sub handler { Line 4263  sub handler {
     $request->print(&scantron_validate_file($request));      $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 eq 'scantronupload' && &Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) {   } elsif ($command eq 'scantronupload' && 
    &Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) {
     $request->print(&scantron_upload_scantron_data($request));      $request->print(&scantron_upload_scantron_data($request));
   
    } elsif ($command eq 'scantronupload_save' &&
    &Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) {
       $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.8  
changed lines
  Added in v.1.130.2.1.2.11


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