Diff for /loncom/homework/bridgetask.pm between versions 1.79 and 1.112

version 1.79, 2005/11/18 20:29:13 version 1.112, 2006/02/20 22:57:41
Line 60  sub initialize_bridgetask { Line 60  sub initialize_bridgetask {
 }  }
   
 sub proctor_check_auth {  sub proctor_check_auth {
     my ($slot_name,$slot)=@_;      my ($slot_name,$slot,$type)=@_;
     my $user=$env{'form.proctorname'};      my $user=$env{'form.proctorname'};
     my $domain=$env{'form.proctordomain'};      my $domain=$env{'form.proctordomain'};
           
Line 79  sub proctor_check_auth { Line 79  sub proctor_check_auth {
     $authenticated=1;      $authenticated=1;
  }   }
     }      }
     if ($authenticated) {      if ($authenticated && $type eq 'Task') {
    # increment version
  my $version=   my $version=
     $Apache::lonhomework::results{'resource.version'}=      $Apache::lonhomework::history{'resource.0.version'};
     ++$Apache::lonhomework::history{'resource.version'};   $version++;
  $Apache::lonhomework::results{"resource.$version.checkedin"}=  
     $user.'@'.$domain;   #clean out all current results
  $Apache::lonhomework::results{"resource.$version.checkedin.slot"}=  
     $slot_name;  
  foreach my $key (keys(%Apache::lonhomework::history)) {   foreach my $key (keys(%Apache::lonhomework::history)) {
     if ($key=~/^resource\.0\./) {      if ($key=~/^resource\.0\./) {
  $Apache::lonhomework::results{$key}='';   $Apache::lonhomework::results{$key}='';
     }      }
  }   }
   
    #setup new version and who did it
    $Apache::lonhomework::results{'resource.0.version'}=$version;
    $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
       $user.'@'.$domain;
    $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=
       $slot_name;
   
  return 1;   return 1;
       } elsif ($authenticated && $type eq 'problem') {
    &Apache::lonxml::debug("authed $slot_name");
    $Apache::lonhomework::results{"resource.0.checkedin"}=
       $user.'@'.$domain;
    $Apache::lonhomework::results{"resource.0.checkedin.slot"}=
       $slot_name;
     }      }
  }   }
     }      }
