Diff for /loncom/homework/bridgetask.pm between versions 1.133 and 1.151

version 1.133, 2006/03/30 16:49:12 version 1.151, 2006/05/16 06:43:42
Line 40  use Apache::slotrequest(); Line 40  use Apache::slotrequest();
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Instance','InstanceText','Criteria','ClosingParagraph'));      &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','Instance','InstanceText','Criteria','ClosingParagraph'));
 }  }
   
 sub initialize_bridgetask {  sub initialize_bridgetask {
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 79  sub proctor_check_auth { Line 79  sub proctor_check_auth {
     $authenticated=1;      $authenticated=1;
  }   }
     }      }
     if ($authenticated && $type eq 'Task') {      if ($authenticated) {
  # increment version   &create_new_version($type,$user,$domain,$slot_name);
  my $version=  
     $Apache::lonhomework::history{'resource.0.version'};  
  $version++;  
   
  #clean out all current results  
  foreach my $key (keys(%Apache::lonhomework::history)) {  
     if ($key=~/^resource\.0\./) {  
  $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;  
     }      }
  }   }
     }      }
     return 0;      return 0;
 }  }
   
   sub create_new_version {
       my ($type,$user,$domain,$slot_name) = @_;
       if ($type eq 'Task') {
    # increment version
    my $version=
       $Apache::lonhomework::history{'resource.0.version'};
    $version++;
   
    #clean out all current results
    foreach my $key (keys(%Apache::lonhomework::history)) {
       if ($key=~/^resource\.0\./) {
    $Apache::lonhomework::results{$key}='';
       }
    }
   
    #setup new version and who did it
    $Apache::lonhomework::results{'resource.0.version'}=$version;
    if (defined($user) && defined($domain)) {
       $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
    $user.':'.$domain;
    }
    if (defined($slot_name)) {
       $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=
    $slot_name;
    }
       } elsif ($type eq 'problem') {
    &Apache::lonxml::debug("authed $slot_name");
    if (defined($user) && defined($domain)) {
       $Apache::lonhomework::results{"resource.0.checkedin"}=
    $user.':'.$domain;
    }
    if (defined($slot_name)) {
       $Apache::lonhomework::results{"resource.0.checkedin.slot"}=
    $slot_name;
    }
       }
   }
   
 sub get_version {  sub get_version {
     my ($version,$previous);      my ($version,$previous);
     if ($env{'form.previousversion'} &&       if ($env{'form.previousversion'} && 
Line 120  sub get_version { Line 134  sub get_version {
  $version=$env{'form.previousversion'};   $version=$env{'form.previousversion'};
  $previous=1;   $previous=1;
     } else {      } else {
  $version=$Apache::lonhomework::history{'resource.0.version'};   if (defined($Apache::lonhomework::results{'resource.0.version'})) {
       $version=$Apache::lonhomework::results{'resource.0.version'};
    } elsif (defined($Apache::lonhomework::history{'resource.0.version'})) {
       $version=$Apache::lonhomework::history{'resource.0.version'};
    }
  $previous=0;   $previous=0;
     }      }
     if (wantarray) {      if (wantarray) {
Line 170  sub add_grading_button { Line 188  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;
Line 214  sub add_grading_button { Line 232  sub add_grading_button {
    'gradingdomain');     'gradingdomain');
  $result.=&Apache::loncommon::studentbrowser_javascript();   $result.=&Apache::loncommon::studentbrowser_javascript();
  $result.= '</p>';   $result.= '</p>';
   }      }
     return $result;      return $result;
 }  }
   
Line 223  sub add_request_another_attempt_button { Line 241  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 278  sub show_task { Line 302  sub show_task {
        ( $status eq 'NOT_IN_A_SLOT') ||         ( $status eq 'NOT_IN_A_SLOT') ||
        ( $status eq 'NEEDS_CHECKIN') ||         ( $status eq 'NEEDS_CHECKIN') ||
        ( $status eq 'WAITING_FOR_GRADE') ||         ( $status eq 'WAITING_FOR_GRADE') ||
        ( $status eq 'INVALID_ACCESS') )) {         ( $status eq 'INVALID_ACCESS') ||
          ( &get_version() eq ''))) {
  return 0;   return 0;
     }      }
     if ($env{'form.donescreen'}) { return 0; }      if ($env{'form.donescreen'}) { return 0; }
Line 349  sub webgrade_standard_info { Line 374  sub webgrade_standard_info {
   
     my %lt=&Apache::lonlocal::texthash('done' => 'Next Item',      my %lt=&Apache::lonlocal::texthash('done' => 'Next Item',
        'stop' => 'Quit Grading',         'stop' => 'Quit Grading',
          'fail' => 'Fail Rest',
        );         );
                 
     my $result=<<INFO;      my $result=<<INFO;
   <div class="LC_GRADING_maincontrols">    <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>    </div>
   $file_list    $file_list
 INFO  INFO
Line 375  sub start_Task { Line 403  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)=  
  &Apache::structuretags::page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);  
       
     $head_tag_start .= &style($target);  
     $body_tag_start .= '<div class="LC_task">'."\n";  
   
       my $name;
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $head_tag_start.='<title>'.   $name = &Apache::structuretags::get_resource_name($parstack,$safeeval);
     &Apache::structuretags::get_resource_name($parstack,$safeeval).      }
     '</title>';  
       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" name="slotrequest" 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="'.
Line 405  sub start_Task { Line 437  sub start_Task {
  my $target_id =    my $target_id = 
     &Apache::lonstathelpers::make_target_id({symb => $symb,      &Apache::lonstathelpers::make_target_id({symb => $symb,
      part => '0'});       part => '0'});
  $body_tag_start.='<form method="post" name="gradingstatus" action="/adm/statistics">'.   $result.='<form method="post" name="gradingstatus" action="/adm/statistics">'.
     '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.      '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.
     '<input type="hidden" name="reportSelected" value="grading_analysis" />'.      '<input type="hidden" name="reportSelected" value="grading_analysis" />'.
     '<input type="submit" name="grading" value="'.      '<input type="submit" name="grading" value="'.
Line 422  sub start_Task { Line 454  sub start_Task {
  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_slot_access('0','Task');      &Apache::lonhomework::check_slot_access('0','Task');
    if ($status eq 'CAN_ANSWER' && $version eq '' && $slot_name eq '') {
       &create_new_version('Task');
       ($version,$previous)=&get_version();
    }
   
  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.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 490  DONESCREEN Line 526  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') {
     $result.="$head_tag_start</head>  
               $body_tag_start \n";  
       
     $result.=&preserve_grade_info();      $result.=&preserve_grade_info();
     $result.=&internal_location();      $result.=&internal_location();
     $result.=$form_tag_start.      $result.=$form_tag_start.
Line 510  DONESCREEN Line 548  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.      $result.= "\n".'<div class="LC_GRADING_task">'."\n".
  '</head>'.$body_tag_start.  
  "\n".'<div class="LC_GRADING_task">'."\n".  
  '<script type="text/javascript"    '<script type="text/javascript" 
                          src="/res/adm/includes/task_grading.js"></script>';                           src="/res/adm/includes/task_grading.js"></script>';
     #$result.='<br />Review'.&show_queue('reviewqueue');      #$result.='<br />Review'.&show_queue('reviewqueue');
Line 596  DONESCREEN Line 632  DONESCREEN
     $result.="\n".'<div id="LC_GRADING_criterialist">';      $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 632  sub get_key_todo { Line 668  sub get_key_todo {
     }      }
   
   
     my $me=$env{'user.name'}.'@'.$env{'user.domain'};      my $me=$env{'user.name'}.':'.$env{'user.domain'};
   
     #need to try both queues..      #need to try both queues..
     if (defined($env{'form.regradeaspecificsubmission'}) &&      if (defined($env{'form.regradeaspecificsubmission'}) &&
Line 678  sub get_key_todo { Line 714  sub get_key_todo {
  #otherwise (defined($who) && $who ne $me) some else has it...   #otherwise (defined($who) && $who ne $me) some else has it...
  return (undef,'not_allowed',   return (undef,'not_allowed',
  &mt('Another user ([_1]) currently has the record for [_2] locked.',   &mt('Another user ([_1]) currently has the record for [_2] locked.',
     $who,$env{'form.gradinguser'}.'@'.$env{'form.gradingdomain'}));      $who,$env{'form.gradinguser'}.':'.$env{'form.gradingdomain'}));
     }      }
   
   
Line 801  DONEBUTTON Line 837  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='LC_$bt_status LC_criteria'>\n";      my $status = "\n<div class='LC_$bt_status LC_criteria'>\n";
           
Line 834  DONEBUTTON Line 878  DONEBUTTON
     $man_count++;      $man_count++;
  }   }
     }      }
       
     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'; }
Line 842  DONEBUTTON Line 887  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') {      &Apache::loncommon::end_page({'discussion' => 1});
  $result.="\n</div>\n".&Apache::lonxml::xmlend().'</html>';  
     }      }
  }   }
  if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {   if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {
Line 868  DONEBUTTON Line 912  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 906  DONEBUTTON Line 959  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 984  DONEBUTTON Line 1037  DONEBUTTON
  #$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>'."\n</div>\n</div>\n".   $result.='</form>'."\n</div>\n</div>\n".
     &Apache::loncommon::endbodytag().'</html>';      &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 1009  sub move_between_queues { Line 1062  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 1022  sub check_queue_unlock { Line 1075  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 1089  sub get_queue_data { Line 1142  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 1108  sub check_queue_for_key { Line 1161  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 1135  sub add_to_queue { Line 1188  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 1178  sub show_queue { Line 1231  sub show_queue {
  &Apache::lonlocal::locallocaltime($queue{$key})."</td></tr>";   &Apache::lonlocal::locallocaltime($queue{$key})."</td></tr>";
  } elsif ($key!~/(timestamp|locked)$/) {   } elsif ($key!~/(timestamp|locked)$/) {
     $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,$status)=('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"});      $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'));
Line 1197  sub show_queue { Line 1257  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>$status</td>
 <td>  <td>
Line 1214  sub show_queue { Line 1274  sub show_queue {
 FORM  FORM
   
                 } else {                  } else {
     $result.='<td>'.&mt("In Progress").'</td>'      $result.='<td>'.&mt("In Progress").'</td><td>&nbsp;</td>'
  }   }
     }      }
     $result.= "<td>".$fullname->{$uname.':'.$udom}.      $result.= "<td>".$fullname->{$uname.':'.$udom}.
  " <tt>($uname\@$udom)</tt> </td>";   " <tt>($uname:$udom)</tt> </td>";
     $result.='<td>Slot: '.$slot.' End time: '.      $result.='<td>'.$slot_text.' End time: '.
  &Apache::lonlocal::locallocaltime($slot_data{'endtime'}).   &Apache::lonlocal::locallocaltime($end_time).
  "</td></tr>";   "</td></tr>";
  }   }
     }      }
Line 1250  sub get_queue_counts { Line 1310  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 1265  sub get_queue_counts { Line 1331  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 1290  sub queue_key_locked { Line 1356  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 1304  sub pick_from_queue_data { Line 1386  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 1329  sub pick_from_queue_data { Line 1428  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 1349  sub find_mid_grade { Line 1448  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 1611  sub get_id { Line 1710  sub get_id {
 }  }
   
 my %dimension;  my %dimension;
   sub start_Question { return &start_Dimension(@_); }
 sub start_Dimension {  sub start_Dimension {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     undef(%dimension);      undef(%dimension);
Line 1653  sub get_instance { Line 1753  sub get_instance {
  }   }
  @instances = &Math::Random::random_permutation(@instances);   @instances = &Math::Random::random_permutation(@instances);
  $instance  = $instances[($version-1)%scalar(@instances)];   $instance  = $instances[($version-1)%scalar(@instances)];
  $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} =    if ($version =~ /^\d$/) {
     $instance;      $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} = 
  $Apache::lonhomework::results{'INTERNAL_store'} = 1;    $instance;
       $Apache::lonhomework::results{'INTERNAL_store'} = 1; 
    }
  &Apache::response::poprandomnumber();   &Apache::response::poprandomnumber();
  return $instance;   return $instance;
     }      }
Line 1664  sub get_instance { Line 1766  sub get_instance {
 {  {
     my $last_link;      my $last_link;
     sub link {      sub link {
  my ($instance,$id) = @_;   my ($id) = @_;
  return 'LC_GRADING_criteria_'.$instance.'_'.$id;   $id =~ s/\./_/g;
    return 'LC_GRADING_criteria_'.$id;
     }      }
       sub end_Question { return &end_Dimension(@_); }
     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();
  my $dim=&get_id($parstack,$safeeval);   my $dim=&get_id($parstack,$safeeval);
  my $instance=&get_instance($dim);   my $instance=&get_instance($dim);
  my $version=&get_version();   my $version=&get_version();
       use Data::Dumper;
       &Apache::lonxml::debug(Dumper(\%dimension));
  if ($target eq 'web') {   if ($target eq 'web') {
     @Apache::scripttag::parser_env = @_;      @Apache::scripttag::parser_env = @_;
     $result.=&Apache::scripttag::xmlparse($dimension{'intro'});      $result.=&Apache::scripttag::xmlparse($dimension{'intro'});
Line 1702  sub get_instance { Line 1808  sub get_instance {
     my $man_passed=0;      my $man_passed=0;
     my $opt_count=0;      my $opt_count=0;
     my $opt_passed=0;      my $opt_passed=0;
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {      foreach my $id ( @{$dimension{$instance.'.criterias'}},
  if ($dimension{$instance.'.criteria.'.$id.'.mandatory'}        @{$dimension{'criterias'}} ) {
    if ($dimension{'criteria.'.$id.'.mandatory'} 
     eq 'N') {      eq 'N') {
     $opt_count++;      $opt_count++;
     if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {      if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"} eq 'pass') {
  $opt_passed++;   $opt_passed++;
     }      }
  } else {   } else {
Line 1717  sub get_instance { Line 1824  sub get_instance {
  }   }
     }      }
     if ($man_passed eq $man_count) { $man_passed='all'; }      if ($man_passed eq $man_count) { $man_passed='all'; }
   
     my $opt_req=$dimension{$instance.'.optionalrequired'};      my $opt_req=$dimension{$instance.'.optionalrequired'};
     if ($opt_req !~ /\S/) { $opt_req='0'; }      if ($opt_req !~ /\S/) {
    $opt_req=
       &Apache::lonxml::get_param('OptionalRequired',
          $parstack,$safeeval);
    if ($opt_req !~ /\S/) { $opt_req = 0; }
       }
     $dim_info.="\n<p>".&mt('You passed [_1] of the [_2] mandatory components and [_3] of the [_4] optional components, of which you were required to pass [_5].',$man_passed,$man_count,$opt_passed,$opt_count,$opt_req)."</p>\n</div>";      $dim_info.="\n<p>".&mt('You passed [_1] of the [_2] mandatory components and [_3] of the [_4] optional components, of which you were required to pass [_5].',$man_passed,$man_count,$opt_passed,$opt_count,$opt_req)."</p>\n</div>";
   
     my $internal_location=&internal_location($dim);      my $internal_location=&internal_location($dim);
     $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.0.$dim.$instance.$id.status"};      @{$dimension{'criterias'}}) {
  my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"};   my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
  my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');   my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"};
    my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N');
  if ($mandatory) {   if ($mandatory) {
     $mandatory='Mandatory';      $mandatory='Mandatory';
  } else {   } else {
Line 1740  sub get_instance { Line 1854  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 = @_;  
  $result.=   $result.=
     '<div class="LC_'.$status.' LC_criteria"><h4>'      '<div class="LC_'.$status.' LC_criteria"><h4>'
     .$mandatory.' Criteria</h4><p>';      .$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{'criteria.'.$id});
  $result.='</p><p class="LC_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.$id.comment"}) {
     $result.='<p class="LC_comment">'.&mt('Comment: [_1]',$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.$id.comment"}).'</p>';
  }   }
  $result.='</div>';   $result.='</div>';
     }      }
Line 1760  sub get_instance { Line 1873  sub get_instance {
     &Apache::scripttag::xmlparse($dimension{'intro'});      &Apache::scripttag::xmlparse($dimension{'intro'});
     @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=&link($instance,$id);      @{$dimension{'criterias'}} ) {
  my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};   my $link=&link($id);
    my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
  $result.='<div class="LC_GRADING_criteria" id="'.$link.'">'."\n".   $result.='<div class="LC_GRADING_criteria" id="'.$link.'">'."\n".
     '<a name="'.$link.'" />'."\n".      '<div class="LC_GRADING_criteriatext" id="next_'.$last_link.'">'."\n";
     '<a name="next_'.$last_link.'" />'."\n".  
     '<div class="LC_GRADING_criteriatext">'."\n";  
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});   $result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id});
  $result.='</div>'."\n".   $result.='</div>'."\n".
     #$dimension{$instance.'.criteria.'.$id}.      #$dimension{'criteria.'.$id}.
     '<div class="LC_GRADING_grade">'."\n".      '<div class="LC_GRADING_grade">'."\n".
     '<label class="LC_GRADING_ungraded"><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label>'."\n".      '<label class="LC_GRADING_ungraded"><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label>'."\n".
     '<label class="LC_GRADING_fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".      '<label class="LC_GRADING_fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".
Line 1778  sub get_instance { Line 1890  sub get_instance {
     '<label class="LC_GRADING_review"><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label>'."\n".      '<label class="LC_GRADING_review"><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label>'."\n".
     '</div>'."\n".      '</div>'."\n".
     '<label class="LC_GRADING_comment">'.&mt('Additional Comment for Student')."\n".      '<label class="LC_GRADING_comment">'.&mt('Additional Comment for Student')."\n".
     '<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".      '<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'</textarea>'."\n".
     '</label>'."\n".      '</label>'."\n".
     '<ul class="LC_GRADING_navbuttons">'."\n".      '<ul class="LC_GRADING_navbuttons">'."\n".
     '<li><a href="#'.$last_link.'">Prev</a></li>'."\n".      '<li><a href="#'.$last_link.'">Prev</a></li>'."\n".
     '<li><a href="#next_'.$link.'">Next</a></li>'."\n".      '<li><a href="#next_'.$link.'">Next</a></li>'."\n".
     '</ul>'."\n".      '</ul>'."\n".
                     '</div>'."\n";                      '</div>'."\n";
  $result.=&grading_history($version,$dim,$instance,$id);   $result.=&grading_history($version,$dim,$id);
  $last_link=$link;   $last_link=$link;
     }      }
  } elsif ($target eq 'grade' && $env{'form.webgrade'}) {   } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
Line 1793  sub get_instance { Line 1905  sub get_instance {
     my $mandatory_failed=0;      my $mandatory_failed=0;
     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 $link=&link($instance,$id);      @{$dimension{'criterias'}}) {
  my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.status"}=$env{'form.HWVAL_'.$link};   my $link=&link($id);
  $Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.comment"}=$env{'form.HWVAL_comment_'.$link};   my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$id.status"}=$env{'form.HWVAL_'.$link};
  my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');   $Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
    my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N');
  if ($status eq 'pass') {   if ($status eq 'pass') {
     if (!$mandatory) { $optional_passed++; }      if (!$mandatory) { $optional_passed++; }
  } elsif ($status eq 'fail') {   } elsif ($status eq 'fail') {
Line 1810  sub get_instance { Line 1923  sub get_instance {
     $ungraded++;      $ungraded++;
  }   }
     }      }
     if ($optional_passed < $dimension{$instance.'.optionalrequired'}) {      # FIXME optional required can apply to only <instance> right now...
       my $opt_req=$dimension{$instance.'.optionalrequired'};
       if ($opt_req !~ /\S/) {
    $opt_req=
       &Apache::lonxml::get_param('OptionalRequired',
          $parstack,$safeeval);
    if ($opt_req !~ /\S/) { $opt_req = 0; }
       }
       if ($optional_passed < $opt_req) {
  $mandatory_failed++;   $mandatory_failed++;
     }      }
     &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");
Line 1836  sub get_instance { Line 1957  sub get_instance {
 }  }
   
 sub grading_history {  sub grading_history {
     my ($version,$dim,$instance,$criteria) = @_;      my ($version,$dim,$id) = @_;
     if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {      if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
  return '';   return '';
     }      }
     my ($result,$grader);      my ($result,$grader);
     my $scope="resource.$version.0.$dim.$instance.$criteria";      my $scope="resource.$version.0.$dim.$id";
     foreach my $t (1..$Apache::lonhomework::history{'version'}) {      foreach my $t (1..$Apache::lonhomework::history{'version'}) {
  if (exists($Apache::lonhomework::history{$t.':resource.0.regrader'})) {   if (exists($Apache::lonhomework::history{$t.':resource.0.regrader'})) {
     my ($gname,$gdom) =       my ($gname,$gdom) = 
  split('@',$Apache::lonhomework::history{$t.':resource.0.regrader'});   split(':',$Apache::lonhomework::history{$t.':resource.0.regrader'});
     my $fullname = &Apache::loncommon::plainname($gname,$gdom);      my $fullname = &Apache::loncommon::plainname($gname,$gdom);
     $grader = &Apache::loncommon::aboutmewrapper($fullname,      $grader = &Apache::loncommon::aboutmewrapper($fullname,
  $gname,$gdom);   $gname,$gdom);
Line 1871  sub start_IntroParagraph { Line 1992  sub start_IntroParagraph {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      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' || $tagstack->[-2] eq 'Question' ) {
     $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style);      $dimension{'intro'}=
    &Apache::lonxml::get_all_text('/introparagraph',
  } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {        $parser,$style);
           } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
     &Apache::lonxml::startredirection();      &Apache::lonxml::startredirection();
  }   }
   
Line 1923  sub end_InstanceText { Line 2045  sub end_InstanceText {
   
 sub start_Criteria {  sub start_Criteria {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $instance_id=$Apache::bridgetask::instance[-1];  
     my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser,$style);      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;   if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {
  $dimension{$instance_id.'.criteria.'.$id.'.mandatory'}=      my $instance_id=$Apache::bridgetask::instance[-1];
     &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);      $dimension{"criteria.$instance_id.$id"}=$criteria;
  push(@{$dimension{$instance_id.'.criterias'}},$id);      $dimension{"criteria.$instance_id.$id.mandatory"}=
    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
       push(@{$dimension{$instance_id.'.criterias'}},"$instance_id.$id");
    } else {
       $dimension{'criteria.'.$id}=$criteria;
       $dimension{'criteria.'.$id.'.mandatory'}=
    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
       push(@{$dimension{'criterias'}},$id);
    }
     }      }
     return '';      return '';
 }  }
Line 1969  sub proctor_validation_screen { Line 2098  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.133  
changed lines
  Added in v.1.151


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