Diff for /loncom/homework/bridgetask.pm between versions 1.32 and 1.44

version 1.32, 2005/05/27 17:08:03 version 1.44, 2005/09/07 22:20:33
Line 36  use Apache::File(); Line 36  use Apache::File();
 use Apache::lonmenu;  use Apache::lonmenu;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonxml;  use Apache::lonxml;
   use Apache::slotrequest();
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
   
 BEGIN {  BEGIN {
Line 91  sub proctor_check_auth { Line 92  sub proctor_check_auth {
 sub get_version {  sub get_version {
     my ($version,$previous);      my ($version,$previous);
     if ($env{'form.previousversion'} &&       if ($env{'form.previousversion'} && 
    $env{'form.previousversion'} ne 'current' &&
  defined($Apache::lonhomework::history{'resource.'.$env{'form.previousversion'}.'.status'})) {   defined($Apache::lonhomework::history{'resource.'.$env{'form.previousversion'}.'.status'})) {
  $version=$env{'form.previousversion'};   $version=$env{'form.previousversion'};
  $previous=1;   $previous=1;
Line 129  sub add_previous_version_button { Line 131  sub add_previous_version_button {
     my $list='<option>'.      my $list='<option>'.
  join("</option>\n<option>",@to_show).   join("</option>\n<option>",@to_show).
      "</option>\n";       "</option>\n";
       $list.='<option value="current">'.&mt('Current').'</option>';
     $result.='<form name="getprevious" method="POST" action="';      $result.='<form name="getprevious" method="POST" action="';
     my $uri=$env{'request.uri'};      my $uri=$env{'request.uri'};
     if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }      if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
Line 144  sub add_grading_button { Line 147  sub add_grading_button {
     my $result=' <input type="submit" name="gradeasubmission" value="'.      my $result=' <input type="submit" name="gradeasubmission" value="'.
  &mt("Get a submission to grade").'" />';   &mt("Get a submission to grade").'" />';
     $result.='<input type="hidden" name="grade_target" value="webgrade" />';      $result.='<input type="hidden" name="grade_target" value="webgrade" />';
     if ( 1) {      if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
  #need a permissions for limitng this to 'powerful users'   my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');
  #check if review queue has items   $result.='<p>'.&mt("Grading Queue has [_1] entries. [_2] of them are ready to be graded and [_3] of them are currently being graded",$entries,$ready,$locks);
   
    $result.=' <input type="submit" name="reviewagrading" value="'.
       &mt("Select an entry from the grading queue").'" /> </p>'."\n";
   
    ($entries,$ready,$locks)=&get_queue_counts('reviewqueue');
    $result.='<p>'.&mt("Review Queue has [_1] entries. [_2] of them are ready to be graded and [_3] of them are currently being graded",$entries,$ready,$locks);
  $result.=' <input type="submit" name="reviewasubmission" value="'.   $result.=' <input type="submit" name="reviewasubmission" value="'.
     &mt("Select an entry from the review queue").'" />';      &mt("Select an entry from the review queue").'" /> </p>'."\n";
     }      }
     return $result;      return $result;
 }  }
   
 sub add_request_another_attempt_button {  sub add_request_another_attempt_button {
       my ($text)=@_;
       if (!$text) { $text="Request another attempt"; }
     my $result;      my $result;
     $result.=' <input type="submit" name="requestattempt" value="'.      my $symb=&Apache::lonnet::symbread();
  &mt("Request another attempt").'" />';      my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb);
       my $action='get_reservation';
       if ($slot_name) {
    $text="Change reservation.";
    $action='change_reservation';
    my $description=&Apache::slotrequest::get_description($slot_name,
         $slot);
    $result.=(<<STUFF);
   <p> Will be next available: $description </p>
   STUFF
       }
       
       if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }
       $symb=&Apache::lonnet::escape($symb);
       $result.='<form method="POST" action="/adm/slotrequest">'.
    '<input type="hidden" name="symb" value="'.$symb.'" />'.
    '<input type="hidden" name="command" value="'.$action.'" />'.
    '<input type="submit" name="requestattempt" value="'.
    &mt($text).'" />'.
    '</form>';
     return $result;      return $result;
 }  }
   
Line 192  sub start_Task { Line 222  sub start_Task {
     my $uri=$env{'request.uri'};      my $uri=$env{'request.uri'};
     if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }      if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
     $body_tag_start.=$uri.'">'.&add_grading_button()."</form>";      $body_tag_start.=$uri.'">'.&add_grading_button()."</form>";
       my $symb=&Apache::lonnet::symbread();
       if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
    $body_tag_start.='<form method="POST" action="/adm/slotrequest">'.
       '<input type="hidden" name="symb" value="'.$symb.'" />'.
       '<input type="hidden" name="command" value="showslots" />'.
       '<input type="submit" name="requestattempt" value="'.
       &mt('Show Slot list').'" />'.
       '</form>';
       }
  }   }
     }      }
     if ($target eq 'web' || ($target eq 'grade' && !$env{'form.webgrade'}) || $target eq 'answer' ||      if ($target eq 'web' || ($target eq 'grade' && !$env{'form.webgrade'}) || $target eq 'answer' ||
Line 222  sub start_Task { Line 261  sub start_Task {
     $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';      $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
  } elsif ($status eq 'NOT_IN_A_SLOT') {   } elsif ($status eq 'NOT_IN_A_SLOT') {
     $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>';      $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>';
       $msg.=&add_request_another_attempt_button("Sign up for time to work.");
  } elsif ($status eq 'NEEDS_CHECKIN') {   } elsif ($status eq 'NEEDS_CHECKIN') {
     $msg.='<h1>'.&mt('You need the Proctor to validate you.').      $msg.='<h1>'.&mt('You need the Proctor to validate you.').
  '</h1>'.&proctor_validation_screen($slot);   '</h1>'.&proctor_validation_screen($slot);
Line 243  sub start_Task { Line 283  sub start_Task {
  }   }
     } elsif ($target eq 'grade' && !$env{'form.webgrade'}) {      } elsif ($target eq 'grade' && !$env{'form.webgrade'}) {
  if ($status eq 'NEEDS_CHECKIN') {   if ($status eq 'NEEDS_CHECKIN') {
     if (&proctor_check_auth($slot_name,$slot)) {      &proctor_check_auth($slot_name,$slot);
  #FIXME immeadiatly add this to the grading queue  
                         #      with slot->{'endtime'} for when grading can   
                         #      begin on this resource  
  # FIXME I think the above is done by default,  
                         #        need to check that  
                         #        failure doesn't do this.  
      }  
  }   }
     }      }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     my $name= &Apache::structuretags::get_resource_name($parstack,$safeeval);      my $name= &Apache::structuretags::get_resource_name($parstack,$safeeval);
     $result.="$head_tag_start<title>$name</title></head>      $result.="$head_tag_start<title>$name</title></head>
               $body_tag_start \n $form_tag_start".                $body_tag_start \n";
       '<input type="hidden" name="submitted" value="yes" />';      
     $result.=&preserve_grade_info();  
     my ($version,$previous)=&get_version();      my ($version,$previous)=&get_version();
     if ($Apache::lonhomework::history{"resource.$version.status"} eq 'fail') {      if ($Apache::lonhomework::history{"resource.$version.status"} eq 'fail') {
  $result.='<h1><font color="red">'.&mt('Did not pass').'</font></h1>';   $result.='<h1><font color="red">'.&mt('Did not pass').'</font></h1>';
Line 269  sub start_Task { Line 301  sub start_Task {
     if ($Apache::lonhomework::history{"resource.$version.status"} eq 'pass') {      if ($Apache::lonhomework::history{"resource.$version.status"} eq 'pass') {
  $result.='<h1><font color="green">'.&mt('Passed').'</font></h1>';   $result.='<h1><font color="green">'.&mt('Passed').'</font></h1>';
     }      }
       $result.=$form_tag_start.
    '<input type="hidden" name="submitted" value="yes" />';
       $result.=&preserve_grade_info();
   
  }   }
     } elsif ( ($target eq 'grade' && $env{'form.webgrade'}) ||      } elsif ( ($target eq 'grade' && $env{'form.webgrade'}) ||
       $target eq 'webgrade') {        $target eq 'webgrade') {
  my $webgrade='yes';   my $webgrade='yes';
  if ($target eq 'webgrade') {   if ($target eq 'webgrade') {
     #FIXME FORM conflcit with the 'show queue',1   
     $result.=$head_tag_start.$body_tag_start;      $result.=$head_tag_start.$body_tag_start;
     $result.='<br />Review'.&show_queue('reviewqueue');      $result.='<br />Review'.&show_queue('reviewqueue');
     $result.='<br />Before'.&show_queue('gradingqueue');      $result.='<br />Grade'.&show_queue('gradingqueue');
  }   }
  if (defined($env{'form.reviewasubmission'})) {   # FIXME Blast! still need to reorg this, need to reshow the
     $result.=&show_queue('reviewqueue',1);          #       queue being reviewed once done with the grade pass...
     my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);          #       Hrrm, vaildation pass should perhaps say 'not_locked'
  } else {          #       perhaps do a search if there is a key that is mine and if
     my ($todo,$status_code)=&get_key_todo($target);          #       there isn't reshow the queue....
     if ($todo) {   my ($todo,$status_code)=&get_key_todo($target);
  &setup_env_for_other_user($todo,$safeeval);  
  my ($symb,$uname,$udom)=&decode_queue_key($todo);   &Apache::lonnet::logthis("got todo -$todo- stat -$status_code-");
  $result.="\n".'<table><tr><td>Found '.   if ($todo) {
     &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>';      &setup_env_for_other_user($todo,$safeeval);
  $result.='<input type="hidden" name="gradingkey" value="'.      my ($symb,$uname,$udom)=&decode_queue_key($todo);
     &Apache::lonnet::escape($todo).'" />';      $result.="\n".'<table><tr><td>Found '.
  $Apache::bridgetask::queue_key=$todo;   &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>';
  &Apache::structuretags::initialize_storage();      $form_tag_start.=
  &Apache::lonhomework::showhash(%Apache::lonhomework::history);   '<input type="hidden" name="gradingkey" value="'.
  if ($target eq 'webgrade') {   &Apache::lonnet::escape($todo).'" />';
     $result.='<br />After'.&show_queue('gradingqueue');      $Apache::bridgetask::queue_key=$todo;
     $result.="\n".'<table width="100%" style="width:100%" border="1">';      &Apache::structuretags::initialize_storage();
       &Apache::lonhomework::showhash(%Apache::lonhomework::history);
       if ($target eq 'webgrade') {
    $result.='<br />After -'.&show_queue($env{'form.queue'});
    $result.="\n".'<table width="100%" style="width:100%" border="1">';
    if ($status_code eq 'selected') {
       $form_tag_start.=
    '<input type="hidden" name="queuemode" value="selected" />';
  }   }
     } else {      }
  if ($target eq 'webgrade') {   } else {
     $result.="\n".'<table><tr><td><b>';      if ($target eq 'webgrade') {
     if      ($status_code eq 'stop') {   $result.="\n";
  $result.=&mt("Stopped grading.");   if      ($status_code eq 'stop') {
     } elsif ($status_code eq 'lock_failed') {      $result.='<b>'.&mt("Stopped grading.").'</b>';
  $result.=&mt("Failed to lock the request record.");   } elsif ($status_code eq 'lock_failed') {
     } elsif ($status_code eq 'unlock') {      $result.='<b>'.&mt("Failed to lock the request record.").'</b>';
  $result.=&mt("Unlocked the requested user.");   } elsif ($status_code eq 'unlock') {
     } else {      $result.='<b>'.&mt("Unlocked the requested record.").'</b>';
  $result.=&mt("No user to be graded.");      $result.=&show_queue($env{'form.queue'},1);
     }   } elsif ($status_code eq 'show_list') {
     $result.='</b></td></tr></table>';      $result.=&show_queue($env{'form.queue'},1);
    } else {
       $result.='<b>'.&mt("No user to be graded.").'</b>';
  }   }
  $webgrade='no';  
  my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);  
     }      }
       $webgrade='no';
       my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);
  }   }
  if ($target eq 'webgrade' && defined($env{'form.queue'})) {   if ($target eq 'webgrade' && defined($env{'form.queue'})) {
     $result.=$form_tag_start;      $result.=$form_tag_start;
Line 333  sub start_Task { Line 377  sub start_Task {
 sub get_key_todo {  sub get_key_todo {
     my ($target)=@_;      my ($target)=@_;
     my $todo;      my $todo;
   
       if (defined($env{'form.reviewasubmission'})) {
    &Apache::lonnet::logthis("review a submission....");
    $env{'form.queue'}='reviewqueue';
    return (undef,'show_list');
       }
   
       if (defined($env{'form.reviewagrading'})) {
    &Apache::lonxml::debug("review a grading....");
    $env{'form.queue'}='gradingqueue';
    return (undef,'show_list');
       }
   
     my $queue=$env{'form.queue'};      my $queue=$env{'form.queue'};
   
     if (!defined($queue)) {      if (!defined($queue)) {
  $env{'form.queue'}=$queue='gradingqueue';   $env{'form.queue'}=$queue='gradingqueue';
     }      }
   
     my $gradingkey=&Apache::lonnet::unescape($env{'form.gradingkey'});      my $gradingkey=&Apache::lonnet::unescape($env{'form.gradingkey'});
   
     if (defined($env{'form.queue'}) && defined($env{'form.gradingkey'})      if (defined($env{'form.queue'}) && defined($env{'form.gradingkey'})
  && !defined($env{'form.action'})) {   && !defined($env{'form.gradingaction'}) 
  #FIXME probably need to do some cheking here for more validity   && $env{'form.queuemode'} eq 'selected') {
  &Apache::lonnet::logthis("Found a key was given to me");  
  return ($gradingkey);   my $who=&queue_key_locked($queue,$gradingkey);
     }   my $me=$env{'user.name'}.'@'.$env{'user.domain'};
     if ($env{'form.action'} eq 'resume') {   if ($who eq $me) {
  &Apache::lonnet::logthis("Resuming a key");      &Apache::lonxml::debug("Found a key was given to me");
  return ($gradingkey);      return ($gradingkey,'selected');
     } elsif ($env{'form.action'} eq 'unlock') {   } else {
  &Apache::lonnet::logthis("Unlocking a key ".      return (undef,'show_list');
  &check_queue_unlock($queue,$gradingkey,1));   }
  return (undef,'unlock');  
     } elsif ($env{'form.action'} eq 'select') {      }
  if (&lock_key($queue,$gradingkey)) {  
       if ($target eq 'webgrade' && $env{'form.queuemode'} eq 'selected') {
    if ($env{'form.gradingaction'} eq 'resume') {
       delete($env{'form.gradingaction'});
       &Apache::lonxml::debug("Resuming a key");
     return ($gradingkey);      return ($gradingkey);
    } elsif ($env{'form.gradingaction'} eq 'unlock') {
       &Apache::lonxml::debug("Unlocking a key ".
        &check_queue_unlock($queue,$gradingkey,1));
       return (undef,'unlock');
    } elsif ($env{'form.gradingaction'} eq 'select') {
       &Apache::lonxml::debug("Locking a key");
       if (&lock_key($queue,$gradingkey)) {
    &Apache::lonxml::debug("Success $queue");
    return ($gradingkey);
       }
       &Apache::lonxml::debug("Failed $queue");
       return (undef,'lock_failed');
  }   }
  return (undef,'lock_failed');  
     }      }
     # don't get something new from the queue if they hit the stop button  
     if (!($env{'form.stop'} && $target eq 'webgrade')) {      if ($env{'form.queuemode'} ne 'selected') {
  return (&get_from_queue($queue));   # don't get something new from the queue if they hit the stop button
     } else {      if (!($env{'form.stop'} && $target eq 'webgrade') 
  return (undef,'stop');      && !$env{'form.gradingaction'}) {
       &Apache::lonxml::debug("Getting anew $queue");
       return (&get_from_queue($queue));
    } else {
       return (undef,'stop');
    }
     }      }
       return (undef,undef)
 }  }
   
 sub end_Task {  sub end_Task {
Line 442  sub end_Task { Line 523  sub end_Task {
  $env{'user.name'}.'@'.$env{'user.domain'};   $env{'user.name'}.'@'.$env{'user.domain'};
     if ($review) {      if ($review) {
  $Apache::lonhomework::results{"resource.$version.status"}='review';   $Apache::lonhomework::results{"resource.$version.status"}='review';
  # FIXME won't work well when already in review queues   if ($env{'form.queue'} eq 'reviewqueue') {
  &move_between_queues('gradingqueue','reviewqueue');      &check_queue_unlock($env{'form.queue'});
       &Apache::lonxml::debug(" still needs review not changing status.");
    } else {
       &move_between_queues('gradingqueue','reviewqueue');
    }
     } elsif ($ungraded) {      } elsif ($ungraded) {
  $Apache::lonhomework::results{"resource.$version.status"}='ungraded';   $Apache::lonhomework::results{"resource.$version.status"}='ungraded';
  # FIXME if in review queue need to move back to grading queue   if ($env{'form.queue'} eq 'reviewqueue') {
  &check_queue_unlock($env{'form.queue'});      &Apache::lonxml::debug("moving back.");
       &move_between_queues('reviewqueue','gradingqueue');
    } else {
       &check_queue_unlock($env{'form.queue'});
    }
     } elsif ($mandatory_failed) {      } elsif ($mandatory_failed) {
  $Apache::lonhomework::results{"resource.$version.status"}='fail';   $Apache::lonhomework::results{"resource.$version.status"}='fail';
  $Apache::lonhomework::results{"resource.$version.0.solved"}='incorrect_by_override';   $Apache::lonhomework::results{"resource.$version.0.solved"}='incorrect_by_override';
  $Apache::lonhomework::results{"resource.$version.0.award"}='INCORRECT';   $Apache::lonhomework::results{"resource.$version.0.award"}='INCORRECT';
  $Apache::lonhomework::results{"resource.$version.0.awarded"}='0';   $Apache::lonhomework::results{"resource.$version.0.awarded"}='0';
  &remove_from_queue($env{'form.queue'});   &remove_from_queue($env{'form.queue'}); 
   
    my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
    $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}=
       $Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"};
    &Apache::grades::version_portfiles(
    \%Apache::lonhomework::results,
    ["$version.0.bridgetask"],$courseid,
    $symb,$udom,$uname,
    ["$version.0.bridgetask"]);
     } else {      } else {
  $Apache::lonhomework::results{"resource.$version.status"}='pass';   $Apache::lonhomework::results{"resource.$version.status"}='pass';
  $Apache::lonhomework::results{"resource.$version.0.solved"}='correct_by_override';   $Apache::lonhomework::results{"resource.$version.0.solved"}='correct_by_override';
  $Apache::lonhomework::results{"resource.$version.0.award"}='EXACT_ANS';   $Apache::lonhomework::results{"resource.$version.0.award"}='EXACT_ANS';
  $Apache::lonhomework::results{"resource.$version.0.awarded"}='1';   $Apache::lonhomework::results{"resource.$version.0.awarded"}='1';
  &remove_from_queue($env{'form.queue'});   &remove_from_queue($env{'form.queue'});
   
    my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
    $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}=
       $Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"};
    &Apache::grades::version_portfiles(
    \%Apache::lonhomework::results,
    ["$version.0.bridgetask"],$courseid,
    $symb,$udom,$uname,
    ["$version.0.bridgetask"]);
     }      }
     $Apache::lonhomework::results{"resource.status"}=      $Apache::lonhomework::results{"resource.status"}=
  $Apache::lonhomework::results{"resource.$version.status"};   $Apache::lonhomework::results{"resource.$version.status"};
Line 518  sub check_queue_unlock { Line 625  sub check_queue_unlock {
     if  ($who eq $me) {      if  ($who eq $me) {
  return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);   return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);
     } elsif ($allow_not_me) {      } elsif ($allow_not_me) {
  &Apache::lonnet::logthis("unlocking $who by $me");   &Apache::lonxml::debug("unlocking $who by $me");
  return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);   return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);
     }      }
     return 'not_owner';      return 'not_owner';
Line 578  sub show_queue { Line 685  sub show_queue {
     my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);      my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
     my ($tmp)=%queue;      my ($tmp)=%queue;
     if ($tmp=~/^error: 2 /) {      if ($tmp=~/^error: 2 /) {
  return "\n<h3>Current Queue</h3><table border='1'><tr><td>Empty</td></tr></table>";   return "\n<h3>Current Queue - $queue</h3><table border='1'><tr><td>Empty</td></tr></table>";
     }      }
     $result.="\n<h3>Current Queue</h3><table border='1'><tr>";      $result.="\n<h3>Current Queue - $queue </h3><table border='1'><tr>";
     if ($with_selects) { $result.="<th></th>"; }      if ($with_selects) { $result.="<th></th>"; }
     $result.="<th>resource</th><th>user</th><th>type</th><th>data</th></tr>";      $result.="<th>resource</th><th>user</th><th>type</th><th>data</th></tr>";
     foreach my $key (sort(keys(%queue))) {      foreach my $key (sort(keys(%queue))) {
Line 599  sub show_queue { Line 706  sub show_queue {
     my ($symb,$uname,$udom) = &decode_queue_key($key);      my ($symb,$uname,$udom) = &decode_queue_key($key);
     my $title=&Apache::lonnet::gettitle($symb);      my $title=&Apache::lonnet::gettitle($symb);
     $result.="<tr>";      $result.="<tr>";
       my $slot=$queue{$key}->[0];
       my %slot_data=&Apache::lonnet::get_slot($slot);
     if ($with_selects) {      if ($with_selects) {
  my $ekey=&Apache::lonnet::escape($key);   my $ekey=&Apache::lonnet::escape($key);
  my ($action,$description)=('select',&mt('Select'));   my ($action,$description)=('select',&mt('Select'));
Line 610  sub show_queue { Line 719  sub show_queue {
  ($action,$description)=('unlock',&mt('Unlock'));   ($action,$description)=('unlock',&mt('Unlock'));
     }      }
  }   }
  $result.=(<<FORM);   if (time > $slot_data{'endtime'}) {
       $result.=(<<FORM);
 <td>  <td>
 <form method="POST">  <form method="POST">
  <input type="hidden" name="gradingkey" value="$ekey" />   <input type="hidden" name="gradingkey" value="$ekey" />
  <input type="hidden" name="queue" value="$queue" />   <input type="hidden" name="queue" value="$queue" />
  <input type="hidden" name="gradingaction" value="$action" />   <input type="hidden" name="gradingaction" value="$action" />
  <input type="hidden" name="webgrade" value="no" />   <input type="hidden" name="webgrade" value="no" />
    <input type="hidden" name="queuemode" value="selected" />
  <input type="submit" name="submit" value="$description" />   <input type="submit" name="submit" value="$description" />
 </form>  </form>
 </td>  </td>
 FORM  FORM
   
                   } else {
       $result.='<td>'.&mt("In Progress").'</td>'
    }
     }      }
     $result.="<td>$title</td><td>$uname</td>";      $result.="<td>$title</td><td>$uname</td>";
     my $slot=$queue{$key}->[0];  
     my %slot_data=&Apache::lonnet::get_slot($slot);  
     $result.='<td>queue entry</td><td>Slot: '.$slot.' End time: '.      $result.='<td>queue entry</td><td>Slot: '.$slot.' End time: '.
  &Apache::lonlocal::locallocaltime($slot_data{'endtime'}).   &Apache::lonlocal::locallocaltime($slot_data{'endtime'}).
  "</td></tr>";   "</td></tr>";
Line 634  FORM Line 747  FORM
     return $result;      return $result;
 }  }
   
   sub get_queue_counts {
       my ($queue)=@_;
       my $result;
       my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
       my $cnum=$env{'course.'.$cid.'.num'};
       my $cdom=$env{'course.'.$cid.'.domain'};
       my $regexp="^$symb\0";
       my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
       my ($tmp)=%queue;
       if ($tmp=~/^error: 2 /) {
    return (0,0,0);
       }
       my ($entries,$ready_to_grade,$locks)=(0,0,0);
       foreach my $key (sort(keys(%queue))) {
    if ($key=~/locked$/) {
       $locks++;
    } elsif ($key=~/timestamp$/) {
       #ignore
    } elsif ($key!~/(timestamp|locked)$/) {
       my ($symb,$uname,$udom) = &decode_queue_key($key);
       $entries++;
       my $slot=$queue{$key}->[0];
       my %slot_data=&Apache::lonnet::get_slot($slot);
       if (time > $slot_data{'endtime'}) {
    $ready_to_grade++;
       }
    }
       }
       return ($entries,$ready_to_grade,$locks);
   }
   
 sub decode_queue_key {  sub decode_queue_key {
     my ($key)=@_;      my ($key)=@_;
     my ($symb,undef,$user) = split("\0",$key);      my ($symb,undef,$user) = split("\0",$key);
Line 643  sub decode_queue_key { Line 787  sub decode_queue_key {
   
 sub queue_key_locked {  sub queue_key_locked {
     my ($queue,$key,$cdom,$cnum)=@_;      my ($queue,$key,$cdom,$cnum)=@_;
       if (!defined($cdom) || !defined($cnum)) {
    my (undef,$cid)=&Apache::lonxml::whichuser();
    $cnum=$env{'course.'.$cid.'.num'};
    $cdom=$env{'course.'.$cid.'.domain'};
       }
     my ($key_locked,$value)=      my ($key_locked,$value)=
  &Apache::lonnet::get($queue,["$key\0locked"],$cdom,$cnum);   &Apache::lonnet::get($queue,["$key\0locked"],$cdom,$cnum);
     if ($key_locked eq "$key\0locked") {      if ($key_locked eq "$key\0locked") {
Line 658  sub pick_from_queue_data { Line 807  sub pick_from_queue_data {
  if ($check_section) {   if ($check_section) {
     my $section=&Apache::lonnet::getsection($uname,$udom);      my $section=&Apache::lonnet::getsection($uname,$udom);
     if ($section eq $check_section) {      if ($section eq $check_section) {
  &Apache::lonnet::logthis("my sec");   &Apache::lonxml::debug("my sec");
  next;   next;
     }      }
  }   }
  my $slot=$queuedata->{$key}[0];   my $slot=$queuedata->{$key}[0];
  my %slot_data=&Apache::lonnet::get_slot($slot);   my %slot_data=&Apache::lonnet::get_slot($slot);
  if ($slot_data{'endtime'} > time) {    if ($slot_data{'endtime'} > time) { 
     &Apache::lonnet::logthis("not time");      &Apache::lonxml::debug("not time");
     next;      next;
  }   }
  if (&queue_key_locked($queue,$key,$cdom,$cnum)) {   if (&queue_key_locked($queue,$key,$cdom,$cnum)) {
     &Apache::lonnet::logthis("someone already has um.");      &Apache::lonxml::debug("someone already has um.");
     next;      next;
  }   }
  return $key;   return $key;
Line 706  sub lock_key { Line 855  sub lock_key {
     my $cdom=$env{'course.'.$cid.'.domain'};      my $cdom=$env{'course.'.$cid.'.domain'};
     my $success=&Apache::lonnet::newput($queue,{"$todo\0locked"=> $me},      my $success=&Apache::lonnet::newput($queue,{"$todo\0locked"=> $me},
  $cdom,$cnum);   $cdom,$cnum);
     &Apache::lonnet::logthis("success $success $todo");      &Apache::lonxml::debug("success $success $todo");
     if ($success eq 'ok') {      if ($success eq 'ok') {
  return 1;   return 1;
     }      }
Line 720  sub get_from_queue { Line 869  sub get_from_queue {
     my $cnum=$env{'course.'.$cid.'.num'};      my $cnum=$env{'course.'.$cid.'.num'};
     my $cdom=$env{'course.'.$cid.'.domain'};      my $cdom=$env{'course.'.$cid.'.domain'};
     my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum);      my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum);
     &Apache::lonnet::logthis("found ".join(':',&decode_queue_key($todo)));      &Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));
     if ($todo) { return $todo; }      if ($todo) { return $todo; }
     while (1) {      while (1) {
  my $starttime=time;   my $starttime=time;
  &Apache::lonnet::put($queue,{"$symb\0timestamp"=>$starttime},   &Apache::lonnet::put($queue,{"$symb\0timestamp"=>$starttime},
      $cdom,$cnum);       $cdom,$cnum);
  &Apache::lonnet::logthis("$starttime");   &Apache::lonxml::debug("$starttime");
  my $regexp="^$symb\0queue\0";   my $regexp="^$symb\0queue\0";
  my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);   my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
  #make a pass looking for a user in my section   #make a pass looking for a user _not_ in my section
  if ($env{'request.course.sec'}) {   if ($env{'request.course.sec'}) {
     &Apache::lonnet::logthis("sce");      &Apache::lonxml::debug("sce");
     $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},      $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},
  \%queue,$cdom,$cnum);   \%queue,$cdom,$cnum);
     &Apache::lonnet::logthis("sce $todo");      &Apache::lonxml::debug("sce $todo");
  }   }
  # no one in our section so look for any user that is ready for grading   # no one _not_ in our section so look for any user that is
    # ready for grading
  if (!$todo) {   if (!$todo) {
     &Apache::lonnet::logthis("no sce");      &Apache::lonxml::debug("no sce");
     $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},      $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},
  \%queue,$cdom,$cnum);   \%queue,$cdom,$cnum);
     &Apache::lonnet::logthis("no sce $todo");      &Apache::lonxml::debug("no sce $todo");
  }   }
  # no user to grade    # no user to grade 
  if (!$todo) { last; }   if (!$todo) { last; }
  &Apache::lonnet::logthis("got $todo");   &Apache::lonxml::debug("got $todo");
  # otherwise found someone so lets try to lock them   # otherwise found someone so lets try to lock them
  # unless someone else already picked them   # unless someone else already picked them
  if (!&lock_key($queue,$todo)) { next; }   if (!&lock_key($queue,$todo)) { next; }
  my (undef,$endtime)=   my (undef,$endtime)=
     &Apache::lonnet::get($queue,["$symb\0timestamp"],      &Apache::lonnet::get($queue,["$symb\0timestamp"],
  $cdom,$cnum);   $cdom,$cnum);
  &Apache::lonnet::logthis("emd  $endtime");   &Apache::lonxml::debug("emd  $endtime");
  # someone else already modified the queue,    # someone else already modified the queue, 
  # perhaps our picked user wass already fully graded between   # perhaps our picked user wass already fully graded between
  # when we picked him and when we locked his record? so lets   # when we picked him and when we locked his record? so lets
Line 761  sub get_from_queue { Line 911  sub get_from_queue {
     my ($key,$value)=      my ($key,$value)=
  &Apache::lonnet::get($queue,["$todo"],   &Apache::lonnet::get($queue,["$todo"],
      $cdom,$cnum);       $cdom,$cnum);
     &Apache::lonnet::logthis("check  $key .. $value");      &Apache::lonxml::debug("check  $key .. $value");
     if ($key eq $todo && ref($value)) {      if ($key eq $todo && ref($value)) {
     } else {      } else {
  &Apache::lonnet::del($queue,["$todo\0locked"],   &Apache::lonnet::del($queue,["$todo\0locked"],
      $cdom,$cnum);       $cdom,$cnum);
  &Apache::lonnet::logthis("del");   &Apache::lonxml::debug("del");
  next;   next;
     }      }
  }   }
  &Apache::lonnet::logthis("last $todo");   &Apache::lonxml::debug("last $todo");
  last;   last;
     }      }
     return $todo;      return $todo;
Line 886  sub get_instance { Line 1036  sub get_instance {
  $result.='<tr><td colspan="4">';   $result.='<tr><td colspan="4">';
  my (undef,undef,$udom,$uname) = &Apache::lonxml::whichuser();   my (undef,undef,$udom,$uname) = &Apache::lonxml::whichuser();
  my $file_url = '/uploaded/'.$udom.'/'.$uname.'/portfolio';   my $file_url = '/uploaded/'.$udom.'/'.$uname.'/portfolio';
  foreach my $partial_file (split(',',$Apache::lonhomework::history{"resource.$version.bridgetask.portfiles"})) {   foreach my $partial_file (split(',',$Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"})) {
     my $file=$file_url.$partial_file;      my $file=$file_url.$partial_file;
     &Apache::lonnet::allowuploaded('/adm/bridgetask',$file);      &Apache::lonnet::allowuploaded('/adm/bridgetask',$file);
     $result.='<a href="'.$file.'" target="lonGRDs"><img src="'.      $result.='<a href="'.$file.'" target="lonGRDs"><img src="'.
Line 1020  sub proctor_validation_screen { Line 1170  sub proctor_validation_screen {
     my ($slot) = @_;      my ($slot) = @_;
     my (undef,undef,$domain,$user) = &Apache::lonxml::whichuser();      my (undef,undef,$domain,$user) = &Apache::lonxml::whichuser();
     my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');      my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');
     $user=$env{'form.proctorname'};      my $name=&Apache::loncommon::plainname($user,$domain);
       
     if ($env{'form.proctordomain'}) { $domain=$env{'form.proctordomain'}; }      if ($env{'form.proctordomain'}) { $domain=$env{'form.proctordomain'}; }
     my $msg;      my $msg;
     if ($env{'form.proctorpassword'}) {      if ($env{'form.proctorpassword'}) {
Line 1035  sub proctor_validation_screen { Line 1186  sub proctor_validation_screen {
 <input type="hidden" name="validate" value="yes" />  <input type="hidden" name="validate" value="yes" />
 <input type="hidden" name="submitted" value="yes" />  <input type="hidden" name="submitted" value="yes" />
 <table>  <table>
   <tr><td>Proctor's Username:</td><td><input type="string" name="proctorname" value="$user" /></td></tr>    <tr><td>Proctor's Username:</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" /></td></tr>
   <tr><td>Password:</td><td><input type="password" name="proctorpassword" value="" /></td></tr>    <tr><td>Password:</td><td><input type="password" name="proctorpassword" value="" /></td></tr>
   <tr><td>Proctor's Domain:</td><td><input type="string" name="proctordomain" value="$domain" /></td></tr>    <tr><td>Proctor's Domain:</td><td><input type="string" name="proctordomain" value="$domain" /></td></tr>
 </table>  </table>
 <input type="submit" name="checkoutbutton" value="Validate"  /><br />  <input type="submit" name="checkoutbutton" value="Validate"  /><br />
 Student who should be logged in is:<br />  <table border="1">
 <img src="$url" /><br />    <tr><td>
       <table>
         <tr><td colspan="2">Student who should be logged in is:</td></tr>
         <tr><td>Name:</td><td>$name</td></tr>
         <tr><td>Studnet ID:</td><td>$env{'environment.id'}</td></tr>
         <tr><td>Usename</td><td>$user\@$domain</td></tr>
         <tr><td colspan="2"><img src="$url" /></td></tr>
       </table>
     </tr></td>
   </table>
 </form>  </form>
 ENDCHECKOUT  ENDCHECKOUT
     return $result;      return $result;

Removed from v.1.32  
changed lines
  Added in v.1.44


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