Line 103  sub get_version { Line 116  sub get_version {
     my ($version,$previous);      my ($version,$previous);
     if ($env{'form.previousversion'} &&       if ($env{'form.previousversion'} && 
  $env{'form.previousversion'} ne 'current' &&   $env{'form.previousversion'} ne 'current' &&
  defined($Apache::lonhomework::history{'resource.'.$env{'form.previousversion'}.'.status'})) {   defined($Apache::lonhomework::history{'resource.'.$env{'form.previousversion'}.'.0.status'})) {
  $version=$env{'form.previousversion'};   $version=$env{'form.previousversion'};
  $previous=1;   $previous=1;
     } else {      } else {
  $version=$Apache::lonhomework::history{'resource.version'};   $version=$Apache::lonhomework::history{'resource.0.version'};
  $previous=0;   $previous=0;
     }      }
     if (wantarray) {      if (wantarray) {
Line 119  sub get_version { Line 132  sub get_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 '') {      if ($Apache::lonhomework::history{'resource.0.version'} eq '') {
  return '';   return '';
     }      }
     if ($Apache::lonhomework::history{'resource.version'} < 2 &&      if ($Apache::lonhomework::history{'resource.0.version'} < 2 &&
  $status ne 'NEEDS_CHECKIN') {   $status ne 'NEEDS_CHECKIN') {
  return '';   return '';
     }      }
Line 133  sub add_previous_version_button { Line 146  sub add_previous_version_button {
     "</h3>\n";      "</h3>\n";
     }      }
     my @to_show;      my @to_show;
     foreach my $test_version (1..$Apache::lonhomework::history{'resource.version'}) {      foreach my $test_version (1..$Apache::lonhomework::history{'resource.0.version'}) {
  if (defined($Apache::lonhomework::history{'resource.'.$test_version.'.status'})) {   if (defined($Apache::lonhomework::history{'resource.'.$test_version.'.0.status'})) {
     push(@to_show,$test_version);      push(@to_show,$test_version);
  }   }
     }      }
Line 175  sub add_grading_button { Line 188  sub add_grading_button {
     $result.='<input type="hidden" name="grade_target" value="webgrade" />';      $result.='<input type="hidden" name="grade_target" value="webgrade" />';
     if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {      if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
  my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');   my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');
  $result.='<p>Specify a section: '.$sec_select.'</p>';   $result.='<table><tr>';
  $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.='<td rowspan="4">Specify a section: </td><td rowspan="4">'.$sec_select.'</td>';
    $result.='<td>'.' <input type="submit" name="reviewagrading" value="'.
       &mt("Select an entry from the grading queue:").'" /> ';
   
  $result.=' <input type="submit" name="reviewagrading" value="'.   $result.= &mt("[_1] entries, [_2] ready, [_3] being graded",$entries,$ready,$locks).' </td></tr>'."\n";
     &mt("Select an entry from the grading queue").'" /> </p>'."\n";  
   
  ($entries,$ready,$locks)=&get_queue_counts('reviewqueue');   ($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.='<tr><td>'.
  $result.=' <input type="submit" name="reviewasubmission" value="'.      ' <input type="submit" name="reviewasubmission" value="'.
     &mt("Select an entry from the review queue").'" /> </p>'."\n";      &mt("Select an entry from the review queue:").'" /> ';
  $result.=' <input type="submit" name="regradeasubmission" value="'.   $result.=&mt("[_1] entries, [_2] ready, [_3] being graded",
     &mt("Select a user to regrade.").'" /> </p>'."\n";       $entries,$ready,$locks).'</td></tr>'."\n";
     }   $result.='<tr><td> <input type="submit" name="regradeasubmission" value="'.
       &mt("List of user's grade status").'" /> </td></tr></table>'."\n";
    $result.='<p> <input type="submit" name="regradeaspecificsubmission" value="'.
       &mt("Regrade specific user:").'" />'."\n";
    $result.='<input type="text" size="12" name="gradinguser" />';
    $result.=&Apache::loncommon::select_dom_form($env{'user.domain'},
        'gradingdomain');
    $result.=' '.
       &Apache::loncommon::selectstudent_link('gradesubmission',
      'gradinguser',
      'gradingdomain');
    $result.=&Apache::loncommon::studentbrowser_javascript();
     }
     return $result;      return $result;
 }  }
   
Line 316  sub internal_location { Line 342  sub internal_location {
 sub submission_time_stamp {  sub submission_time_stamp {
     my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();      my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
     my $submissiontime;      my $submissiontime;
     my $version=$Apache::lonhomework::history{'resource.version'};      my $version=$Apache::lonhomework::history{'resource.0.version'};
     for (my $v=$Apache::lonhomework::history{'version'};$v>0;$v--) {      for (my $v=$Apache::lonhomework::history{'version'};$v>0;$v--) {
  if (defined($Apache::lonhomework::history{$v.':resource.'.$version.'.0.bridgetask.portfiles'})) {   if (defined($Apache::lonhomework::history{$v.':resource.'.$version.'.0.bridgetask.portfiles'})) {
     $submissiontime=$Apache::lonhomework::history{$v.':timestamp'};      $submissiontime=$Apache::lonhomework::history{$v.':timestamp'};
Line 324  sub submission_time_stamp { Line 350  sub submission_time_stamp {
     }      }
     my $result;      my $result;
     if ($submissiontime) {      if ($submissiontime) {
  my $slot_name=$Apache::lonhomework::history{'resource.'.$version.'.checkedin.slot'};   my $slot_name=$Apache::lonhomework::history{'resource.'.$version.'.0.checkedin.slot'};
  my %slot=&Apache::lonnet::get_slot($slot_name);   my %slot=&Apache::lonnet::get_slot($slot_name);
  my $diff = $slot{'endtime'} - $submissiontime;   my $diff = $slot{'endtime'} - $submissiontime;
  my ($color,$when)=('#FF6666','after');   my ($color,$when)=('#FF6666','after');
Line 349  sub webgrade_standard_info { Line 375  sub webgrade_standard_info {
     my ($version)=&get_version();      my ($version)=&get_version();
     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/';
     my $file_list="<ul>\n";      my $file_list="<ul class=\"handininfo\">\n";
     foreach my $partial_file (split(',',$Apache::lonhomework::history{"resource.$version.0.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;
  $file=~s|/+|/|g;   $file=~s|/+|/|g;
  &Apache::lonnet::allowuploaded('/adm/bridgetask',$file);   &Apache::lonnet::allowuploaded('/adm/bridgetask',$file);
  $file_list.='<li><nobr><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.   $file_list.='<li><nobr><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.
     &Apache::loncommon::icon($file).'" border=0"> '.$file.      &Apache::loncommon::icon($file).'" border="0"> '.$file.
     '</a></nobr></li>'."\n";      '</a></nobr></li>'."\n";
     }      }
     $file_list.="</ul>\n";      $file_list.="</ul>\n";
Line 365  sub webgrade_standard_info { Line 391  sub webgrade_standard_info {
        );         );
                 
     my $result=<<INFO;      my $result=<<INFO;
 <div class="handininfo">    <div class="maincontrols">
   <input type="submit" name="next" value="$lt{'done'}" />      <input type="submit" name="next" value="$lt{'done'}" />
   <input type="submit" name="stop" value="$lt{'stop'}" />      <input type="submit" name="stop" value="$lt{'stop'}" />
     </div>
   $file_list    $file_list
 </div>  
 INFO  INFO
     return $result;      return $result;
 }  }
   
 sub start_Task {  sub start_Task {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
     my ($status,$accessmsg,$slot);      my ($status,$accessmsg,$slot);
     if ($target ne 'webgrade') {      if ($target ne 'webgrade') {
Line 400  sub start_Task { Line 426  sub start_Task {
     $body_tag_start.=$uri.'">'.&add_grading_button()."</form>";      $body_tag_start.=$uri.'">'.&add_grading_button()."</form>";
     my $symb=&Apache::lonnet::symbread();      my $symb=&Apache::lonnet::symbread();
     if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {      if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
  $body_tag_start.='<form method="POST" action="/adm/slotrequest">'.   $body_tag_start.='<form method="POST" name="slotrequest" action="/adm/slotrequest">'.
     '<input type="hidden" name="symb" value="'.$symb.'" />'.      '<input type="hidden" name="symb" value="'.$symb.'" />'.
     '<input type="hidden" name="command" value="showslots" />'.      '<input type="hidden" name="command" value="showslots" />'.
     '<input type="submit" name="requestattempt" value="'.      '<input type="submit" name="requestattempt" value="'.
     &mt('Show Slot list').'" />'.      &mt('Show Slot list').'" />'.
     '</form>';      '</form>';
    my $target_id = 
       &Apache::lonstathelpers::make_target_id({symb => $symb,
        part => '0'});
    $body_tag_start.='<form method="POST" name="gradingstatus" action="/adm/statistics">'.
       '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.
       '<input type="hidden" name="reportSelected" value="grading_analysis" />'.
       '<input type="submit" name="grading" value="'.
       &mt('Show Grading Status').'" />'.
       '</form>';
     }      }
  }   }
     }      }
Line 416  sub start_Task { Line 451  sub start_Task {
  $target eq 'tex') {   $target eq 'tex') {
  my ($version,$previous)=&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_slot_access('0','Task');
  push(@Apache::inputtags::status,$status);   push(@Apache::inputtags::status,$status);
  $Apache::inputtags::slot_name=$slot_name;   $Apache::inputtags::slot_name=$slot_name;
  my $expression='$external::datestatus="'.$status.'";';   my $expression='$external::datestatus="'.$status.'";';
  $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$version.solved"}.'";';   $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$version.0.solved"}.'";';
  &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 (!&show_task($status,$previous)) {   if (!&show_task($status,$previous)) {
     my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);      my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);
     if ( $target eq "web" ) {      if ( $target eq "web" ) {
  $result.= $head_tag_start.'</head>'.$body_tag_start;   $result.= $head_tag_start.'</head>'.$body_tag_start;
  if ($env{'request.state'} eq 'construct') {   if ($env{'request.state'} eq 'construct') {
Line 470  DONESCREEN Line 505  DONESCREEN
  }   }
     } 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)) {      if(&proctor_check_auth($slot_name,$slot,'Task')
          && defined($Apache::inputtags::slot_name)) {
  my $result=&add_to_queue('gradingqueue',   my $result=&add_to_queue('gradingqueue',
  $Apache::inputtags::slot_name);   [$Apache::inputtags::slot_name]);
  &Apache::lonxml::debug("add_to_queue said $result");   &Apache::lonxml::debug("add_to_queue said $result");
     }      }
  }   }
Line 492  DONESCREEN Line 528  DONESCREEN
       $target eq 'webgrade') {        $target eq 'webgrade') {
  my $webgrade='yes';   my $webgrade='yes';
  if ($target eq 'webgrade') {   if ($target eq 'webgrade') {
     $result.=$head_tag_start.$body_tag_start;      $result.=$head_tag_start.'</head>'.$body_tag_start;
     #$result.='<br />Review'.&show_queue('reviewqueue');      #$result.='<br />Review'.&show_queue('reviewqueue');
     #$result.='<br />Grade'.&show_queue('gradingqueue');      #$result.='<br />Grade'.&show_queue('gradingqueue');
  }   }
Line 501  DONESCREEN Line 537  DONESCREEN
         #       Hrrm, vaildation pass should perhaps say 'not_locked'          #       Hrrm, vaildation pass should perhaps say 'not_locked'
         #       perhaps do a search if there is a key that is mine and if          #       perhaps do a search if there is a key that is mine and if
         #       there isn't reshow the queue....          #       there isn't reshow the queue....
  my ($todo,$status_code)=&get_key_todo($target);   my ($todo,$status_code,$msg)=&get_key_todo($target);
   
  if ($todo) {   if ($todo) {
     &setup_env_for_other_user($todo,$safeeval);      &setup_env_for_other_user($todo,$safeeval);
Line 514  DONESCREEN Line 550  DONESCREEN
     $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);
     if ($target eq 'webgrade') {      if ($target eq 'webgrade' && $status_code eq 'selected') {
  #$result.='<br />After -'.&show_queue($env{'form.queue'});   $form_tag_start.=
  $result.="\n".'<table width="100%" style="width:100%" border="1">';      '<input type="hidden" name="queuemode" value="selected" />';
  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";
    my $back='<p><a href="/adm/flip?postdata=return:">'.
       &mt('Return to resource').'</a></p>';
  if      ($status_code eq 'stop') {   if      ($status_code eq 'stop') {
     $result.='<b>'.&mt("Stopped grading.").'</b>';      $result.='<b>'.&mt("Stopped grading.").'</b>'.$back;
  } elsif ($status_code eq 'lock_failed') {   } elsif ($status_code eq 'lock_failed') {
     $result.='<b>'.&mt("Failed to lock the request record.").'</b>';      $result.='<b>'.&mt("Failed to lock the requested record.")
    .'</b>'.$back;
  } elsif ($status_code eq 'unlock') {   } elsif ($status_code eq 'unlock') {
     $result.='<b>'.&mt("Unlocked the requested record.").'</b>';      $result.='<b>'.&mt("Unlocked the requested record.")
    .'</b>'.$back;
     $result.=&show_queue($env{'form.queue'},1);      $result.=&show_queue($env{'form.queue'},1);
  } elsif ($status_code eq 'show_list') {   } elsif ($status_code eq 'show_list') {
     $result.=&show_queue($env{'form.queue'},1);      $result.=&show_queue($env{'form.queue'},1);
  } elsif ($status_code eq 'select_user') {   } elsif ($status_code eq 'select_user') {
     $result.=&select_user();      $result.=&select_user();
    } elsif ($status_code eq 'unable') {
       $result.='<b>'.&mt("Unable to aqcuire a user to grade.").'</b>'.$back;
    } elsif ($status_code eq 'not_allowed') {
       $result.='<b>'.&mt('Not allowed to grade the requested user.').' '.$msg.'</b>'.$back;
  } else {   } else {
     $result.='<b>'.&mt("No user to be graded.").'</b>';      $result.='<b>'.&mt("No user to be graded.").'</b>'.$back;
  }   }
     }      }
     $webgrade='no';      $webgrade='no';
     my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);      my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);
  }   }
  if ($target eq 'webgrade' && defined($env{'form.queue'})) {   if ($target eq 'webgrade' && defined($env{'form.queue'})) {
     if ($webgrade eq 'yes') {      if ($webgrade eq 'yes') {
Line 566  DONESCREEN Line 606  DONESCREEN
     }      }
     if ($webgrade eq 'yes') { $result.=&webgrade_standard_info(); }      if ($webgrade eq 'yes') { $result.=&webgrade_standard_info(); }
  }   }
    if ($target eq 'webgrade') {
       $result.="\n".'<div id="criterialist">';
    }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.   $result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
     &Apache::structuretags::problem_edit_header();      &Apache::structuretags::problem_edit_header();
Line 602  sub get_key_todo { Line 645  sub get_key_todo {
  return (undef,'select_user');   return (undef,'select_user');
     }      }
   
   
       my $me=$env{'user.name'}.'@'.$env{'user.domain'};
   
       #need to try both queues..
       if (defined($env{'form.regradeaspecificsubmission'}) &&
    defined($env{'form.gradinguser'})               &&
    defined($env{'form.gradingdomain'})               ) {
    my ($symb,$cid)=&Apache::lonxml::whichuser();
    my $cnum  = $env{'course.'.$cid.'.num'};
    my $cdom  = $env{'course.'.$cid.'.domain'};
    my $uname = $env{'form.gradinguser'};
    my $udom  = $env{'form.gradingdomain'};
   
    my $gradingkey=&encode_queue_key($symb,$udom,$uname);
   
    my $queue;
   
    if      (&in_queue('gradingqueue',$symb,$cdom,$cnum,$udom,$uname)) {
       $env{'form.queue'} = $queue = 'gradingqueue';
    } elsif (&in_queue('reviewqueue' ,$symb,$cdom,$cnum,$udom,$uname)) {
       $env{'form.queue'} = $queue = 'reviewqueue';
    }
   
    if (!$queue) {
       $env{'form.queue'} = $queue = 'none';
       #not queued so doing either a re or pre grade
       return ($gradingkey);
    }
   
    my $who=&queue_key_locked($queue,$gradingkey);
    if ($who eq $me) {
       #already have the lock
       $env{'form.gradingkey'}=&Apache::lonnet::escape($gradingkey);
       return ($gradingkey);
    }
   
    if (!defined($who)) {
       if (&lock_key($queue,$gradingkey)) {
    return ($gradingkey);
       } else {
    return (undef,'lock_failed');
       }
    }
   
    #otherwise (defined($who) && $who ne $me) some else has it...
    return (undef,'not_allowed',
    &mt('Another user ([_1]) currently has the record for [_2] locked.',
       $who,$env{'form.gradinguser'}.'@'.$env{'form.gradingdomain'}));
       }
   
   
     my $queue=$env{'form.queue'};      my $queue=$env{'form.queue'};
   
     if (!defined($queue)) {      if (!defined($queue)) {
Line 629  sub get_key_todo { Line 723  sub get_key_todo {
  && $env{'form.queuemode'} eq 'selected') {   && $env{'form.queuemode'} eq 'selected') {
   
  my $who=&queue_key_locked($queue,$gradingkey);   my $who=&queue_key_locked($queue,$gradingkey);
  my $me=$env{'user.name'}.'@'.$env{'user.domain'};  
  if ($who eq $me) {   if ($who eq $me) {
     &Apache::lonxml::debug("Found a key was given to me");      &Apache::lonxml::debug("Found a key was given to me");
     return ($gradingkey,'selected');      return ($gradingkey,'selected');
Line 671  sub get_key_todo { Line 764  sub get_key_todo {
     }      }
     return (undef,undef)      return (undef,undef)
 }  }
   
   sub minimize_storage {
       foreach my $key (keys(%Apache::lonhomework::results)) {
    if ($key =~ /regrader$/) { next; }
    if ($Apache::lonhomework::results{$key} eq
       $Apache::lonhomework::history{$key}) {
       delete($Apache::lonhomework::results{$key});
    }
       }
   }
   
 sub end_Task {  sub end_Task {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $result='';      my $result='';
Line 706  sub end_Task { Line 810  sub end_Task {
 DONEBUTTON  DONEBUTTON
                 }                  }
  if (&show_task($status,$previous) &&   if (&show_task($status,$previous) &&
     $Apache::lonhomework::history{"resource.$version.status"} =~ /^(pass|fail)$/) {      $Apache::lonhomework::history{"resource.$version.0.status"} =~ /^(pass|fail)$/) {
     my $bt_status=$Apache::lonhomework::history{"resource.$version.status"};      my $bt_status=$Apache::lonhomework::history{"resource.$version.0.status"};
     my $title=&Apache::lonnet::gettitle();      my $title=&Apache::lonnet::gettitle();
     my %slot=&Apache::lonnet::get_slot($Apache::inputtags::slot_name);  
       my $slot_name=
    $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};
       my %slot=&Apache::lonnet::get_slot($slot_name);
     my $start_time=      my $start_time=
  &Apache::lonlocal::locallocaltime($slot{'starttime'});   &Apache::lonlocal::locallocaltime($slot{'starttime'});
   
     my $status;      my $status = "\n<div class='$bt_status'>\n";
     $status.="\n<div class='$bt_status'>\n";  
           
     if ($bt_status eq 'pass')  {      if ($bt_status eq 'pass')  {
  $status.='<h2>You passed the '.$title.' given on '.   $status.='<h2>You passed the '.$title.' given on '.
     $start_time.'.</h2>';      $start_time.'</h2>';
     }      }
     if ($bt_status eq 'fail')  {      if ($bt_status eq 'fail')  {
  $status.='<h2>You did not pass the '.$title.' given on '.   $status.='<h2>You did not pass the '.$title.' given on '.
     $start_time.'.</h2>';      $start_time.'</h2>';
  if (!$previous) {   if (!$previous) {
     $status.=&add_request_another_attempt_button();      $status.=&add_request_another_attempt_button();
  }   }
Line 734  DONEBUTTON Line 840  DONEBUTTON
  if ($Apache::bridgetask::dimensionmandatory{$dim_id}   if ($Apache::bridgetask::dimensionmandatory{$dim_id}
     eq 'N') {      eq 'N') {
     $opt_count++;      $opt_count++;
     if ($Apache::lonhomework::history{"resource.$version.$dim_id.status"} eq 'pass') {      if ($Apache::lonhomework::history{"resource.$version.0.$dim_id.status"} eq 'pass') {
  $opt_passed++;   $opt_passed++;
     }      }
  } else {   } else {
Line 744  DONEBUTTON Line 850  DONEBUTTON
     my $opt_req=&Apache::lonxml::get_param('OptionalRequired',      my $opt_req=&Apache::lonxml::get_param('OptionalRequired',
  $parstack,$safeeval);   $parstack,$safeeval);
     if ($opt_req !~ /\S/) { $opt_req='0'; }      if ($opt_req !~ /\S/) { $opt_req='0'; }
     $status.="\n<p>".&mt('You needed to pass all of the [_1]  mandatory components and [_2] of the [_3] optional components on the bridge task.',$man_count,$opt_req,$opt_count)."</p></div>\n";      $status.="\n<p>".&mt('You needed to pass all of the [_1]  mandatory components and [_2] of the [_3] optional components, of which you passed [_4].',$man_count,$opt_req,$opt_count,$opt_passed)."</p></div>\n";
   
     my $internal_location=&internal_location();      my $internal_location=&internal_location();
     $result=~s/\Q$internal_location\E/$status/;      $result=~s/\Q$internal_location\E/$status/;
Line 775  DONEBUTTON Line 881  DONEBUTTON
     }      }
     &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('gradingqueue',$Apache::inputtags::slot_name);   && defined($Apache::inputtags::slot_name)) {
    &add_to_queue('gradingqueue',[$Apache::inputtags::slot_name]);
     }      }
  } elsif ($Apache::lonhomework::results{'INTERNAL_store'}) {   } elsif ($Apache::lonhomework::results{'INTERNAL_store'}) {
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
Line 792  DONEBUTTON Line 899  DONEBUTTON
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
     foreach my $dim_id (@Apache::bridgetask::dimensionlist) {      foreach my $dim_id (@Apache::bridgetask::dimensionlist) {
  my $status=   my $status=
     $Apache::lonhomework::results{"resource.$version.$dim_id.status"};      $Apache::lonhomework::results{"resource.$version.0.$dim_id.status"};
  my $mandatory=   my $mandatory=
     ($Apache::bridgetask::dimensionmandatory{$dim_id} ne 'N');      ($Apache::bridgetask::dimensionmandatory{$dim_id} ne 'N');
  if ($status eq 'pass') {   if ($status eq 'pass') {
Line 811  DONEBUTTON Line 918  DONEBUTTON
  $mandatory_failed++;   $mandatory_failed++;
     }      }
     &Apache::lonxml::debug("all dim ".join(':',@Apache::bridgetask::dimensionlist)."results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");      &Apache::lonxml::debug("all dim ".join(':',@Apache::bridgetask::dimensionlist)."results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
     $Apache::lonhomework::results{'resource.grader'}=      $Apache::lonhomework::results{'resource.0.regrader'}=
  $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.0.status"}='review';
  if ($env{'form.queue'} eq 'reviewqueue') {   if ($env{'form.queue'} eq 'reviewqueue') {
     &check_queue_unlock($env{'form.queue'});      &check_queue_unlock($env{'form.queue'});
     &Apache::lonxml::debug(" still needs review not changing status.");      &Apache::lonxml::debug(" still needs review not changing status.");
Line 822  DONEBUTTON Line 929  DONEBUTTON
     &move_between_queues($env{'form.queue'},'reviewqueue');      &move_between_queues($env{'form.queue'},'reviewqueue');
  }   }
     } elsif ($ungraded) {      } elsif ($ungraded) {
  $Apache::lonhomework::results{"resource.$version.status"}='ungraded';   $Apache::lonhomework::results{"resource.$version.0.status"}='ungraded';
  if ($env{'form.queue'} eq 'reviewqueue' ||   if ($env{'form.queue'} eq 'reviewqueue' ||
     $env{'form.queue'} eq 'none' ) {      $env{'form.queue'} eq 'none' ) {
     &Apache::lonxml::debug("moving back.");      &Apache::lonxml::debug("moving back.");
Line 831  DONEBUTTON Line 938  DONEBUTTON
     &check_queue_unlock($env{'form.queue'});      &check_queue_unlock($env{'form.queue'});
  }   }
     } elsif ($mandatory_failed) {      } elsif ($mandatory_failed) {
  $Apache::lonhomework::results{"resource.$version.status"}='fail';   $Apache::lonhomework::results{"resource.$version.0.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';
Line 849  DONEBUTTON Line 956  DONEBUTTON
        ["$version.0.bridgetask"]);         ["$version.0.bridgetask"]);
  }   }
     } else {      } else {
  $Apache::lonhomework::results{"resource.$version.status"}='pass';   $Apache::lonhomework::results{"resource.$version.0.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';
Line 866  DONEBUTTON Line 973  DONEBUTTON
        ["$version.0.bridgetask"]);         ["$version.0.bridgetask"]);
  }   }
     }      }
     $Apache::lonhomework::results{"resource.status"}=      $Apache::lonhomework::results{"resource.0.status"}=
  $Apache::lonhomework::results{"resource.$version.status"};   $Apache::lonhomework::results{"resource.$version.0.status"};
     if (defined($Apache::lonhomework::results{"resource.$version.0.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.0.award"};      $Apache::lonhomework::results{"resource.$version.0.award"};
Line 876  DONEBUTTON Line 983  DONEBUTTON
  $Apache::lonhomework::results{"resource.0.solved"}=   $Apache::lonhomework::results{"resource.0.solved"}=
     $Apache::lonhomework::results{"resource.$version.0.solved"};      $Apache::lonhomework::results{"resource.$version.0.solved"};
     }      }
       &minimize_storage();
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
  }   }
     } elsif ($target eq 'webgrade') {      } elsif ($target eq 'webgrade') {
  $result.="</table>\n<hr />";   $result.="</div>\n<hr />";
  #$result.='<input type="submit" name="next" value="'.   #$result.='<input type="submit" name="next" value="'.
  #    &mt('Save &amp; Next').'" /> ';   #    &mt('Save &amp; Next').'" /> ';
  #$result.='<input type="submit" name="end" value="'.   #$result.='<input type="submit" name="end" value="'.
Line 913  sub move_between_queues { Line 1021  sub move_between_queues {
     } else {      } else {
  $cur_data = ['none'];   $cur_data = ['none'];
     }      }
     my $result=&add_to_queue($dest_queue,$cur_data->[0]);      my $result=&add_to_queue($dest_queue,[$cur_data->[0]]);
     if ($result ne 'ok') {      if ($result ne 'ok') {
  return $result;   return $result;
     }      }
Line 941  sub check_queue_unlock { Line 1049  sub check_queue_unlock {
     return 'not_owner';      return 'not_owner';
 }  }
   
   sub in_queue {
       my ($queue,$symb,$cdom,$cnum,$udom,$uname)=@_;
       if ($queue eq 'none') { return 0; }
       if (!defined($symb) || !defined($cdom) || !defined($cnum)
    || !defined($udom) || !defined($uname)) {
    ($symb,my $cid,$udom,$uname)=&Apache::lonxml::whichuser();
    $cnum=$env{'course.'.$cid.'.num'};
    $cdom=$env{'course.'.$cid.'.domain'};
       }
   
       my $key=&encode_queue_key($symb,$udom,$uname);
       my %results = &Apache::lonnet::get($queue,[$key],$cdom,$cnum);
   
       if (defined($results{$key})) {
    return 1;
       }
       return 0;
   }
   
 sub remove_from_queue {  sub remove_from_queue {
     my ($queue)=@_;      my ($queue,$symb,$cdom,$cnum,$udom,$uname)=@_;
     if ($queue eq 'none') { return 'ok'; }      if ($queue eq 'none') { return 'ok'; }
     my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();      if (!defined($symb) || !defined($cdom) || !defined($cnum)
     my $cnum=$env{'course.'.$cid.'.num'};   || !defined($udom) || !defined($uname)) {
     my $cdom=$env{'course.'.$cid.'.domain'};   ($symb,my $cid,$udom,$uname)=&Apache::lonxml::whichuser();
     my $key="$symb\0queue\0$uname\@$udom";   $cnum=$env{'course.'.$cid.'.num'};
    $cdom=$env{'course.'.$cid.'.domain'};
       }
       if (!&in_queue($queue,$symb,$cdom,$cnum,$udom,$uname)) {
    return 'ok';
       }
       my $key=&encode_queue_key($symb,$udom,$uname);
     my @keys=($key,"$key\0locked");      my @keys=($key,"$key\0locked");
     return &Apache::lonnet::del($queue,\@keys,$cdom,$cnum);      return &Apache::lonnet::del($queue,\@keys,$cdom,$cnum);
 }  }
Line 976  sub get_queue_data { Line 1109  sub get_queue_data {
     return undef;      return undef;
 }  }
   
   
 sub check_queue_for_key {  sub check_queue_for_key {
     my ($cid,$queue,$todo)=@_;      my ($cdom,$cnum,$queue,$todo)=@_;
     my $cnum=$env{'course.'.$cid.'.num'};  
     my $cdom=$env{'course.'.$cid.'.domain'};  
     my %results=      my %results=
  &Apache::lonnet::get($queue,[$todo,"$todo\0locked"],$cdom,$cnum);   &Apache::lonnet::get($queue,[$todo,"$todo\0locked"],$cdom,$cnum);
           
Line 987  sub check_queue_for_key { Line 1120  sub check_queue_for_key {
  if (defined($results{"$todo\0locked"})) {   if (defined($results{"$todo\0locked"})) {
     return 'locked';      return 'locked';
  }   }
  my $slot=$results{$todo}->[0];   my $slot;
  my %slot_data=&Apache::lonnet::get_slot($slot);   if (ref($results{$todo}) eq 'ARRAY')  {
  if ($slot_data{'endtime'} > time) {       $slot = $results{$todo}[0];
     return 'in_progress';   } elsif (ref($results{$todo}) eq 'HASH')  {
       $slot = $results{$todo}{'slot'};
    }
    if (defined($slot)) {
       my %slot_data=&Apache::lonnet::get_slot($slot);
       if ($slot_data{'endtime'} > time) { 
    return 'in_progress';
       }
  }   }
  return 'enqueued';   return 'enqueued';
     }      }
Line 998  sub check_queue_for_key { Line 1138  sub check_queue_for_key {
 }  }
   
 sub add_to_queue {  sub add_to_queue {
     my ($queue,$slot_name)=@_;      my ($queue,$user_data)=@_;
     if ($queue eq 'none') { return 'ok'; }      if ($queue eq 'none') { return 'ok'; }
     my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();      my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
       if (!$cid || $env{'request.state'} eq 'construct') {
    return 'no_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 %data;      my %data;
     $data{"$symb\0queue\0$uname\@$udom"}=[$slot_name];      $data{"$symb\0queue\0$uname\@$udom"}=$user_data;
     return &Apache::lonnet::newput($queue,\%data,$cdom,$cnum);      return &Apache::lonnet::cput($queue,\%data,$cdom,$cnum);
 }  }
   
 sub show_queue {  sub show_queue {
Line 1031  sub show_queue { Line 1174  sub show_queue {
     if ($tmp=~/^error: 2 /) {      if ($tmp=~/^error: 2 /) {
  return "\n<h3>Current Queue - $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 - $queue </h3><table border='1'><tr>";      my $title=&Apache::lonnet::gettitle($symb);
     if ($with_selects) { $result.="<th></th>"; }      $result.="\n<h3>Current Queue - $title $queue </h3><table border='1'><tr>";
     $result.="<th>resource</th><th>user</th><th>type</th><th>data</th></tr>";      if ($with_selects) { $result.="<th>Status</th><th></th>"; }
       $result.="<th>user</th><th>data</th></tr>";
     foreach my $key (sort(keys(%queue))) {      foreach my $key (sort(keys(%queue))) {
  my ($symb,$uname,$udom) = &decode_queue_key($key);   my ($symb,$uname,$udom) = &decode_queue_key($key);
  if (!defined($classlist->{$uname.':'.$udom})) { next; }   if (!defined($classlist->{$uname.':'.$udom})) { next; }
  if ($key=~/locked$/ && !$with_selects) {   if ($key=~/locked$/ && !$with_selects) {
     my $title=&Apache::lonnet::gettitle($symb);      $result.="<tr><td>$uname</td>";
     $result.="<tr><td>$title</td><td>$uname</td>";      $result.='<td>'.$queue{$key}.'</td></tr>';
     $result.='<td>lock</td><td>'.$queue{$key}.'</td></tr>';  
  } elsif ($key=~/timestamp$/ && !$with_selects) {   } elsif ($key=~/timestamp$/ && !$with_selects) {
     my ($symb,undef) = split("\0",$key);      $result.="<tr><td></td>";
     my $title=&Apache::lonnet::gettitle($symb);      $result.='<td>'.
     $result.="<tr><td>$title</td><td></td>";  
     $result.='<td>last queue modification time</td><td>'.  
  &Apache::lonlocal::locallocaltime($queue{$key})."</td></tr>";   &Apache::lonlocal::locallocaltime($queue{$key})."</td></tr>";
  } elsif ($key!~/(timestamp|locked)$/) {   } elsif ($key!~/(timestamp|locked)$/) {
     my $title=&Apache::lonnet::gettitle($symb);  
     $result.="<tr>";      $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);
     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,$status)=('select',&mt('Select'));
  if (exists($queue{"$key\0locked"})) {   if (exists($queue{"$key\0locked"})) {
     my $me=$env{'user.name'}.'@'.$env{'user.domain'};      my $me=$env{'user.name'}.'@'.$env{'user.domain'};
       $status=&mt('Locked by <tt>[_1]</tt>',$queue{"$key\0locked"});
     if ($me eq $queue{"$key\0locked"}) {      if ($me eq $queue{"$key\0locked"}) {
  ($action,$description)=('resume',&mt('Resume'));   ($action,$description)=('resume',&mt('Resume'));
     } else {      } else {
Line 1070  sub show_queue { Line 1211  sub show_queue {
  }   }
  if (time > $slot_data{'endtime'}) {   if (time > $slot_data{'endtime'}) {
     $result.=(<<FORM);      $result.=(<<FORM);
   <td>$status</td>
 <td>  <td>
 <form method="POST">  <form style="display: inline" 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" />
Line 1087  FORM Line 1229  FORM
     $result.='<td>'.&mt("In Progress").'</td>'      $result.='<td>'.&mt("In Progress").'</td>'
  }   }
     }      }
     $result.="<td>$title</td><td>$uname</td>";      $result.= "<td>".$fullname->{$uname.':'.$udom}.
     $result.='<td>queue entry</td><td>Slot: '.$slot.' End time: '.   " <tt>($uname\@$udom)</tt> </td>";
       $result.='<td>Slot: '.$slot.' End time: '.
  &Apache::lonlocal::locallocaltime($slot_data{'endtime'}).   &Apache::lonlocal::locallocaltime($slot_data{'endtime'}).
  "</td></tr>";   "</td></tr>";
  }   }
Line 1110  sub get_queue_counts { Line 1253  sub get_queue_counts {
  return (0,0,0);   return (0,0,0);
     }      }
     my ($entries,$ready_to_grade,$locks)=(0,0,0);      my ($entries,$ready_to_grade,$locks)=(0,0,0);
       my %slot_cache;
     foreach my $key (sort(keys(%queue))) {      foreach my $key (sort(keys(%queue))) {
  if ($key=~/locked$/) {   if ($key=~/locked$/) {
     $locks++;      $locks++;
Line 1119  sub get_queue_counts { Line 1263  sub get_queue_counts {
     my ($symb,$uname,$udom) = &decode_queue_key($key);      my ($symb,$uname,$udom) = &decode_queue_key($key);
     $entries++;      $entries++;
     my $slot=$queue{$key}->[0];      my $slot=$queue{$key}->[0];
     my %slot_data=&Apache::lonnet::get_slot($slot);      if (!exists($slot_cache{$slot})) {
     if (time > $slot_data{'endtime'}) {   my %slot_data=&Apache::lonnet::get_slot($slot);
    $slot_cache{$slot} = \%slot_data;
       }
       if (time > $slot_cache{$slot}{'endtime'}) {
  $ready_to_grade++;   $ready_to_grade++;
     }      }
  }   }
Line 1157  sub queue_key_locked { Line 1304  sub queue_key_locked {
   
 sub pick_from_queue_data {  sub pick_from_queue_data {
     my ($queue,$check_section,$queuedata,$cdom,$cnum)=@_;      my ($queue,$check_section,$queuedata,$cdom,$cnum)=@_;
       my @possible; # will hold queue entries that are valid to be selected
     foreach my $key (keys(%$queuedata)) {      foreach my $key (keys(%$queuedata)) {
  if ($key =~ /\0locked$/) { next; }   if ($key =~ /\0locked$/) { next; }
  if ($key =~ /\0timestamp$/) { next; }   if ($key =~ /\0timestamp$/) { next; }
Line 1174  sub pick_from_queue_data { Line 1322  sub pick_from_queue_data {
     &Apache::lonxml::debug("not time");      &Apache::lonxml::debug("not time");
     next;      next;
  }   }
  if (&queue_key_locked($queue,$key,$cdom,$cnum)) {   if (exists($queuedata->{"$key\0locked"})) {
     &Apache::lonxml::debug("someone already has um.");      &Apache::lonxml::debug("someone already has um.");
     next;      next;
  }   }
  return $key;   push(@possible,[$key,$slot_data{'endtime'}]);
       }
       if (@possible) {
           # sort entries in order by slot end time
    @possible = sort { $a->[1] <=> $b->[1] } @possible;
    # pick one of the first ten entries
    my $max=($#possible < 10) ? $#possible : 10;
    return $possible[int(rand($max))][0];
     }      }
     return undef;      return undef;
 }  }
Line 1219  sub lock_key { Line 1374  sub lock_key {
     return 0;      return 0;
 }  }
   
   sub get_queue_symb_status {
       my ($queue,$symb,$cdom,$cnum) = @_;
       if (!defined($cdom) || !defined($cnum)) {
    my (undef,$cid)=&Apache::lonxml::whichuser();
    $cnum=$env{'course.'.$cid.'.num'};
    $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; }
       my @users;
       foreach my $key (sort(keys(%queue))) {
    next if ($key=~/locked$/);
    next if ($key=~/timestamp$/);
    my ($symb,$uname,$udom) = &decode_queue_key($key);
    push(@users,"$uname:$udom");
       }
       return @users;
   }
   
 sub get_from_queue {  sub get_from_queue {
     my ($queue)=@_;      my ($queue)=@_;
     my $result;      my $result;
Line 1228  sub get_from_queue { Line 1404  sub get_from_queue {
     my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum);      my $todo=&find_mid_grade($queue,$symb,$cdom,$cnum);
     &Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));      &Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));
     if ($todo) { return $todo; }      if ($todo) { return $todo; }
       my $attempts=0;
     while (1) {      while (1) {
    if ($attempts > 2) {
       # tried twice to get a queue entry, giving up
       return (undef,'unable');
    }
  my $starttime=time;   my $starttime=time;
  &Apache::lonnet::put($queue,{"$symb\0timestamp"=>$starttime},   &Apache::lonnet::cput($queue,{"$symb\0timestamp"=>$starttime},
      $cdom,$cnum);        $cdom,$cnum);
  &Apache::lonxml::debug("$starttime");   &Apache::lonxml::debug("$starttime");
  my $regexp="^$symb\0queue\0";   my $regexp="^$symb\0queue\0";
    my $range= ($attempts < 1 ) ? '0-100' : '0-400';
   
  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 _not_ in my section   #make a pass looking for a user _not_ in my section
  if ($env{'request.course.sec'}) {   if ($env{'request.course.sec'}) {
Line 1246  sub get_from_queue { Line 1429  sub get_from_queue {
  # ready for grading   # ready for grading
  if (!$todo) {   if (!$todo) {
     &Apache::lonxml::debug("no sce");      &Apache::lonxml::debug("no sce");
     $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},      $todo=&pick_from_queue_data($queue,undef,\%queue,$cdom,$cnum);
  \%queue,$cdom,$cnum);  
     &Apache::lonxml::debug("no sce $todo");      &Apache::lonxml::debug("no sce $todo");
  }   }
  # no user to grade    # no user to grade 
Line 1255  sub get_from_queue { Line 1437  sub get_from_queue {
  &Apache::lonxml::debug("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)) {
       $attempts++;
       next;
    }
  my (undef,$endtime)=   my (undef,$endtime)=
     &Apache::lonnet::get($queue,["$symb\0timestamp"],      &Apache::lonnet::get($queue,["$symb\0timestamp"],
  $cdom,$cnum);   $cdom,$cnum);
Line 1274  sub get_from_queue { Line 1459  sub get_from_queue {
  &Apache::lonnet::del($queue,["$todo\0locked"],   &Apache::lonnet::del($queue,["$todo\0locked"],
      $cdom,$cnum);       $cdom,$cnum);
  &Apache::lonxml::debug("del");   &Apache::lonxml::debug("del");
    $attempts++;
  next;   next;
     }      }
  }   }
Line 1302  sub select_user { Line 1488  sub select_user {
     foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) {      foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) {
  my ($uname,$udom) = split(/:/,$student);   my ($uname,$udom) = split(/:/,$student);
   
  my %status = &get_student_status($symb,$cid,$udom,$uname);   my $cnum=$env{'course.'.$cid.'.num'};
    my $cdom=$env{'course.'.$cid.'.domain'};
    my %status = &get_student_status($symb,$cdom,$cnum,$udom,$uname,
    'Task');
  my $queue = 'none';   my $queue = 'none';
  my $cannot_grade;   my $cannot_grade;
  if ($status{'reviewqueue'} =~ /^(in_progress|enqueue)$/) {   if ($status{'reviewqueue'} =~ /^(in_progress|enqueue)$/) {
Line 1327  sub select_user { Line 1516  sub select_user {
  $seclist.='<input type="hidden" name="chosensections"    $seclist.='<input type="hidden" name="chosensections" 
                                value="'.$sec.'" />';                                 value="'.$sec.'" />';
     }      }
       my $studentdis = $student;
       $studentdis =~ tr/:/@/;
     $result.=<<RESULT;      $result.=<<RESULT;
 <tr>  <tr>
   <td>    <td>
     <form method="POST">      <form style="display: inline" method="POST">
       <input type="hidden" name="gradingkey" value="$todo" />        <input type="hidden" name="gradingkey" value="$todo" />
       <input type="hidden" name="queue" value="$queue" />        <input type="hidden" name="queue" value="$queue" />
       <input type="hidden" name="webgrade" value="no" />        <input type="hidden" name="webgrade" value="no" />
Line 1338  sub select_user { Line 1529  sub select_user {
       <input type="submit" name="submit" value="Regrade" />        <input type="submit" name="submit" value="Regrade" />
       $seclist        $seclist
     </form>      </form>
   <td>$fullname->{$student}</td>    <td>$fullname->{$student} <tt>($studentdis)</tt></td>
   <td>    <td>
 RESULT  RESULT
         }          }
Line 1358  RESULT Line 1549  RESULT
  if ($status{'version'}) {   if ($status{'version'}) {
     $result .= ' '.&mt('Version').' '.$status{'version'};      $result .= ' '.&mt('Version').' '.$status{'version'};
  }   }
    if ($status{'grader'}) {
       $result .= ' '.&mt('(Graded by [_1])',$status{'grader'}).' ';
    }
  $result.= '</td><td>';   $result.= '</td><td>';
  if ($status{'reviewqueue'} eq 'enqueued') {   if ($status{'reviewqueue'} eq 'enqueued') {
     $result .= &mt('Awaiting Review');      $result .= &mt('Awaiting Review');
Line 1381  RESULT Line 1575  RESULT
 }  }
   
 sub get_student_status {  sub get_student_status {
     my ($symb,$cid,$udom,$uname)=@_;      my ($symb,$cdom,$cnum,$udom,$uname,$type)=@_;
     my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},  
   $udom,$uname);  
     my %status;      my %status;
     $status{'status'}=$record{'resource.status'};  
     $status{'version'}=$record{'resource.version'};      if ($type eq 'Task') {
     $status{'grader'}=$record{'resource.grader'};   my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},
     $status{'reviewqueue'}=&check_queue_for_key($cid,'reviewqueue',    $udom,$uname);
        &encode_queue_key($symb,$udom,$uname));   $status{'status'}=$record{'resource.0.status'};
     $status{'gradingqueue'}=&check_queue_for_key($cid,'gradingqueue',   $status{'version'}=$record{'resource.0.version'};
        &encode_queue_key($symb,$udom,$uname));   $status{'grader'}=$record{'resource.0.regrader'};
       }
       $status{'reviewqueue'}=
    &check_queue_for_key($cdom,$cnum,'reviewqueue',
        &encode_queue_key($symb,$udom,$uname));
       $status{'gradingqueue'}=
    &check_queue_for_key($cdom,$cnum,'gradingqueue',
        &encode_queue_key($symb,$udom,$uname));
     return %status;      return %status;
 }  }
   
Line 1491  sub get_instance { Line 1691  sub get_instance {
     foreach my $instance (@instances) {      foreach my $instance (@instances) {
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});   $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});
  if ($Apache::lonhomework::history{"resource.$version.status"} eq 'pass' ||   if ($Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass' ||
     $Apache::lonhomework::history{"resource.$version.status"} eq 'fail') {      $Apache::lonhomework::history{"resource.$version.0.status"} eq 'fail') {
   
     my $dim_status=$Apache::lonhomework::history{"resource.$version.$dim.status"};      my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
     my $mandatory='Mandatory';      my $mandatory='Mandatory';
     if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {      if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {
  $mandatory='Optional';   $mandatory='Optional';
Line 1514  sub get_instance { Line 1714  sub get_instance {
  if ($dimension{$instance.'.criteria.'.$id.'.mandatory'}    if ($dimension{$instance.'.criteria.'.$id.'.mandatory'} 
     eq 'N') {      eq 'N') {
     $opt_count++;      $opt_count++;
     if ($Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.status"} eq 'pass') {      if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
  $opt_passed++;   $opt_passed++;
     }      }
  } else {   } else {
     $man_count++;      $man_count++;
     if ($Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.status"} eq 'pass') {      if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {
  $man_passed++;   $man_passed++;
     }      }
  }   }
Line 1533  sub get_instance { Line 1733  sub get_instance {
     $result=~s/\Q$internal_location\E/$dim_info/;      $result=~s/\Q$internal_location\E/$dim_info/;
   
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {      foreach my $id (@{$dimension{$instance.'.criterias'}}) {
  my $status=$Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.status"};   my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};
  my $comment=$Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.comment"};   my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"};
  my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');   my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');
  if ($mandatory) {   if ($mandatory) {
     $mandatory='Mandatory';      $mandatory='Mandatory';
Line 1554  sub get_instance { Line 1754  sub get_instance {
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});   $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});
  $result.='</p><p class="grade">'.$status_display.'</p>';   $result.='</p><p class="grade">'.$status_display.'</p>';
  if ($Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.comment"}) {   if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}) {
     $result.='<p class="comment">'.$Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.comment"}.'</p>';      $result.='<p class="comment">'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}).'</p>';
  }   }
  $result.='</div>';   $result.='</div>';
     }      }
Line 1569  sub get_instance { Line 1769  sub get_instance {
     &Apache::scripttag::xmlparse($dimension{$instance.'.text'});      &Apache::scripttag::xmlparse($dimension{$instance.'.text'});
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {      foreach my $id (@{$dimension{$instance.'.criterias'}}) {
  my $link='criteria_'.$instance.'_'.$id;   my $link='criteria_'.$instance.'_'.$id;
  my $status=$Apache::lonhomework::history{"resource.$version.$dim.$instance.$id.status"};   my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};
  $result.='<tr><td width="100%" valign="top">'.   $result.='<div class="criteria" id="'.$link.'">'."\n".
     '<a name="'.$link.'" />'.      '<a name="'.$link.'" />'."\n".
     '<a name="next_'.$last_link.'" />'.      '<a name="next_'.$last_link.'" />'."\n".
     '<br /><textarea enabled="false" style="width:100%" rows="8" width="25" wrap="hard">';      '<div class="criteriatext">'."\n";
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});   $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});
  $result.='</textarea>'.   $result.='</div>'."\n".
     #$dimension{$instance.'.criteria.'.$id}.      #$dimension{$instance.'.criteria.'.$id}.
     '</td>'.      '<div class="grade">'."\n".
     '<td><nobr>Additional Comment for Student</nobr> <br />'.      '<label class="ungraded"><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label>'."\n".
     '<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>'.      '<label class="fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".
     '</td>'.      '<label class="pass"><input type="radio" name="HWVAL_'.$link.'" value="pass" '.($status eq 'pass' ? 'checked="checked"':'').' />'.&mt('Pass').'</label>'."\n".
     '<td>'.      '<label class="review"><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label>'."\n".
     '<nobr><label><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label></nobr><br />'.      '</div>'."\n".
     '<label><input type="radio" name="HWVAL_'.$link.'" value="pass" '.($status eq 'pass' ? 'checked="checked"':'').' />'.&mt('Pass').'</label><br />'.      '<label class="comment">'.&mt('Additional Comment for Student')."\n".
     '<label><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label><br />'.      '<textarea class="comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}).'</textarea>'."\n".
     '<label><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label><br />'.      '</label>'."\n".
     '</td>'.      '<ul class="navbuttons">'."\n".
     '<td>'.      '<li><a href="#'.$last_link.'">Prev</a></li>'."\n".
     '<a href="#'.$last_link.'">Prev</a><br />'.      '<li><a href="#next_'.$link.'">Next</a></li>'."\n".
     '<a href="#next_'.$link.'">Next</a><br /><br /><br />'.      '</ul>'."\n".
     '</td></tr>';                      '</div>'."\n";
  $last_link=$link;   $last_link=$link;
     }      }
  } elsif ($target eq 'grade' && $env{'form.webgrade'}) {   } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
Line 1600  sub get_instance { Line 1800  sub get_instance {
     my $ungraded=0;      my $ungraded=0;
     my $review=0;      my $review=0;
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {      foreach my $id (@{$dimension{$instance.'.criterias'}}) {
  my $status=$Apache::lonhomework::results{"resource.$version.$dim.$instance.$id.status"}=$env{'form.HWVAL_criteria_'.$instance.'_'.$id};   my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.status"}=$env{'form.HWVAL_criteria_'.$instance.'_'.$id};
  $Apache::lonhomework::results{"resource.$version.$dim.$instance.$id.comment"}=$env{'form.HWVAL_comment_criteria_'.$instance.'_'.$id};   $Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.comment"}=$env{'form.HWVAL_comment_criteria_'.$instance.'_'.$id};
  my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');   my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');
  if ($status eq 'pass') {   if ($status eq 'pass') {
     if (!$mandatory) { $optional_passed++; }      if (!$mandatory) { $optional_passed++; }
Line 1620  sub get_instance { Line 1820  sub get_instance {
     }      }
     &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");      &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
     if ($review) {      if ($review) {
  $Apache::lonhomework::results{"resource.$version.$dim.status"}=   $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
     'review';      'review';
     } elsif ($ungraded) {      } elsif ($ungraded) {
  $Apache::lonhomework::results{"resource.$version.$dim.status"}=   $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
     'ungraded';      'ungraded';
     } elsif ($mandatory_failed) {      } elsif ($mandatory_failed) {
  $Apache::lonhomework::results{"resource.$version.$dim.status"}=   $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
     'fail';      'fail';
     } else {      } else {
  $Apache::lonhomework::results{"resource.$version.$dim.status"}=   $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
     'pass';      'pass';
     }      }
  } else {   } else {
Line 1641  sub get_instance { Line 1841  sub get_instance {
 }  }
   
 sub start_IntroParagraph {  sub start_IntroParagraph {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  if ($tagstack->[-2] eq 'Dimension') {   if ($tagstack->[-2] eq 'Dimension') {
     $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser);      $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style);
   
  } elsif ($target eq 'webgrade') {   } elsif ($target eq 'webgrade') {
     &Apache::lonxml::get_all_text('/introparagraph',$parser);      &Apache::lonxml::get_all_text('/introparagraph',$parser,$style);
  }   }
   
     }      }
Line 1677  sub end_Instance { Line 1877  sub end_Instance {
 }  }
   
 sub start_InstanceText {  sub start_InstanceText {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $instance_id=$Apache::bridgetask::instance[-1];      my $instance_id=$Apache::bridgetask::instance[-1];
     my $text=&Apache::lonxml::get_all_text('/instancetext',$parser);      my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style);
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $dimension{$instance_id.'.text'}=$text;   $dimension{$instance_id.'.text'}=$text;
     }      }
Line 1691  sub end_InstanceText { Line 1891  sub end_InstanceText {
 }  }
   
 sub start_Criteria {  sub start_Criteria {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $instance_id=$Apache::bridgetask::instance[-1];      my $instance_id=$Apache::bridgetask::instance[-1];
     my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser);      my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser,$style);
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {      if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {
  my $id=&get_id($parstack,$safeeval);   my $id=&get_id($parstack,$safeeval);
  $dimension{$instance_id.'.criteria.'.$id}=$criteria;   $dimension{$instance_id.'.criteria.'.$id}=$criteria;

Removed from v.1.79  
changed lines
  Added in v.1.112


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