Diff for /loncom/homework/bridgetask.pm between versions 1.26 and 1.35

version 1.26, 2005/05/19 21:28:06 version 1.35, 2005/05/31 16:31:01
Line 71  sub proctor_check_auth { Line 71  sub proctor_check_auth {
     if ($authhost ne 'no_host') {      if ($authhost ne 'no_host') {
  my $version=   my $version=
     $Apache::lonhomework::results{'resource.version'}=      $Apache::lonhomework::results{'resource.version'}=
     $Apache::lonhomework::history{'resource.version'}++;      ++$Apache::lonhomework::history{'resource.version'};
  $Apache::lonhomework::results{"resource.$version.checkedin"}=   $Apache::lonhomework::results{"resource.$version.checkedin"}=
     $user.'@'.$domain;      $user.'@'.$domain;
  $Apache::lonhomework::results{"resource.$version.checkedin.slot"}=   $Apache::lonhomework::results{"resource.$version.checkedin.slot"}=
     $slot_name;      $slot_name;
    foreach my $key (keys(%Apache::lonhomework::history)) {
       if ($key=~/^resource\.0\./) {
    $Apache::lonhomework::results{$key}='';
       }
    }
  return 1;   return 1;
     }      }
  }   }
Line 84  sub proctor_check_auth { Line 89  sub proctor_check_auth {
 }  }
   
 sub get_version {  sub get_version {
       my ($version,$previous);
     if ($env{'form.previousversion'} &&       if ($env{'form.previousversion'} && 
  defined($Apache::lonhomework::history{'resource.'.$env{'form.previousversion'}.'.status'})) {   defined($Apache::lonhomework::history{'resource.'.$env{'form.previousversion'}.'.status'})) {
  return $env{'form.previousversion'};   $version=$env{'form.previousversion'};
    $previous=1;
       } else {
    $version=$Apache::lonhomework::history{'resource.version'};
    $previous=0;
       }
       if (wantarray) {
    return ($version,$previous);
     }      }
     return $Apache::lonhomework::history{'resource.version'};      return $version;
 }  }
   
 sub add_previous_version_button {  sub add_previous_version_button {
     my ($status)=@_;      my ($status)=@_;
     my $result;      my $result;
     if ($Apache::lonhomework::history{'resource.version'} eq '0') {      if ($Apache::lonhomework::history{'resource.version'} eq '') {
  return '';   return '';
     }      }
     my $version=&get_version();      if ($Apache::lonhomework::history{'resource.version'} < 2 &&
     if ($version ne $Apache::lonhomework::history{'resource.version'}) {   $status ne 'NEEDS_CHECKIN') {
  return '';   return '';
     }      }
       my $version=&get_version();
     $result.=&mt(' Show a previously done version: [_1]','<select name="previousversion">      if ($env{'form.previousversion'} ne '' &&
 <option>Pick one</option>   $env{'form.previousversion'} eq $version) {
 </select>');   $result.="<h3>".&mt("Showing previous version [_1]",$version).
       "</h3>\n";
       }
       my @to_show;
       foreach my $test_version (1..$Apache::lonhomework::history{'resource.version'}) {
    if (defined($Apache::lonhomework::history{'resource.'.$test_version.'.status'})) {
       push(@to_show,$test_version);
    }
       }
       my $list='<option>'.
    join("</option>\n<option>",@to_show).
        "</option>\n";
       $result.='<form name="getprevious" method="POST" action="';
       my $uri=$env{'request.uri'};
       if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
       $result.=$uri.'">'.
    &mt(' Show a previously done version: [_1]','<select onchange="this.form.submit()" name="previousversion">
   <option>'.&mt('Pick one').'</option>
   '.$list.'
   </select>')."</form>";
     return $result;      return $result;
 }  }
   
 sub add_grading_button {  sub add_grading_button {
     my $result;      my $result=' <input type="submit" name="gradeasubmission" value="'.
     $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) {
    #need a permissions for limitng this to 'powerful users'
   
    my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');
    $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="'.
       &mt("Select an entry from the review queue").'" /> </p>'."\n";
       }
     return $result;      return $result;
 }  }
   
