Diff for /loncom/homework/bridgetask.pm between versions 1.99 and 1.149

version 1.99, 2006/01/30 21:01:46 version 1.149, 2006/05/12 05:18:34
Line 66  sub proctor_check_auth { Line 66  sub proctor_check_auth {
           
     my @allowed=split(",",$slot->{'proctor'});      my @allowed=split(",",$slot->{'proctor'});
     foreach my $possible (@allowed) {      foreach my $possible (@allowed) {
  my ($puser,$pdom)=(split('@',$possible));   my ($puser,$pdom)=(split(':',$possible));
  if ($puser eq $user && $pdom eq $domain) {   if ($puser eq $user && $pdom eq $domain) {
     my $authenticated=0;      my $authenticated=0;
     if ( $slot->{'secret'} =~ /\S/ &&      if ( $slot->{'secret'} =~ /\S/ &&
Line 95  sub proctor_check_auth { Line 95  sub proctor_check_auth {
  #setup new version and who did it   #setup new version and who did it
  $Apache::lonhomework::results{'resource.0.version'}=$version;   $Apache::lonhomework::results{'resource.0.version'}=$version;
  $Apache::lonhomework::results{"resource.$version.0.checkedin"}=   $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
     $user.'@'.$domain;      $user.':'.$domain;
  $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=   $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=
     $slot_name;      $slot_name;
   
Line 103  sub proctor_check_auth { Line 103  sub proctor_check_auth {
     } elsif ($authenticated && $type eq 'problem') {      } elsif ($authenticated && $type eq 'problem') {
  &Apache::lonxml::debug("authed $slot_name");   &Apache::lonxml::debug("authed $slot_name");
  $Apache::lonhomework::results{"resource.0.checkedin"}=   $Apache::lonhomework::results{"resource.0.checkedin"}=
     $user.'@'.$domain;      $user.':'.$domain;
  $Apache::lonhomework::results{"resource.0.checkedin.slot"}=   $Apache::lonhomework::results{"resource.0.checkedin.slot"}=
     $slot_name;      $slot_name;
     }      }
Line 155  sub add_previous_version_button { Line 155  sub add_previous_version_button {
  join("</option>\n<option>",@to_show).   join("</option>\n<option>",@to_show).
      "</option>\n";       "</option>\n";
     $list.='<option value="current">'.&mt('Current').'</option>';      $list.='<option value="current">'.&mt('Current').'</option>';
     $result.='<form name="getprevious" method="POST" action="';      $result.='<form name="getprevious" method="post" action="';
     my $uri=$env{'request.uri'};      my $uri=$env{'request.uri'};
     if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }      if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
     $result.=$uri.'">'.      $result.=$uri.'">'.
Line 170  sub add_grading_button { Line 170  sub add_grading_button {
     my (undef,$cid)=&Apache::lonxml::whichuser();      my (undef,$cid)=&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 %sections;      my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
     my $numsections=&Apache::loncommon::get_sections($cdom,$cnum,\%sections);  
     my $size=5;      my $size=5;
     if (scalar(keys(%sections)) < 3) {      if (scalar(keys(%sections)) < 3) {
  $size=scalar(keys(%sections))+2;   $size=scalar(keys(%sections))+2;
     }      }
     my $sec_select = '<select multiple name="chosensections" size="'.$size.'">'."\n";      my $sec_select = '<select multiple="multiple" name="chosensections" size="'.$size.'">'."\n";
     $sec_select .= "<option value='all' selected='selected'>all</option>\n";      $sec_select .= "<option value='all' selected='selected'>all</option>\n";
     foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {      foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
  $sec_select .= "<option name=\"$sec\">$sec</option>\n";   $sec_select .= "<option value=\"$sec\">$sec</option>\n";
     }      }
     $sec_select .= "<option value='none'>none</option></select>\n";      $sec_select .= "<option value='none'>none</option></select>\n";
           
Line 188  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();
    $result.= '</p>';
     }      }
     return $result;      return $result;
 }  }
Line 209  sub add_request_another_attempt_button { Line 223  sub add_request_another_attempt_button {
     if (!$text) { $text="Request another attempt"; }      if (!$text) { $text="Request another attempt"; }
     my $result;      my $result;
     my $symb=&Apache::lonnet::symbread();      my $symb=&Apache::lonnet::symbread();
       # not a slot access based resource
       my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
       if ($useslots =~ /^\s*no\s*$/i) {
    return '';
       }
   
     my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb);      my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb);
     my $action='get_reservation';      my $action='get_reservation';
     if ($slot_name) {      if ($slot_name) {
Line 223  STUFF Line 243  STUFF
           
     if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }      if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }
     $symb=&Apache::lonnet::escape($symb);      $symb=&Apache::lonnet::escape($symb);
     $result.='<form method="POST" action="/adm/slotrequest">'.      $result.='<form method="post" action="/adm/slotrequest">'.
  '<input type="hidden" name="symb" value="'.$symb.'" />'.   '<input type="hidden" name="symb" value="'.$symb.'" />'.
  '<input type="hidden" name="command" value="'.$action.'" />'.   '<input type="hidden" name="command" value="'.$action.'" />'.
  '<input type="submit" name="requestattempt" value="'.   '<input type="submit" name="requestattempt" value="'.
Line 245  sub preserve_grade_info { Line 265  sub preserve_grade_info {
 }  }
   
 sub style {  sub style {
     return (<<STYLE);      my ($target) = @_;
 <style type="text/css">      if ($target eq 'web'
 .fail, .pass, .neutral {   || $target eq 'webgrade') {
     position: relative;   return (<<STYLE);
     margin : 5px;  <link rel="stylesheet" type="text/css" href="/res/adm/includes/task.css" />
     margin-bottom :10px;  
     padding : 4px;  
     padding-left : 75px;  
  border : thin solid;  
     font-weight : bolder;  
     font-size: smaller;  
     font-family: Arial;  
     background-color : rgb(255,240,225);  
 }  
   
 .fail h4, .pass h4 {  
  position:absolute;  
  left: -4px;  
  top: -8px;  
  padding:2px;  
  margin:0;  
  background-color : rgb(255,240,225);  
  border : thin solid;  
 }  
   
 .fail {  
  color: red;  
 }  
   
 .pass {  
     color : green;  
 }  
   
 .neutral {  
  color : blue;  
 }  
   
 .question {  
  border : thin solid black;  
  padding : 4px;  
  margin-bottom : 1em;  
 }  
   
 .grade {  
  font-size: x-large;  
  font-family: Arial;  
  position:absolute;  
  left: 5px;  
  top: -5px;  
  width: 70px;  
 }  
   
 div#feedback h1 {  
     color : inherit;  
 }  
 </style>  
 STYLE  STYLE
       }
       return;
 }  }
   
 sub show_task {  sub show_task {
Line 358  sub submission_time_stamp { Line 328  sub submission_time_stamp {
     return $result;      return $result;
 }  }
   
 sub webgrade_standard_info {  sub file_list {
     my ($version)=&get_version();      my ($files,$uname,$udom) = @_;
     my (undef,undef,$udom,$uname) = &Apache::lonxml::whichuser();      if (!defined($uname) || !defined($udom)) {
    (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";  
     foreach my $partial_file (split(',',$Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"})) {      my $file_list="<ul class=\"LC_GRADING_handininfo\">\n";
       foreach my $partial_file (split(',',$files)) {
  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";
       return $file_list;
   }
   
   sub webgrade_standard_info {
       my ($version)=&get_version();
   
     my %lt=&Apache::lonlocal::texthash('done' => 'Done',      my $file_list = &file_list($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"});
        'stop' => 'Stop',  
       my %lt=&Apache::lonlocal::texthash('done' => 'Next Item',
          'stop' => 'Quit Grading',
          'fail' => 'Fail Rest',
        );         );
                 
     my $result=<<INFO;      my $result=<<INFO;
 <div class="handininfo">    <div class="LC_GRADING_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'}" />
       <input type="button" name="fail" value="$lt{'fail'}" 
              onclick="javascript:onFailRest()" />
     </div>
   $file_list    $file_list
 </div>  
 INFO  INFO
     return $result;      return $result;
 }  }
Line 401  sub start_Task { Line 384  sub start_Task {
     }       } 
   
     $Apache::lonhomework::parsing_a_task=1;      $Apache::lonhomework::parsing_a_task=1;
     #should get back a <html> or the neccesary stuff to start XML/MathML  
     my ($result,$head_tag_start,$body_tag_start,$form_tag_start)=      my $name;
  &Apache::structuretags::page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);      if ($target eq 'web' || $target eq 'webgrade') {
        $name = &Apache::structuretags::get_resource_name($parstack,$safeeval);
       }
   
       my ($result,$form_tag_start);
       if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
    || $target eq 'edit') {
    ($result,$form_tag_start) =
       &Apache::structuretags::page_start($target,$token,$tagstack,
          $parstack,$parser,$safeeval,
          $name,&style($target));
    $result .= '<div class="LC_task">'."\n";
       }
   
     if ($target eq 'web' && $env{'request.state'} ne 'construct') {      if ($target eq 'web' && $env{'request.state'} ne 'construct') {
  if ($Apache::lonhomework::modifygrades) {   if ($Apache::lonhomework::queuegrade
     $body_tag_start.='<form name="gradesubmission" method="POST" action="';      || $Apache::lonhomework::modifygrades) {
       $result.='<form name="gradesubmission" method="post" action="';
     my $uri=$env{'request.uri'};      my $uri=$env{'request.uri'};
     if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }      if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
     $body_tag_start.=$uri.'">'.&add_grading_button()."</form>";      $result.=$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">'.   $result.='<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'});
    $result.='<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 436  sub start_Task { Line 441  sub start_Task {
  $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$version.0.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);   $result.=&add_previous_version_button($status);
  if (!&show_task($status,$previous)) {   if (!&show_task($status,$previous)) {
     my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);      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;  
  if ($env{'request.state'} eq 'construct') {   if ($env{'request.state'} eq 'construct') {
     $result.=$form_tag_start;      $result.=$form_tag_start;
  }   }
Line 458  sub start_Task { Line 462  sub start_Task {
  } elsif ($env{'form.donescreen'}) {   } elsif ($env{'form.donescreen'}) {
     my $title=&Apache::lonnet::gettitle();      my $title=&Apache::lonnet::gettitle();
     my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});      my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});
     my $files='<ul><li>'.join('</li><li>',@files).'</li></ul>';      my (undef,undef,$domain,$user)=
    &Apache::lonxml::whichuser();
       my $files = '<ul>';
       foreach my $file (@files) {
    my $url="/uploaded/$domain/$user/portfolio$file";
    if (! &Apache::lonnet::stat_file($url)) {
       $file = &mt('<font color="red"> Nonexistant file:</font> <tt>[_1]</tt>',$file);
    } else {
       $file = '<tt>'.$file.'</tt>';
    }
    $files .= '<li>'.$file.'</li>';
       }
       $files.='</ul>';
   
     $result.=<<DONESCREEN;      $result.=<<DONESCREEN;
 <h2>$title</h2>  <h2>$title</h2>
 <p> Files submitted: $files </p>  <p> Files submitted: $files </p>
Line 485  DONESCREEN Line 502  DONESCREEN
  if ($status eq 'NEEDS_CHECKIN') {   if ($status eq 'NEEDS_CHECKIN') {
     if(&proctor_check_auth($slot_name,$slot,'Task')      if(&proctor_check_auth($slot_name,$slot,'Task')
        && defined($Apache::inputtags::slot_name)) {         && defined($Apache::inputtags::slot_name)) {
  my $result=&add_to_queue('gradingqueue',   my $result=
  [$Apache::inputtags::slot_name]);      &add_to_queue('gradingqueue',
     {'type' => 'task',
      'time' => time,
      'slot' => 
          $Apache::inputtags::slot_name});
  &Apache::lonxml::debug("add_to_queue said $result");   &Apache::lonxml::debug("add_to_queue said $result");
     }      }
  }   }
     }      }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     my $name= &Apache::structuretags::get_resource_name($parstack,$safeeval);  
     $result.="$head_tag_start<title>$name</title></head>  
               $body_tag_start \n".&style();  
       
     $result.=&preserve_grade_info();      $result.=&preserve_grade_info();
     $result.=&internal_location();      $result.=&internal_location();
     $result.=$form_tag_start.      $result.=$form_tag_start.
Line 506  DONESCREEN Line 524  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.= "\n".'<div class="LC_GRADING_task">'."\n".
    '<script type="text/javascript" 
                            src="/res/adm/includes/task_grading.js"></script>';
     #$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 515  DONESCREEN Line 535  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 528  DONESCREEN Line 548  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') {
Line 544  DONESCREEN Line 560  DONESCREEN
  if      ($status_code eq 'stop') {   if      ($status_code eq 'stop') {
     $result.='<b>'.&mt("Stopped grading.").'</b>'.$back;      $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.")      $result.='<b>'.&mt("Failed to lock the requested record.")
  .'</b>'.$back;   .'</b>'.$back;
  } elsif ($status_code eq 'unlock') {   } elsif ($status_code eq 'unlock') {
     $result.='<b>'.&mt("Unlocked the requested record.")      $result.='<b>'.&mt("Unlocked the requested record.")
Line 556  DONESCREEN Line 572  DONESCREEN
     $result.=&select_user();      $result.=&select_user();
  } elsif ($status_code eq 'unable') {   } elsif ($status_code eq 'unable') {
     $result.='<b>'.&mt("Unable to aqcuire a user to grade.").'</b>'.$back;      $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>'.$back;      $result.='<b>'.&mt("No user to be graded.").'</b>'.$back;
  }   }
Line 586  DONESCREEN Line 604  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="LC_GRADING_criterialist">';
    }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.   $result.=$form_tag_start.
     &Apache::structuretags::problem_edit_header();      &Apache::structuretags::problem_edit_header();
  $Apache::lonxml::warnings_error_header=   $Apache::lonxml::warnings_error_header=
     &mt("Editor Errors - these errors might not effect the running of the problem, but they will likely cause problems with further use of the Edit mode. Please use the EditXML mode to fix these errors.")."<br />";      &mt("Editor Errors - these errors might not effect the running of the problem, but they will likely cause problems with further use of the Edit mode. Please use the EditXML mode to fix these errors.")."<br />";
Line 622  sub get_key_todo { Line 643  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 649  sub get_key_todo { Line 721  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 729  sub end_Task { Line 800  sub end_Task {
     &show_task($status,$previous)) {      &show_task($status,$previous)) {
     $result.=&Apache::inputtags::gradestatus('0');      $result.=&Apache::inputtags::gradestatus('0');
     $result.='</form>';      $result.='</form>';
       my $action = &Apache::lonenc::check_encrypt($env{'request.uri'});
     $result.=<<DONEBUTTON;      $result.=<<DONEBUTTON;
 <form method="POST">  <form name="done" method="post" action="$action">
    <input type="hidden" name="donescreen" value="1" />     <input type="hidden" name="donescreen" value="1" />
    <input type="submit" value="Done" />     <input type="submit" value="Done" />
 </form>  </form>
Line 741  DONEBUTTON Line 813  DONEBUTTON
     my $bt_status=$Apache::lonhomework::history{"resource.$version.0.status"};      my $bt_status=$Apache::lonhomework::history{"resource.$version.0.status"};
     my $title=&Apache::lonnet::gettitle();      my $title=&Apache::lonnet::gettitle();
   
       my $start_time;
   
     my $slot_name=      my $slot_name=
  $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};   $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};
     my %slot=&Apache::lonnet::get_slot($slot_name);      if ($slot_name) {
     my $start_time=   my %slot=&Apache::lonnet::get_slot($slot_name);
  &Apache::lonlocal::locallocaltime($slot{'starttime'});  
    $start_time=$slot{'starttime'}
       } else {
    $start_time= 
       &Apache::lonnet::EXT('resource.0.opendate');
       }
       $start_time=&Apache::lonlocal::locallocaltime($start_time);
   
     my $status = "\n<div class='$bt_status'>\n";      my $status = "\n<div class='LC_$bt_status LC_criteria'>\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 '.
Line 782  DONEBUTTON Line 862  DONEBUTTON
     my $internal_location=&internal_location();      my $internal_location=&internal_location();
     $result=~s/\Q$internal_location\E/$status/;      $result=~s/\Q$internal_location\E/$status/;
  }   }
     }    $result.="\n</div>\n".
     if ($target eq 'web' || $target eq 'webgrade') {      &Apache::loncommon::end_page({'discussion' => 1});
  $result.=&Apache::lonxml::xmlend().'</html>';  
     }      }
  }   }
  if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {   if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {
Line 808  DONEBUTTON Line 887  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') {
  && defined($Apache::inputtags::slot_name)) {   my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
  &add_to_queue('gradingqueue',[$Apache::inputtags::slot_name]);   if ($useslots =~ /^\s*no\s*$/i) {
       &add_to_queue('gradingqueue',
     {'type' => 'task',
      'time' => time});
    } elsif (defined($Apache::inputtags::slot_name)) {
       &add_to_queue('gradingqueue',
     {'type' => 'task',
      'time' => time,
      'slot' => $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 846  DONEBUTTON Line 934  DONEBUTTON
     }      }
     &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.0.regrader'}=      $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.0.status"}='review';   $Apache::lonhomework::results{"resource.$version.0.status"}='review';
  if ($env{'form.queue'} eq 'reviewqueue') {   if ($env{'form.queue'} eq 'reviewqueue') {
Line 914  DONEBUTTON Line 1002  DONEBUTTON
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
  }   }
     } elsif ($target eq 'webgrade') {      } elsif ($target eq 'webgrade') {
  $result.="</table>\n<hr />";   $result.="</div>";
  #$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 923  DONEBUTTON Line 1011  DONEBUTTON
  #    &mt('Throw Away &amp; Stop Grading').'" /> ';   #    &mt('Throw Away &amp; Stop Grading').'" /> ';
  #$result.='<input type="submit" name="save" value="'.   #$result.='<input type="submit" name="save" value="'.
  #    &mt('Save Partial Grade and Continue Grading').'" /> ';   #    &mt('Save Partial Grade and Continue Grading').'" /> ';
  $result.='</form>'.&Apache::loncommon::endbodytag().'</html>';   $result.='</form>'."\n</div>\n</div>\n".
       &Apache::loncommon::end_page();
     } elsif ($target eq 'meta') {      } elsif ($target eq 'meta') {
  $result.=&Apache::response::meta_package_write('Task');   $result.=&Apache::response::meta_package_write('Task');
         $result.=&Apache::response::meta_stores_write('solved','string',          $result.=&Apache::response::meta_stores_write('solved','string',
Line 948  sub move_between_queues { Line 1037  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);
     if ($result ne 'ok') {      if ($result ne 'ok') {
  return $result;   return $result;
     }      }
Line 961  sub check_queue_unlock { Line 1050  sub check_queue_unlock {
     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 (!defined($key)) {      if (!defined($key)) {
  $key="$symb\0queue\0$uname\@$udom";   $key="$symb\0queue\0$uname:$udom";
     }      }
     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 $me=$env{'user.name'}.'@'.$env{'user.domain'};      my $me=$env{'user.name'}.':'.$env{'user.domain'};
     my $who=&queue_key_locked($queue,$key,$cdom,$cnum);      my $who=&queue_key_locked($queue,$key,$cdom,$cnum);
     if  ($who eq $me) {      if  ($who eq $me) {
  return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);   return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);
Line 1028  sub get_queue_data { Line 1117  sub get_queue_data {
     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="$symb\0queue\0$uname\@$udom";      my $todo="$symb\0queue\0$uname:$udom";
     my ($key,$value)=&Apache::lonnet::get($queue,[$todo],$cdom,$cnum);      my ($key,$value)=&Apache::lonnet::get($queue,[$todo],$cdom,$cnum);
     if ($key eq $todo && ref($value)) {      if ($key eq $todo && ref($value)) {
  return $value;   return $value;
Line 1047  sub check_queue_for_key { Line 1136  sub check_queue_for_key {
  if (defined($results{"$todo\0locked"})) {   if (defined($results{"$todo\0locked"})) {
     return 'locked';      return 'locked';
  }   }
  my $slot;   if (my $slot=&slotted_access($results{$todo})) {
  if (ref($results{$todo}) eq 'ARRAY')  {  
     $slot = $results{$todo}[0];  
  } elsif (ref($results{$todo}) eq 'HASH')  {  
     $slot = $results{$todo}{'slot'};  
  }  
  if (defined($slot)) {  
     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) { 
  return 'in_progress';   return 'in_progress';
     }      }
    } else {
       my ($symb) = &decode_queue_key($todo);
       my $due_date = &Apache::lonhomework::due_date('0',$symb);
       if ($due_date > time) {
    return 'in_progress';
       }
  }   }
  return 'enqueued';   return 'enqueued';
     }      }
Line 1074  sub add_to_queue { Line 1163  sub add_to_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"}=$user_data;      $data{"$symb\0queue\0$uname:$udom"}=$user_data;
     return &Apache::lonnet::cput($queue,\%data,$cdom,$cnum);      return &Apache::lonnet::cput($queue,\%data,$cdom,$cnum);
 }  }
   
Line 1101  sub show_queue { Line 1190  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 - $symb $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 ($end_time,$slot_text);
     my %slot_data=&Apache::lonnet::get_slot($slot);      if (my $slot=&slotted_access($queue{$key})) {
    my %slot_data=&Apache::lonnet::get_slot($slot);
    $end_time = $slot_data{'endtime'};
    $slot_text = &mt('Slot: [_1]',$slot);
       } else {
    $end_time = &Apache::lonhomework::due_date('0',$symb);
    $slot_text = '';
       }
     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 1138  sub show_queue { Line 1232  sub show_queue {
     $seclist.='<input type="hidden" name="chosensections"       $seclist.='<input type="hidden" name="chosensections" 
                                value="'.$sec.'" />';                                 value="'.$sec.'" />';
  }   }
  if (time > $slot_data{'endtime'}) {   if ($end_time ne '' && time > $end_time) {
     $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 1154  sub show_queue { Line 1249  sub show_queue {
 FORM  FORM
   
                 } else {                  } else {
     $result.='<td>'.&mt("In Progress").'</td>'      $result.='<td>'.&mt("In Progress").'</td><td>&nbsp;</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>";
  &Apache::lonlocal::locallocaltime($slot_data{'endtime'}).      $result.='<td>'.$slot_text.' End time: '.
    &Apache::lonlocal::locallocaltime($end_time).
  "</td></tr>";   "</td></tr>";
  }   }
     }      }
Line 1189  sub get_queue_counts { Line 1285  sub get_queue_counts {
  } elsif ($key!~/(timestamp|locked)$/) {   } elsif ($key!~/(timestamp|locked)$/) {
     my ($symb,$uname,$udom) = &decode_queue_key($key);      my ($symb,$uname,$udom) = &decode_queue_key($key);
     $entries++;      $entries++;
     my $slot=$queue{$key}->[0];      if (my $slot=&slotted_access($queue{$key})) {
     if (!exists($slot_cache{$slot})) {   if (!exists($slot_cache{$slot})) {
  my %slot_data=&Apache::lonnet::get_slot($slot);      my %slot_data=&Apache::lonnet::get_slot($slot);
  $slot_cache{$slot} = \%slot_data;      $slot_cache{$slot} = \%slot_data;
     }   }
     if (time > $slot_cache{$slot}{'endtime'}) {   if (time > $slot_cache{$slot}{'endtime'}) {
  $ready_to_grade++;      $ready_to_grade++;
    }
       } else {
    my $due_date = &Apache::lonhomework::due_date('0',$symb);
    if ($due_date ne '' && time > $due_date) {
       $ready_to_grade++;
    }
     }      }
  }   }
     }      }
Line 1204  sub get_queue_counts { Line 1306  sub get_queue_counts {
   
 sub encode_queue_key {  sub encode_queue_key {
     my ($symb,$udom,$uname)=@_;      my ($symb,$udom,$uname)=@_;
     return "$symb\0queue\0$uname\@$udom";      return "$symb\0queue\0$uname:$udom";
 }  }
   
 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);
     my ($uname,$udom) = split('@',$user);      my ($uname,$udom) = split(':',$user);
     return ($symb,$uname,$udom);      return ($symb,$uname,$udom);
 }  }
   
Line 1229  sub queue_key_locked { Line 1331  sub queue_key_locked {
     return undef;      return undef;
 }  }
   
   sub slotted_access {
       my ($queue_entry) = @_;
       if (ref($queue_entry) eq 'ARRAY') {
    if (defined($queue_entry->[0])) {
       return $queue_entry->[0];
    }
    return undef;
       } elsif (ref($queue_entry) eq 'HASH') {
    if (defined($queue_entry->{'slot'})) {
       return $queue_entry->{'slot'};
    }
    return undef;
       }
       return undef;
   }
   
 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      my @possible; # will hold queue entries that are valid to be selected
Line 1243  sub pick_from_queue_data { Line 1361  sub pick_from_queue_data {
  next;   next;
     }      }
  }   }
  my $slot=$queuedata->{$key}[0];   my $end_time;
  my %slot_data=&Apache::lonnet::get_slot($slot);   if (my $slot=&slotted_access($queuedata->{$key})) {
  if ($slot_data{'endtime'} > time) {       my %slot_data=&Apache::lonnet::get_slot($slot);
       if ($slot_data{'endtime'} < time) { 
    $end_time = $slot_data{'endtime'};
       }
    } else {
       my $due_date = &Apache::lonhomework::due_date('0',$symb);
       if ($due_date > time) {
    $end_time = $due_date;
       }
    }
    if ($end_time ne '') {
     &Apache::lonxml::debug("not time");      &Apache::lonxml::debug("not time");
     next;      next;
  }   }
   
  if (exists($queuedata->{"$key\0locked"})) {   if (exists($queuedata->{"$key\0locked"})) {
     &Apache::lonxml::debug("someone already has um.");      &Apache::lonxml::debug("someone already has um.");
     next;      next;
  }   }
  push(@possible,[$key,$slot_data{'endtime'}]);   push(@possible,[$key,$end_time]);
     }      }
     if (@possible) {      if (@possible) {
         # sort entries in order by slot end time          # sort entries in order by slot end time
  @possible = sort { $a->[1] <=> $b->[1] } @possible;   @possible = sort { $a->[1] <=> $b->[1] } @possible;
  # pick one of the first ten entries   # pick one of the entries in the top 10% in small queues and one
  my $max=($#possible < 10) ? $#possible : 10;   # of the first ten entries in large queues
  return $possible[int(rand($max))][0];   #my $ten_percent = int($#possible * 0.1);
    #if ($ten_percent < 1 ) { $ten_percent = 1;  }
    #if ($ten_percent > 10) { $ten_percent = 10; }
    #my $max=($#possible < $ten_percent) ? $#possible : $ten_percent;
   
    #return $possible[int(rand($max))][0];
    return $possible[0][0];
     }      }
     return undef;      return undef;
 }  }
Line 1268  sub pick_from_queue_data { Line 1403  sub pick_from_queue_data {
 sub find_mid_grade {  sub find_mid_grade {
     my ($queue,$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($queue,$todo,$cdom,$cnum);   my $who=&queue_key_locked($queue,$todo,$cdom,$cnum);
  if ($who eq $me) { return $todo; }   if ($who eq $me) { return $todo; }
Line 1288  sub find_mid_grade { Line 1423  sub find_mid_grade {
   
 sub lock_key {  sub lock_key {
     my ($queue,$todo)=@_;      my ($queue,$todo)=@_;
     my $me=$env{'user.name'}.'@'.$env{'user.domain'};      my $me=$env{'user.name'}.':'.$env{'user.domain'};
     my (undef,$cid)=&Apache::lonxml::whichuser();      my (undef,$cid)=&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'};
Line 1443  sub select_user { Line 1578  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 1454  sub select_user { Line 1591  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 1474  RESULT Line 1611  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 1597  sub get_instance { Line 1737  sub get_instance {
   
 {  {
     my $last_link;      my $last_link;
       sub link {
    my ($instance,$id) = @_;
    return 'LC_GRADING_criteria_'.$instance.'_'.$id;
       }
     sub end_Dimension {      sub end_Dimension {
  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;   my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
  my $result=&Apache::lonxml::endredirection();   my $result=&Apache::lonxml::endredirection();
Line 1621  sub get_instance { Line 1765  sub get_instance {
     if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {      if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {
  $mandatory='Optional';   $mandatory='Optional';
     }      }
     my $dim_info="<div class='$dim_status'>\n";      my $dim_info="<div class='LC_$dim_status LC_question_grade'>\n";
     if ($dim_status eq 'pass') {      if ($dim_status eq 'pass') {
  $dim_info.='<h3>Question : you passed this '.$mandatory.' question</h3>';   $dim_info.='<h3>Question : you passed this '.$mandatory.' question</h3>';
     }      }
Line 1671  sub get_instance { Line 1815  sub get_instance {
  my $status_display=$status;   my $status_display=$status;
  $status_display=~s/^([a-z])/uc($1)/e;   $status_display=~s/^([a-z])/uc($1)/e;
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.='<div class="'.$status.'"><h4>'.$mandatory.   $result.=
     ' Criteria</h4><p>';      '<div class="LC_'.$status.' LC_criteria"><h4>'
       .$mandatory.' Criteria</h4><p>';
  @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="LC_grade">'.$status_display.'</p>';
  if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}) {   if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}) {
     $result.='<p class="comment">'.$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}.'</p>';      $result.='<p class="LC_comment">'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}).'</p>';
  }   }
  $result.='</div>';   $result.='</div>';
     }      }
Line 1690  sub get_instance { Line 1835  sub get_instance {
     @Apache::scripttag::parser_env = @_;      @Apache::scripttag::parser_env = @_;
     &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=&link($instance,$id);
  my $status=$Apache::lonhomework::history{"resource.$version.0.$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="LC_GRADING_criteria" id="'.$link.'">'."\n".
     '<a name="'.$link.'" />'.      '<div class="LC_GRADING_criteriatext" id="next_'.$last_link.'">'."\n";
     '<a name="next_'.$last_link.'" />'.  
     '<br /><textarea enabled="false" style="width:100%" rows="8" width="25" wrap="hard">';  
  @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="LC_GRADING_grade">'."\n".
     '<td><nobr>Additional Comment for Student</nobr> <br />'.      '<label class="LC_GRADING_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.0.$dim.$instance.$id.comment"}).'</textarea>'.      '<label class="LC_GRADING_fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".
     '</td>'.      '<label class="LC_GRADING_pass"><input type="radio" name="HWVAL_'.$link.'" value="pass" '.($status eq 'pass' ? 'checked="checked"':'').' />'.&mt('Pass').'</label>'."\n".
     '<td>'.      '<label class="LC_GRADING_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="LC_GRADING_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="LC_GRADING_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="LC_GRADING_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";
    $result.=&grading_history($version,$dim,$instance,$id);
  $last_link=$link;   $last_link=$link;
     }      }
  } elsif ($target eq 'grade' && $env{'form.webgrade'}) {   } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
Line 1722  sub get_instance { Line 1866  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.0.$dim.$instance.$id.status"}=$env{'form.HWVAL_criteria_'.$instance.'_'.$id};   my $link=&link($instance,$id);
  $Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.comment"}=$env{'form.HWVAL_comment_criteria_'.$instance.'_'.$id};   my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.status"}=$env{'form.HWVAL_'.$link};
    $Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
  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 1762  sub get_instance { Line 1907  sub get_instance {
     }      }
 }  }
   
   sub grading_history {
       my ($version,$dim,$instance,$criteria) = @_;
       if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
    return '';
       }
       my ($result,$grader);
       my $scope="resource.$version.0.$dim.$instance.$criteria";
       foreach my $t (1..$Apache::lonhomework::history{'version'}) {
    if (exists($Apache::lonhomework::history{$t.':resource.0.regrader'})) {
       my ($gname,$gdom) = 
    split(':',$Apache::lonhomework::history{$t.':resource.0.regrader'});
       my $fullname = &Apache::loncommon::plainname($gname,$gdom);
       $grader = &Apache::loncommon::aboutmewrapper($fullname,
    $gname,$gdom);
    }
    my $entry;
    if (exists($Apache::lonhomework::history{"$t:$scope.status"})) {
       $entry.="<tt>".$Apache::lonhomework::history{"$t:$scope.status"}.'</tt>';
    }
    if (exists($Apache::lonhomework::history{"$t:$scope.comment"})) {
       $entry.=' comment: "'.$Apache::lonhomework::history{"$t:$scope.comment"}.'"';
    }
    if ($entry) {
       $result.= "<li>$grader : $entry </li>";
    }
       }
       if ($result) {
    return '<ul class="LC_GRADING_pastgrading">'.$result.'</ul>';
       }
       return '';
   }
   
 sub start_IntroParagraph {  sub start_IntroParagraph {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
Line 1769  sub start_IntroParagraph { Line 1946  sub start_IntroParagraph {
  if ($tagstack->[-2] eq 'Dimension') {   if ($tagstack->[-2] eq 'Dimension') {
     $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style);      $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style);
   
  } elsif ($target eq 'webgrade') {   } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
     &Apache::lonxml::get_all_text('/introparagraph',$parser,$style);      &Apache::lonxml::startredirection();
  }   }
   
     }      }
Line 1778  sub start_IntroParagraph { Line 1955  sub start_IntroParagraph {
 }  }
   
 sub end_IntroParagraph {  sub end_IntroParagraph {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       if ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
    my $result = &Apache::lonxml::endredirection();
       }
 }  }
   
 sub start_Instance {  sub start_Instance {
Line 1845  sub proctor_validation_screen { Line 2026  sub proctor_validation_screen {
 <h2>Proctor Validation</h2>  <h2>Proctor Validation</h2>
     <p>Your room's proctor needs to validate your access to this resource.</p>      <p>Your room's proctor needs to validate your access to this resource.</p>
     $msg      $msg
 <form name="checkout" method="POST" action="$env{'request.uri'}">  <form name="checkout" method="post" action="$env{'request.uri'}">
 <input type="hidden" name="validate" value="yes" />  <input type="hidden" name="validate" value="yes" />
 <input type="hidden" name="submitted" value="yes" />  <input type="hidden" name="submitted" value="yes" />
 <table>  <table>
Line 1860  sub proctor_validation_screen { Line 2041  sub proctor_validation_screen {
       <tr><td colspan="2">Student who should be logged in is:</td></tr>        <tr><td colspan="2">Student who should be logged in is:</td></tr>
       <tr><td>Name:</td><td>$name</td></tr>        <tr><td>Name:</td><td>$name</td></tr>
       <tr><td>Student ID:</td><td>$env{'environment.id'}</td></tr>        <tr><td>Student ID:</td><td>$env{'environment.id'}</td></tr>
       <tr><td>Usename</td><td>$user\@$domain</td></tr>        <tr><td>Usename</td><td>$user:$domain</td></tr>
       <tr><td colspan="2"><img src="$url" /></td></tr>        <tr><td colspan="2"><img src="$url" /></td></tr>
     </table>      </table>
   </tr></td>    </tr></td>

Removed from v.1.99  
changed lines
  Added in v.1.149


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