Line 123  sub add_request_another_attempt_button { Line 168  sub add_request_another_attempt_button {
     return $result;      return $result;
 }  }
   
   sub preserve_grade_info {
       my $result;
       # if we are viewing someone else preserve that info
       if (defined $env{'form.grade_symb'}) {
    foreach my $field ('symb','courseid','domain','username') {
       $result .= '<input type="hidden" name="grade_'.$field.
    '" value="'.$env{"form.grade_$field"}.'" />'."\n";
    }
       }
       return $result;
   }
   
 sub start_Task {  sub start_Task {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
   
Line 147  sub start_Task { Line 204  sub start_Task {
     }      }
     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' ||
  $target eq 'tex') {   $target eq 'tex') {
  my $version=&get_version();   my ($version,$previous)=&get_version();
  ($status,$accessmsg,my $slot_name,$slot) =    ($status,$accessmsg,my $slot_name,$slot) = 
     &Apache::lonhomework::check_task_access('0');      &Apache::lonhomework::check_task_access('0');
  push(@Apache::inputtags::status,$status);   push(@Apache::inputtags::status,$status);
Line 157  sub start_Task { Line 214  sub start_Task {
  &Apache::run::run($expression,$safeeval);   &Apache::run::run($expression,$safeeval);
  &Apache::lonxml::debug("Got $status");   &Apache::lonxml::debug("Got $status");
  $body_tag_start.=&add_previous_version_button($status);   $body_tag_start.=&add_previous_version_button($status);
  if (( $status eq 'CLOSED' ) ||   if (!$previous && (
     ( $status eq 'BANNED') ||     ( $status eq 'CLOSED' ) ||
     ( $status eq 'UNAVAILABLE') ||     ( $status eq 'BANNED') ||
     ( $status eq 'NOT_IN_A_SLOT') ||     ( $status eq 'UNAVAILABLE') ||
     ( $status eq 'NEEDS_CHECKIN') ||     ( $status eq 'NOT_IN_A_SLOT') ||
     ( $status eq 'WAITING_FOR_GRADE') ||     ( $status eq 'NEEDS_CHECKIN') ||
     ( $status eq 'INVALID_ACCESS')) {     ( $status eq 'WAITING_FOR_GRADE') ||
      ( $status eq 'INVALID_ACCESS') )) {
     my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);      my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);
     if ( $target eq "web" ) {      if ( $target eq "web" ) {
  $result.= $head_tag_start.'</head>'.$body_tag_start;   $result.= $head_tag_start.'</head>'.$body_tag_start;
Line 208  sub start_Task { Line 266  sub start_Task {
     $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 $form_tag_start".
       '<input type="hidden" name="submitted" value="yes" />';        '<input type="hidden" name="submitted" value="yes" />';
     # if we are viewing someone else preserve that info      $result.=&preserve_grade_info();
     if (defined $env{'form.grade_symb'}) {      my ($version,$previous)=&get_version();
  foreach my $field ('symb','courseid','domain','username') {  
     $result .= '<input type="hidden" name="grade_'.$field.  
  '" value="'.$env{"form.grade_$field"}.'" />'."\n";  
  }  
     }  
     my $version=&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>';
  $result.=&add_request_another_attempt_button();   if (!$previous) {
       $result.=&add_request_another_attempt_button();
    }
     }      }
     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>';
Line 226  sub start_Task { Line 280  sub start_Task {
  }   }
     } elsif ( ($target eq 'grade' && $env{'form.webgrade'}) ||      } elsif ( ($target eq 'grade' && $env{'form.webgrade'}) ||
       $target eq 'webgrade') {        $target eq 'webgrade') {
    my $webgrade='yes';
  if ($target eq 'webgrade') {   if ($target eq 'webgrade') {
     $result.=$head_tag_start.$body_tag_start.$form_tag_start;      $result.=$head_tag_start.$body_tag_start;
     $result.='<input type="hidden" name="webgrade" value="yes" />';      $result.='<br />Review'.&show_queue('reviewqueue');
     $result.=&show_queue();      $result.='<br />Grade'.&show_queue('gradingqueue');
  }   }
  my $todo=&get_from_queue();   # FIXME Blast! still need to reorg this, need to reshow the
           #       queue being reviewed once done with the grade pass...
           #       Hrrm, vaildation pass should perhaps say 'not_locked'
           #       perhaps do a search if there is a key that is mine and if
           #       there isn't reshow the queue....
    my ($todo,$status_code)=&get_key_todo($target);
   
    &Apache::lonnet::logthis("got todo -$todo- stat -$status_code-");
  if ($todo) {   if ($todo) {
     &setup_env_for_other_user($todo,$safeeval);      &setup_env_for_other_user($todo,$safeeval);
     my ($symb,$uname,$udom)=&decode_queue_key($todo);      my ($symb,$uname,$udom)=&decode_queue_key($todo);
     $result.="\n".'<table><tr><td>Found '.      $result.="\n".'<table><tr><td>Found '.
  &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>';   &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>';
     $result.='<input type="hidden" name="gradingkey" value="'.      $form_tag_start.=
    '<input type="hidden" name="gradingkey" value="'.
  &Apache::lonnet::escape($todo).'" />';   &Apache::lonnet::escape($todo).'" />';
     $Apache::bridgetask::queue_key=$todo;      $Apache::bridgetask::queue_key=$todo;
     &Apache::structuretags::initialize_storage();      &Apache::structuretags::initialize_storage();
     &Apache::lonhomework::showhash(%Apache::lonhomework::history);      &Apache::lonhomework::showhash(%Apache::lonhomework::history);
     $result.="\n".'<table width="100%" style="width:100%" border="1">';      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 {   } else {
     if ($target eq 'webgrade') {      if ($target eq 'webgrade') {
  $result.="\n".   $result.="\n";
     '<table><tr><td>No user to be graded.</td></tr></table>';   if      ($status_code eq 'stop') {
       $result.='<b>'.&mt("Stopped grading.").'</b>';
    } elsif ($status_code eq 'lock_failed') {
       $result.='<b>'.&mt("Failed to lock the request record.").'</b>';
    } elsif ($status_code eq 'unlock') {
       $result.='<b>'.&mt("Unlocked the requested record.").'</b>';
       $result.=&show_queue($env{'form.queue'},1);
    } elsif ($status_code eq 'show_list') {
       $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);      my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);
  }   }
    if ($target eq 'webgrade' && defined($env{'form.queue'})) {
       $result.=$form_tag_start;
       $result.='<input type="hidden" name="webgrade" value="'.
    $webgrade.'" />';
       $result.='<input type="hidden" name="queue" value="'.
    $env{'form.queue'}.'" />';
    }
     } else {      } else {
  # page_start returned a starting result, delete it if we don't need it   # page_start returned a starting result, delete it if we don't need it
  $result = '';   $result = '';
Line 257  sub start_Task { Line 346  sub start_Task {
     return $result;      return $result;
 }  }
   
   sub get_key_todo {
       my ($target)=@_;
       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'};
   
       if (!defined($queue)) {
    $env{'form.queue'}=$queue='gradingqueue';
       }
   
       my $gradingkey=&Apache::lonnet::unescape($env{'form.gradingkey'});
   
       if (defined($env{'form.queue'}) && defined($env{'form.gradingkey'})
    && !defined($env{'form.gradingaction'}) 
    && $env{'form.queuemode'} eq 'selected') {
   
    my $who=&queue_key_locked($queue,$gradingkey);
    my $me=$env{'user.name'}.'@'.$env{'user.domain'};
    if ($who eq $me) {
       &Apache::lonxml::debug("Found a key was given to me");
       return ($gradingkey,'selected');
    } else {
       return (undef,'show_list');
    }
   
       }
   
       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);
    } 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');
    }
       }
   
       if ($env{'form.queuemode'} ne 'selected') {
    # don't get something new from the queue if they hit the stop button
       if (!($env{'form.stop'} && $target eq 'webgrade') 
       && !$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 {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $result='';      my $result='';
     my $status=$Apache::inputtags::status['-1'];      my $status=$Apache::inputtags::status['-1'];
     my $version=&get_version();      my ($version,$previous)=&get_version();
     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||      if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
  $target eq 'tex') {   $target eq 'tex') {
  if (   if (
Line 269  sub end_Task { Line 430  sub end_Task {
     ($target eq 'answer') || ($target eq 'tex')      ($target eq 'answer') || ($target eq 'tex')
    ) {     ) {
     if ($target eq 'web') {      if ($target eq 'web') {
  if ($status eq 'CAN_ANSWER') {   if ($status eq 'CAN_ANSWER' && !$previous) {
     $result.="\n".'<table border="1">'.      $result.="\n".'<table border="1">'.
  &Apache::inputtags::file_selector($version,   &Apache::inputtags::file_selector("$version.0",
   "bridgetask","*",    "bridgetask","*",
   'portfolioonly').    'portfolioonly').
   "</table>";    "</table>";
Line 282  sub end_Task { Line 443  sub end_Task {
  $result.=&Apache::lonxml::xmlend().'</html>';   $result.=&Apache::lonxml::xmlend().'</html>';
     }      }
  }   }
  if ($target eq 'grade' && !$env{'form.webgrade'}) {   if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {
     my $award='SUBMITTED';      my $award='SUBMITTED';
     &Apache::essayresponse::file_submission('0','bridgetask',      &Apache::essayresponse::file_submission("$version.0",'bridgetask',
     'portfiles',\$award);      'portfiles',\$award);
     if ($award eq 'SUBMITTED' &&      if ($award eq 'SUBMITTED' &&
  $Apache::lonhomework::results{"resource.$version.bridgetask.portfiles"}) {   $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}) {
  $Apache::lonhomework::results{"resource.$version.tries"}=   $Apache::lonhomework::results{"resource.0.tries"}=
     1+$Apache::lonhomework::history{"resource.$version.tries"};      $Apache::lonhomework::results{"resource.$version.0.tries"}=
       1+$Apache::lonhomework::history{"resource.$version.0.tries"};
   
    $Apache::lonhomework::results{"resource.0.award"}=
       $Apache::lonhomework::results{"resource.$version.0.award"}=
       $award;
     }      }
     $Apache::lonhomework::results{"resource.$version.award"}=$award;  
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
     if ($award eq 'SUBMITTED') {      if ($award eq 'SUBMITTED') {
  &add_to_queue();   &add_to_queue('gradingqueue',$Apache::inputtags::slot_name);
     }      }
  }   }
  if ($target eq 'grade' && $env{'form.webgrade'}) {   if ($target eq 'grade' && $env{'form.webgrade'} eq 'yes') {
     my $optional_required=      my $optional_required=
  &Apache::lonxml::get_param('OptionalRequired',$parstack,   &Apache::lonxml::get_param('OptionalRequired',$parstack,
    $safeeval);     $safeeval);
Line 330  sub end_Task { Line 495  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';
  &move_to_review_queue();   if ($env{'form.queue'} eq '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';
  &check_queue_unlock();   # FIXME if in review queue need to move back to grading queue
    if ($env{'form.queue'} eq 'reviewqueue') {
       &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();   &remove_from_queue($env{'form.queue'});
     } 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();   &remove_from_queue($env{'form.queue'});
     }      }
     $Apache::lonhomework::results{"resource.status"}=      $Apache::lonhomework::results{"resource.status"}=
  $Apache::lonhomework::results{"resource.$version.status"};   $Apache::lonhomework::results{"resource.$version.status"};
     if (defined($Apache::lonhomework::results{"resource.$version.awarded"})) {      if (defined($Apache::lonhomework::results{"resource.$version.0.awarded"})) {
  $Apache::lonhomework::results{"resource.0.award"}=   $Apache::lonhomework::results{"resource.0.award"}=
     $Apache::lonhomework::results{"resource.$version.award"};      $Apache::lonhomework::results{"resource.$version.award"};
  $Apache::lonhomework::results{"resource.0.awarded"}=   $Apache::lonhomework::results{"resource.0.awarded"}=
Line 379  sub end_Task { Line 555  sub end_Task {
     return $result;      return $result;
 }  }
   
 sub move_to_review_queue {  sub move_between_queues {
     &Apache::lonxml::debug("Want to move");      my ($src_queue,$dest_queue)=@_;
       my $cur_data=&get_queue_data($src_queue);
       if (!$cur_data) { return 'not_exist'; }
       my $result=&add_to_queue($dest_queue,$cur_data->[0]);
       if ($result ne 'ok') {
    return $result;
       }
       &check_queue_unlock($src_queue);
       return &remove_from_queue($src_queue);
 }  }
   
 sub check_queue_unlock {  sub check_queue_unlock {
     &Apache::lonxml::debug("Want to unlock?");      my ($queue,$key,$allow_not_me)=@_;
       my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
       if (!defined($key)) {
    $key="$symb\0queue\0$uname\@$udom";
       }
       my $cnum=$env{'course.'.$cid.'.num'};
       my $cdom=$env{'course.'.$cid.'.domain'};
       my $me=$env{'user.name'}.'@'.$env{'user.domain'};
       my $who=&queue_key_locked($queue,$key,$cdom,$cnum);
       if  ($who eq $me) {
    return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);
       } elsif ($allow_not_me) {
    &Apache::lonxml::debug("unlocking $who by $me");
    return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);
       }
       return 'not_owner';
 }  }
   
 sub remove_from_queue {  sub remove_from_queue {
     &Apache::lonxml::debug("Want to remove. Done?");      my ($queue)=@_;
       my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
       my $cnum=$env{'course.'.$cid.'.num'};
       my $cdom=$env{'course.'.$cid.'.domain'};
       my $key="$symb\0queue\0$uname\@$udom";
       my @keys=($key,"$key\0locked");
       return &Apache::lonnet::del($queue,\@keys,$cdom,$cnum);
 }  }
   
 sub setup_env_for_other_user {  sub setup_env_for_other_user {
     my ($queue_key,$safeeval)=@_;      my ($queue_key,$safeeval)=@_;
     my ($symb,$uname,$udom)=&decode_queue_key($queue_key);      my ($symb,$uname,$udom)=&decode_queue_key($queue_key);
       &Apache::lonxml::debug("setup_env for $queue_key");
     $env{'form.grade_symb'}=$symb;      $env{'form.grade_symb'}=$symb;
     $env{'form.grade_domain'}=$udom;      $env{'form.grade_domain'}=$udom;
     $env{'form.grade_username'}=$uname;      $env{'form.grade_username'}=$uname;
Line 401  sub setup_env_for_other_user { Line 607  sub setup_env_for_other_user {
     &Apache::lonxml::initialize_rndseed($safeeval);      &Apache::lonxml::initialize_rndseed($safeeval);
 }  }
   
   sub get_queue_data {
       my ($queue)=@_;
       my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
       my $cnum=$env{'course.'.$cid.'.num'};
       my $cdom=$env{'course.'.$cid.'.domain'};
       my $todo="$symb\0queue\0$uname\@$udom";
       my ($key,$value)=&Apache::lonnet::get($queue,[$todo],$cdom,$cnum);
       if ($key eq $todo && ref($value)) {
    return $value;
       }
       return undef;
   }
   
 sub add_to_queue {  sub add_to_queue {
       my ($queue,$slot_name)=@_;
     my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();      my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
     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 %data;      my %data;
     $data{"$symb\0queue\0$uname\@$udom"}=[$Apache::inputtags::slot_name];      $data{"$symb\0queue\0$uname\@$udom"}=[$slot_name];
     &Apache::lonnet::put('gradingqueue',\%data,$cdom,$cnum);      return &Apache::lonnet::put($queue,\%data,$cdom,$cnum);
 }  }
   
 sub show_queue {  sub show_queue {
       my ($queue,$with_selects)=@_;
     my $result;      my $result;
     my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();      my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
     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 $regexp="^$symb\0";      my $regexp="^$symb\0";
     my %queue=&Apache::lonnet::dump('gradingqueue',$cdom,$cnum,$regexp);      my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
     $result.="\n<h3>Current Queue</h3><table><tr><th>resource</th>".      my ($tmp)=%queue;
  "<th>user</th><th>type</th><th>data</th></tr>";      if ($tmp=~/^error: 2 /) {
    return "\n<h3>Current Queue - $queue</h3><table border='1'><tr><td>Empty</td></tr></table>";
       }
       $result.="\n<h3>Current Queue - $queue </h3><table border='1'><tr>";
       if ($with_selects) { $result.="<th></th>"; }
       $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))) {
  if ($key=~/locked$/) {   if ($key=~/locked$/ && !$with_selects) {
     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><td>$title</td><td>$uname</td><td>";      $result.="<tr><td>$title</td><td>$uname</td>";
     $result.='<td>lock</td><td>'.$queue{$key}.'</td></tr>';      $result.='<td>lock</td><td>'.$queue{$key}.'</td></tr>';
  } elsif ($key=~/timestamp$/) {   } elsif ($key=~/timestamp$/ && !$with_selects) {
     my ($symb,undef) = split("\0",$key);      my ($symb,undef) = split("\0",$key);
     my $title=&Apache::lonnet::gettitle($symb);      my $title=&Apache::lonnet::gettitle($symb);
     $result.="<tr><td>$title</td><td></td><td>";      $result.="<tr><td>$title</td><td></td>";
     $result.='<td>last queue modification time</td><td>'.      $result.='<td>last queue modification time</td><td>'.
  &Apache::lonlocal::locallocaltime($queue{$key})."</td></tr>";   &Apache::lonlocal::locallocaltime($queue{$key})."</td></tr>";
  } else {   } elsif ($key!~/(timestamp|locked)$/) {
     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><td>$title</td><td>$uname</td><td>";      $result.="<tr>";
     my $slot=$queue{$key}->[0];      my $slot=$queue{$key}->[0];
     my %slot_data=&Apache::lonnet::get_slot($slot);      my %slot_data=&Apache::lonnet::get_slot($slot);
     $result.='<td>queue entry</td><td>End time: '.      if ($with_selects) {
    my $ekey=&Apache::lonnet::escape($key);
    my ($action,$description)=('select',&mt('Select'));
    if (exists($queue{"$key\0locked"})) {
       my $me=$env{'user.name'}.'@'.$env{'user.domain'};
       if ($me eq $queue{"$key\0locked"}) {
    ($action,$description)=('resume',&mt('Resume'));
       } else {
    ($action,$description)=('unlock',&mt('Unlock'));
       }
    }
    if (time > $slot_data{'endtime'}) {
       $result.=(<<FORM);
   <td>
   <form method="POST">
    <input type="hidden" name="gradingkey" value="$ekey" />
    <input type="hidden" name="queue" value="$queue" />
    <input type="hidden" name="gradingaction" value="$action" />
    <input type="hidden" name="webgrade" value="no" />
    <input type="hidden" name="queuemode" value="selected" />
    <input type="submit" name="submit" value="$description" />
   </form>
   </td>
   FORM
   
                   } else {
       $result.='<td>'.&mt("In Progress").'</td>'
    }
       }
       $result.="<td>$title</td><td>$uname</td>";
       $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 446  sub show_queue { Line 702  sub show_queue {
     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 454  sub decode_queue_key { Line 741  sub decode_queue_key {
 }  }
   
 sub queue_key_locked {  sub queue_key_locked {
     my ($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('gradingqueue',["$key\0locked"],$cdom,$cnum);   &Apache::lonnet::get($queue,["$key\0locked"],$cdom,$cnum);
     if ($key_locked eq "$key\0locked") {      if ($key_locked eq "$key\0locked") {
  return $value;   return $value;
     }      }
Line 464  sub queue_key_locked { Line 756  sub queue_key_locked {
 }  }
   
 sub pick_from_queue_data {  sub pick_from_queue_data {
     my ($check_section,$queue,$cdom,$cnum)=@_;      my ($queue,$check_section,$queuedata,$cdom,$cnum)=@_;
     foreach my $key (keys(%$queue)) {      foreach my $key (keys(%$queuedata)) {
  my ($symb,$uname,$udom)=&decode_queue_key($key);   my ($symb,$uname,$udom)=&decode_queue_key($key);
  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=$queue->{$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($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 490  sub pick_from_queue_data { Line 782  sub pick_from_queue_data {
 }  }
   
 sub find_mid_grade {  sub find_mid_grade {
     my ($symb,$cdom,$cnum)=@_;      my ($queue,$symb,$cdom,$cnum)=@_;
     my $todo=&Apache::lonnet::unescape($env{'form.gradingkey'});      my $todo=&Apache::lonnet::unescape($env{'form.gradingkey'});
     my $me=$env{'user.name'}.'@'.$env{'user.domain'};      my $me=$env{'user.name'}.'@'.$env{'user.domain'};
     if ($todo) {      if ($todo) {
  my $who=&queue_key_locked($todo,$cdom,$cnum);   my $who=&queue_key_locked($queue,$todo,$cdom,$cnum);
  if ($who eq $me) { return $todo; }   if ($who eq $me) { return $todo; }
     }      }
     my $regexp="^$symb\0.*\0locked\$";      my $regexp="^$symb\0.*\0locked\$";
     my %locks=&Apache::lonnet::dump('gradingqueue',$cdom,$cnum,$regexp);      my %locks=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
     foreach my $key (keys(%locks)) {      foreach my $key (keys(%locks)) {
  my $who=$locks{$key};   my $who=$locks{$key};
  if ($who eq $me) {   if ($who eq $me) {
Line 510  sub find_mid_grade { Line 802  sub find_mid_grade {
     return undef;      return undef;
 }  }
   
   sub lock_key {
       my ($queue,$todo)=@_;
       my $me=$env{'user.name'}.'@'.$env{'user.domain'};
       my (undef,$cid)=&Apache::lonxml::whichuser();
       my $cnum=$env{'course.'.$cid.'.num'};
       my $cdom=$env{'course.'.$cid.'.domain'};
       my $success=&Apache::lonnet::newput($queue,{"$todo\0locked"=> $me},
    $cdom,$cnum);
       &Apache::lonxml::debug("success $success $todo");
       if ($success eq 'ok') {
    return 1;
       }
       return 0;
   }
   
 sub get_from_queue {  sub get_from_queue {
       my ($queue)=@_;
     my $result;      my $result;
     my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();      my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
     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;      my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum);
     # FIXME need to find if I am 'mid grading'      &Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));
     $todo=&find_mid_grade($symb,$cdom,$cnum);  
     &Apache::lonnet::logthis("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('gradingqueue',{"$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('gradingqueue',$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($env{'request.course.sec'},\%queue,      $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},
  $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($env{'request.course.sec'},\%queue,      $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},
  $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
  my $success=&Apache::lonnet::newput('gradingqueue',   # unless someone else already picked them
     {"$todo\0locked"=>   if (!&lock_key($queue,$todo)) { next; }
  $env{'user.name'}.'@'.$env{'user.domain'}},  
    $cdom,$cnum);  
  # someone else already picked them  
  &Apache::lonnet::logthis("success $todo");  
  if ($success ne 'ok') { next; }  
  my (undef,$endtime)=   my (undef,$endtime)=
     &Apache::lonnet::get('gradingqueue',["$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
  # double check.   # double check.
  if ($endtime != $starttime) {   if ($endtime != $starttime) {
     my ($key,$value)=      my ($key,$value)=
  &Apache::lonnet::get('gradingqueue',["$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('gradingqueue',["$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 620  sub start_Dimension { Line 922  sub start_Dimension {
 }  }
   
 sub get_instance {  sub get_instance {
     #FIXME just grabbing the first one for now, need  
     #to randomly pick one until all have been seen  
     #then start repicking  
     &Apache::response::pushrandomnumber();      &Apache::response::pushrandomnumber();
     my @order=&Math::Random::random_permutation(@{$dimension{'instances'}});      my @order=&Math::Random::random_permutation(@{$dimension{'instances'}});
     return $order[0];      my $num=@order;
       my $version=&get_version();
       my $which=($version-1)%$num;
       return $order[$which];
 }  }
   
 {  {
Line 673  sub get_instance { Line 975  sub get_instance {
     '<textarea style="width:100%" rows="8" width="25" wrap="hard" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode($Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.comment"}).'</textarea>'.      '<textarea style="width:100%" rows="8" width="25" wrap="hard" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode($Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.comment"}).'</textarea>'.
     '</td>'.      '</td>'.
     '<td>'.      '<td>'.
     '<nobr><label><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').'/>Ungraded</label></nobr><br />'.      '<nobr><label><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').'/>'.&mt('Ungraded').'</label></nobr><br />'.
     '<label><input type="radio" name="HWVAL_'.$link.'" value="pass" '.($status eq 'pass' ? 'checked="checked"':'').' />Pass</label><br />'.      '<label><input type="radio" name="HWVAL_'.$link.'" value="pass" '.($status eq 'pass' ? 'checked="checked"':'').' />'.&mt('Pass').'</label><br />'.
     '<label><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />Fail</label><br />'.      '<label><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label><br />'.
     '<label><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />Review</label><br />'.      '<label><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label><br />'.
     '</td>'.      '</td>'.
     '<td>'.      '<td>'.
     '<a href="#'.$last_link.'">Prev</a><br />'.      '<a href="#'.$last_link.'">Prev</a><br />'.
     '<a href="#next_'.$link.'">Next</a><br /><br /><br />'.      '<a href="#next_'.$link.'">Next</a><br /><br /><br />'.
     '<input type="submit" name="next" value="'.      '<input type="submit" name="next" value="'.
     &mt('Done').'" /> '.      &mt('Done').'" /> '.
       '<input type="submit" name="stop" value="'.
       &mt('Stop').'" /> '.
     '</td></tr>';      '</td></tr>';
  $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();

Removed from v.1.26  
changed lines
  Added in v.1.35


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.