Diff for /loncom/homework/bridgetask.pm between versions 1.126 and 1.180

version 1.126, 2006/03/28 22:03:47 version 1.180, 2006/06/28 21:46:53
Line 38  use Apache::lonlocal; Line 38  use Apache::lonlocal;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::slotrequest();  use Apache::slotrequest();
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
    
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Instance','InstanceText','Criteria','ClosingParagraph'));      &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','QuestionText','Setup','Instance','InstanceText','Criteria','ClosingParagraph'));
 }  }
   
   my %dimension;
 sub initialize_bridgetask {  sub initialize_bridgetask {
     # id of current Dimension, 0 means that no dimension is current       # id of current Dimension, 0 means that no dimension is current 
     # (inside <Task> only)      # (inside <Task> only)
     $Apache::bridgetask::dimension='';      @Apache::bridgetask::dimension=();
     # list of all Dimension ids seen      # list of all Dimension ids seen
     @Apache::bridgetask::dimensionlist=();      %Apache::bridgetask::top_dimensionlist=();
     # mandatory attribute of all Dimensions seen  
     %Apache::bridgetask::dimensionmandatory=();  
     # list of all current Instance ids      # list of all current Instance ids
     @Apache::bridgetask::instance=();      %Apache::bridgetask::instance=();
     # list of all Instance ids seen in this problem      # list of all Instance ids seen in this problem
     @Apache::bridgetask::instancelist=();      @Apache::bridgetask::instancelist=();
     # key of queud user data that we are currently grading      # key of queud user data that we are currently grading
     $Apache::bridgetask::queue_key='';      $Apache::bridgetask::queue_key='';
       undef(%dimension);
 }  }
   
 sub proctor_check_auth {  sub proctor_check_auth {
Line 66  sub proctor_check_auth { Line 69  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 82  sub proctor_check_auth {
     $authenticated=1;      $authenticated=1;
  }   }
     }      }
     if ($authenticated && $type eq 'Task') {      if ($authenticated) {
  # increment version   &check_in($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 check_in {
       my ($type,$user,$domain,$slot_name) = @_;
       my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
       if ( $useslots eq 'map_map') {
    &check_in_sequence($user,$domain,$slot_name);
       } else {
    &create_new_version($type,$user,$domain,$slot_name);
       }
       return 1;
   }
   
   sub check_in_sequence {
       my ($user,$domain,$slot_name) = @_;
       my $navmap = Apache::lonnavmaps::navmap->new();
       my ($symb) = &Apache::lonxml::whichuser();
       my ($map)  = &Apache::lonnet::decode_symb($symb);
       my @resources = 
    $navmap->retrieveResources($map, sub { $_[0]->is_problem() },0,0);
       my %old_history = %Apache::lonhomework::history;
       my %old_results = %Apache::lonhomework::results;
   
       foreach my $res (@resources) {
    &Apache::lonxml::debug("doing ".$res->src);
    &Apache::structuretags::initialize_storage($res->symb);
    my $type = ($res->is_task()) ? 'Task' : 'problem';
    &create_new_version($type,$user,$domain,$slot_name);
    &Apache::structuretags::finalize_storage($res->symb);
       }
       
       %Apache::lonhomework::history = %old_history;
       %Apache::lonhomework::results = %old_results;
   }
   
   sub create_new_version {
       my ($type,$user,$domain,$slot_name) = @_;
       
       my $id = '0';
       if ($type eq 'Task') {
    # increment version
    my $version=
       $Apache::lonhomework::history{'resource.0.version'};
    $version++;
    &Apache::lonxml::debug("Making 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;
    $id = "$version.0";
    if (!defined($user) || !defined($domain)) {
       $user = $env{'user.name'};
       $domain = $env{'user.domain'};
    }
   
       } elsif ($type eq 'problem') {
    &Apache::lonxml::debug("authed $slot_name");
       }
   
       if (defined($user) && defined($domain)) {
    $Apache::lonhomework::results{"resource.$id.checkedin"}=
       $user.':'.$domain;
       }
       if (defined($slot_name)) {
    $Apache::lonhomework::results{"resource.$id.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 171  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 225  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 269  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 278  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 236  STUFF Line 297  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=&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.'" />'.
Line 278  sub show_task { Line 339  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; }
     return 1;      return 1;
 }  }
   
   my @delay;
   sub nest { 
       if (@delay) {
    return $delay[-1];
       } else {
    return;
       }
   }
   
   sub nested_parse {
       my ($str,$env,$args) = @_;
       my @old_env = @Apache::scripttag::parser_env;
       @Apache::scripttag::parser_env = @$env;
       if (exists($args->{'set_dim_id'})) {
    &enable_dimension_parsing($args->{'set_dim_id'});
       }
       push(@delay,(($args->{'delayed_dim_results'})? 1 : 0));
       my $result = &Apache::scripttag::xmlparse($$str);
       pop(@delay);
       if (exists($args->{'set_dim_id'})) {
    &disable_dimension_parsing();
       }
       @Apache::scripttag::parser_env = @old_env;
       if ($args->{'delayed_dim_results'}) {
    my $dim = &get_dim_id();
    &Apache::lonxml::debug(" tossing out $result ");
    &Apache::lonxml::debug(" usining out $dim 's  ". $dimension{$dim}{'result'});
    return $dimension{$dim}{'result'};
       }
       return $result;
   }
   
 sub internal_location {  sub internal_location {
     my ($id)=@_;      my ($id)=@_;
     return '<!-- LONCAPA_INTERNAL_ADD_TASK_STATUS'.$id.' -->';      return '<!-- LONCAPA_INTERNAL_ADD_TASK_STATUS'.$id.' -->';
Line 334  sub file_list { Line 428  sub file_list {
  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><span style="white-space: nowrap;"><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.
     &Apache::loncommon::icon($file).'" border="0"> '.$file.      &Apache::loncommon::icon($file).'" alt="file icon" border="0" /> '.$file.
     '</a></nobr></li>'."\n";      '</a></span></li>'."\n";
     }      }
     $file_list.="</ul>\n";      $file_list.="</ul>\n";
     return $file_list;      return $file_list;
 }  }
   
   sub grade_mode {
       if ($env{'form.regrade'} || $env{'form.regradeaspecificsubmission'}) {
    return 'regrade';
       }
       return 'queue_grade';
   }
   
 sub webgrade_standard_info {  sub webgrade_standard_info {
     my ($version)=&get_version();      my ($version)=&get_version();
   
     my $file_list = &file_list($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"});      my $file_list = &file_list($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"});
   
     my %lt=&Apache::lonlocal::texthash('done' => 'Next Item',      my %lt=('done'   => 'Next Item',
        'stop' => 'Quit Grading',      'stop'   => 'Quit Grading',
        );      'fail'   => 'Fail Rest',
              'cancel' => 'Cancel',
       );
       %lt=&Apache::lonlocal::texthash(%lt);
   
     my $result=<<INFO;      my $result=<<INFO;
   <div class="LC_GRADING_maincontrols">    <div class="LC_GRADING_maincontrols">
   INFO
   
       if (&grade_mode() eq 'regrade') {
    $result.=<<INFO;
       <input type="submit" name="cancel" value="$lt{'cancel'}" />
   INFO
       }
   
       $result.=<<INFO;
     <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
     return $result;      return $result;
 }  }
   
   sub done_screen {
       my ($version) = @_;
       my $title=&Apache::lonnet::gettitle();
       my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});
       my (undef,undef,$domain,$user)= &Apache::lonxml::whichuser();
       my $files = '<ul>';
       my $msg;
       foreach my $file (@files) {
    my $url="/uploaded/$domain/$user/portfolio$file";
    if (! &Apache::lonnet::stat_file($url)) {
       $file = &mt('<span class="LC_error"> Nonexistent file:</span> '.
    '<span class="LC_filename">[_1]</span>',$file);
       $msg .= "<p>Submitted non-existant file $file</p>\n";
    } else {
       $file = '<span class="LC_filename">'.$file.'</span>';
       $msg .= "<p>Submitted file $file</p>\n";
    }
    $files .= '<li>'.$file.'</li>';
       }
       $files.='</ul>';
       my $subject = "Submission message for $title";
       my ($message_status,$comment_status);
       my $setting = $env{'course.'.$env{'request.course.id'}.'.task_messages'};
       $setting =~ s/^\s*(\S*)\s*$/$1/;
       $setting = lc($setting);
       if ($setting eq 'only_student'
    || $setting eq 'student_and_user_notes_screen') {
    $message_status =
       &Apache::lonmsg::user_normal_msg($user,$domain,$subject,$msg);
    $message_status = '<p>'.&mt('Message sent to user: [_1]',
       $message_status).' </p>';
       }
       if ($setting eq 'student_and_user_notes_screen') {
    $comment_status = 
       &Apache::lonmsg::store_instructor_comment($subject.'<br />'.
         $msg,$user,$domain);
    $comment_status = '<p>'.&mt('Message sent to instructor: [_1]',
       $comment_status).' </p>';
       }
       return <<DONESCREEN;
   <h2>$title</h2>
   <p> Files submitted: $files </p>
   <p> You are now done with this Bridge Task </p>
   <hr />
   <p> <a href="/adm/logout">Logout</a> </p>
   <p> <a href="/adm/roles">Change to a different course</a> </p>
   $message_status
   $comment_status
   DONESCREEN
   
   }
   
 sub start_Task {  sub start_Task {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
     my ($status,$accessmsg,$slot);      my ($status,$accessmsg,$slot);
       &Apache::structuretags::init_problem_globals('Task');
     if ($target ne 'webgrade') {      if ($target ne 'webgrade') {
  &Apache::structuretags::init_problem_globals('Task');  
  &Apache::structuretags::initialize_storage();   &Apache::structuretags::initialize_storage();
  &Apache::lonhomework::showhash(%Apache::lonhomework::history);   &Apache::lonhomework::showhash(%Apache::lonhomework::history);
  if ($env{'request.state'} eq 'construct') {   if ($env{'request.state'} eq 'construct') {
Line 375  sub start_Task { Line 542  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 576  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 417  sub start_Task { Line 588  sub start_Task {
     if ($target eq 'web' && $env{'request.state'} eq 'construct') {      if ($target eq 'web' && $env{'request.state'} eq 'construct') {
  $form_tag_start.=&Apache::structuretags::problem_web_to_edit_header($env{'form.rndseed'});   $form_tag_start.=&Apache::structuretags::problem_web_to_edit_header($env{'form.rndseed'});
     }      }
     if ($target eq 'web' || ($target eq 'grade' && !$env{'form.webgrade'}) || $target eq 'answer' ||      if ($target eq 'web' 
  $target eq 'tex') {   || ($target eq 'grade' && !$env{'form.webgrade'}) 
    || $target eq 'answer' 
    || $target eq 'tex') {
  my ($version,$previous)=&get_version();   my ($version,$previous)=&get_version();
  ($status,$accessmsg,my $slot_name,$slot) =    ($status,$accessmsg,my $slot_name,$slot) = 
     &Apache::lonhomework::check_slot_access('0','Task');      &Apache::lonhomework::check_slot_access('0','Task');
    if ($status eq 'CAN_ANSWER' && $version eq '') {
       # CAN_ANSWER mode, and no current version, unproctored access
       # thus self-checkedin
       &check_in('Task',undef,undef,$slot_name);
       &add_to_queue('gradingqueue',{'type' => 'Task',
     'time' => time,
     'slot' => $slot_name});
       ($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 448  sub start_Task { Line 630  sub start_Task {
  } elsif ($status eq 'WAITING_FOR_GRADE') {   } elsif ($status eq 'WAITING_FOR_GRADE') {
     $msg.='<h1>'.&mt('Your submission is in the grading queue.').'</h1>';      $msg.='<h1>'.&mt('Your submission is in the grading queue.').'</h1>';
  } elsif ($env{'form.donescreen'}) {   } elsif ($env{'form.donescreen'}) {
     my $title=&Apache::lonnet::gettitle();      $result .= &done_screen($version);
     my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});  
     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;  
 <h2>$title</h2>  
 <p> Files submitted: $files </p>  
 <p> You are now done with this Bridge Task </p>  
 <hr />  
 <p> <a href="/adm/logout">Logout</a> </p>  
 <p> <a href="/adm/roles">Change to a different course</a> </p>  
 DONESCREEN  
  } elsif ($status ne 'NOT_YET_VIEWED') {   } elsif ($status ne 'NOT_YET_VIEWED') {
     $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';      $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
  }   }
Line 490  DONESCREEN Line 649  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 671  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 532  DONESCREEN Line 691  DONESCREEN
  &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>';   &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>';
     $form_tag_start.=      $form_tag_start.=
  '<input type="hidden" name="gradingkey" value="'.   '<input type="hidden" name="gradingkey" value="'.
  &Apache::lonnet::escape($todo).'" />';   &escape($todo).'" />';
     $Apache::bridgetask::queue_key=$todo;      $Apache::bridgetask::queue_key=$todo;
     &Apache::structuretags::initialize_storage();      &Apache::structuretags::initialize_storage();
     &Apache::lonhomework::showhash(%Apache::lonhomework::history);      &Apache::lonhomework::showhash(%Apache::lonhomework::history);
Line 547  DONESCREEN Line 706  DONESCREEN
     &mt('Return to resource').'</a></p>';      &mt('Return to resource').'</a></p>';
  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 'cancel') {
       $result.='<b>'.&mt("Cancelled grading.").'</b>'.$back;
    } elsif ($status_code eq 'never_versioned') {
       $result.='<b>'.
    &mt("Requested user has never accessed the task.").
    '</b>'.$back;
    } elsif ($status_code =~ /still_open:(.*)/) {
       my $date = &Apache::lonlocal::locallocaltime($1);
       $result.='<b>'.
    &mt("Task is still open, will close at [_1].",$date).
    '</b>'.$back;
  } elsif ($status_code eq 'lock_failed') {   } elsif ($status_code eq 'lock_failed') {
     $result.='<b>'.&mt("Failed to lock the requested record.")      $result.='<b>'.&mt("Failed to lock the requested record.")
  .'</b>'.$back;   .'</b>'.$back;
Line 567  DONESCREEN Line 737  DONESCREEN
  }   }
     }      }
     $webgrade='no';      $webgrade='no';
    }
    if (!$todo || $env{'form.cancel'}) {
     my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);      my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);
  }   }
  if ($target eq 'webgrade' && defined($env{'form.queue'})) {   if ($target eq 'webgrade' && defined($env{'form.queue'})) {
Line 596  DONESCREEN Line 768  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 609  DONESCREEN Line 781  DONESCREEN
     return $result;      return $result;
 }  }
   
   sub get_task_end_time {
       my ($queue_entry,$symb,$udom,$uname) = @_;
   
       my $end_time;
       if (my $slot = &slotted_access($queue_entry)) {
    my %slot_data=&Apache::lonnet::get_slot($slot);
    $end_time = $slot_data{'endtime'};
       } else {
    $end_time = &Apache::lonhomework::due_date('0',$symb,
      $udom,$uname);
       }
       return $end_time;
   }
   
 sub get_key_todo {  sub get_key_todo {
     my ($target)=@_;      my ($target)=@_;
     my $todo;      my $todo;
Line 632  sub get_key_todo { Line 818  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 657  sub get_key_todo { Line 843  sub get_key_todo {
  if (!$queue) {   if (!$queue) {
     $env{'form.queue'} = $queue = 'none';      $env{'form.queue'} = $queue = 'none';
     #not queued so doing either a re or pre grade      #not queued so doing either a re or pre grade
       my %status = &Apache::lonnet::restore($symb,$cid,$udom,$uname);
       if ($status{'resource.0.version'} < 1) {
    return (undef,'never_versioned');
       }
     return ($gradingkey);      return ($gradingkey);
  }   }
   
    if ($queue) {
       my $queue_entry = &get_queue_data($queue,$udom,$uname);
   
       my $end_time = &get_task_end_time($queue_entry,$symb,
         $udom,$uname);
       if ($end_time > time) {
    return (undef,"still_open:$end_time");
       }
    }
   
  my $who=&queue_key_locked($queue,$gradingkey);   my $who=&queue_key_locked($queue,$gradingkey);
  if ($who eq $me) {   if ($who eq $me) {
     #already have the lock      #already have the lock
     $env{'form.gradingkey'}=&Apache::lonnet::escape($gradingkey);      $env{'form.gradingkey'}=&escape($gradingkey);
       &Apache::lonxml::debug("already locked");
     return ($gradingkey);      return ($gradingkey);
  }   }
   
  if (!defined($who)) {   if (!defined($who)) {
     if (&lock_key($queue,$gradingkey)) {      if (&lock_key($queue,$gradingkey)) {
    &Apache::lonxml::debug("newly locked");
  return ($gradingkey);   return ($gradingkey);
     } else {      } else {
  return (undef,'lock_failed');   return (undef,'lock_failed');
Line 678  sub get_key_todo { Line 880  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 688  sub get_key_todo { Line 890  sub get_key_todo {
  $env{'form.queue'}=$queue='gradingqueue';   $env{'form.queue'}=$queue='gradingqueue';
     }      }
   
     my $gradingkey=&Apache::lonnet::unescape($env{'form.gradingkey'});      my $gradingkey=&unescape($env{'form.gradingkey'});
   
     if ($env{'form.queue'} eq 'none') {      if ($env{'form.queue'} eq 'none') {
  if (defined($env{'form.gradingkey'})) {   if (defined($env{'form.gradingkey'})) {
     if ($target eq 'webgrade') {      if ($target eq 'webgrade') {
  if ($env{'form.stop'}) {   if ($env{'form.stop'}) {
     return (undef,'stop');      return (undef,'stop');
    } elsif ($env{'form.cancel'}) {
       return (undef,'cancel');
  } elsif ($env{'form.next'}) {   } elsif ($env{'form.next'}) {
     return (undef,'select_user');      return (undef,'select_user');
  }   }
Line 740  sub get_key_todo { Line 944  sub get_key_todo {
   
     if ($env{'form.queuemode'} ne 'selected') {      if ($env{'form.queuemode'} ne 'selected') {
  # don't get something new from the queue if they hit the stop button   # don't get something new from the queue if they hit the stop button
     if (!($env{'form.stop'} && $target eq 'webgrade')       if (!(($env{'form.cancel'} || $env{'form.stop'}) 
         && $target eq 'webgrade') 
     && !$env{'form.gradingaction'}) {      && !$env{'form.gradingaction'}) {
     &Apache::lonxml::debug("Getting anew $queue");      &Apache::lonxml::debug("Getting anew $queue");
     return (&get_from_queue($queue));      return (&get_from_queue($queue));
Line 801  DONEBUTTON Line 1006  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 823  DONEBUTTON Line 1036  DONEBUTTON
     my $man_count=0;      my $man_count=0;
     my $opt_count=0;      my $opt_count=0;
     my $opt_passed=0;      my $opt_passed=0;
     foreach my $dim_id (@Apache::bridgetask::dimensionlist) {      foreach my $dim (keys(%Apache::bridgetask::top_dimensionlist)) {
  if ($Apache::bridgetask::dimensionmandatory{$dim_id}   if ($Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'}
     eq 'N') {      eq 'N') {
     $opt_count++;      $opt_count++;
     if ($Apache::lonhomework::history{"resource.$version.0.$dim_id.status"} eq 'pass') {      if ($Apache::lonhomework::history{"resource.$version.0.$dim.status"} eq 'pass') {
  $opt_passed++;   $opt_passed++;
     }      }
  } else {   } else {
     $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 1056  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 1081  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();
  }   }
  if ($target eq 'grade' && $env{'form.webgrade'} eq 'yes') {   if ($target eq 'grade' && $env{'form.webgrade'} eq 'yes' 
       && exists($env{'form.cancel'})) {
       &check_queue_unlock($env{'form.queue'});
       &Apache::lonxml::debug(" cancelled grading .".$env{'form.queue'});
    } elsif ($target eq 'grade' && $env{'form.webgrade'} eq 'yes' 
    && !exists($env{'form.cancel'})) {
     my $optional_required=      my $optional_required=
  &Apache::lonxml::get_param('OptionalRequired',$parstack,   &Apache::lonxml::get_param('OptionalRequired',$parstack,
    $safeeval);     $safeeval);
Line 884  DONEBUTTON Line 1111  DONEBUTTON
     my $ungraded=0;      my $ungraded=0;
     my $review=0;         my $review=0;   
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
     foreach my $dim_id (@Apache::bridgetask::dimensionlist) {      foreach my $dim (keys(%Apache::bridgetask::top_dimensionlist)) {
  my $status=   my $status=
     $Apache::lonhomework::results{"resource.$version.0.$dim_id.status"};      $Apache::lonhomework::results{"resource.$version.0.$dim.status"};
  my $mandatory=   my $mandatory=
     ($Apache::bridgetask::dimensionmandatory{$dim_id} ne 'N');      ($Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'} 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 904  DONEBUTTON Line 1131  DONEBUTTON
     if ($optional_passed < $optional_required) {      if ($optional_passed < $optional_required) {
  $mandatory_failed++;   $mandatory_failed++;
     }      }
     &Apache::lonxml::debug("all dim ".join(':',@Apache::bridgetask::dimensionlist)."results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");      &Apache::lonxml::debug("all dim ".join(':',keys(%Apache::bridgetask::top_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 974  DONEBUTTON Line 1201  DONEBUTTON
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
  }   }
     } elsif ($target eq 'webgrade') {      } elsif ($target eq 'webgrade') {
  $result.="</div>\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 984  DONEBUTTON Line 1211  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 996  DONEBUTTON Line 1223  DONEBUTTON
  $result.=&Apache::response::meta_stores_write('status','string',   $result.=&Apache::response::meta_stores_write('status','string',
       'Bridge Task Status');        'Bridge Task Status');
     }      }
       &Apache::structuretags::reset_problem_globals('Task');
     undef($Apache::lonhomework::parsing_a_task);      undef($Apache::lonhomework::parsing_a_task);
     return $result;      return $result;
 }  }
Line 1009  sub move_between_queues { Line 1237  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 1250  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) {
    &Apache::lonxml::debug("unlocking my own $who");
  return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);   return &Apache::lonnet::del($queue,["$key\0locked"],$cdom,$cnum);
     } elsif ($allow_not_me) {      } elsif ($allow_not_me) {
  &Apache::lonxml::debug("unlocking $who by $me");   &Apache::lonxml::debug("unlocking $who by $me");
Line 1085  sub setup_env_for_other_user { Line 1314  sub setup_env_for_other_user {
 }  }
   
 sub get_queue_data {  sub get_queue_data {
     my ($queue)=@_;      my ($queue,$udom,$uname)=@_;
     my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();      my ($symb,$cid,$other_udom,$other_uname)=&Apache::lonxml::whichuser();
       if (!$uname || !$udom) {
    $uname=$other_uname;
    $udom =$other_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 $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 1341  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 1368  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);
 }  }
   
   sub get_limited_classlist {
       my ($sections) = @_;
   
       my $classlist = &Apache::loncoursedata::get_classlist();
       foreach my $student (keys(%$classlist)) {
    if ( $classlist->{$student}[&Apache::loncoursedata::CL_STATUS()]
        ne 'Active') {
       delete($classlist->{$student});
           }
       }
   
       if (ref($sections) && !grep('all',@{ $sections })) {
    foreach my $student (keys(%$classlist)) {
       my $section  = 
    $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()];
       if (! grep($section,@{ $sections })) {
    delete($classlist->{$student});
       }
    }
       }
       return $classlist;
   }
   
   
 sub show_queue {  sub show_queue {
     my ($queue,$with_selects)=@_;      my ($queue,$with_selects)=@_;
     my $result;      my $result;
Line 1148  sub show_queue { Line 1405  sub show_queue {
   
     my @chosen_sections=      my @chosen_sections=
  &Apache::loncommon::get_env_multiple('form.chosensections');   &Apache::loncommon::get_env_multiple('form.chosensections');
     &Apache::grades::init_perm();  
     my ($classlist,$section,$fullname)=&Apache::grades::getclasslist(\@chosen_sections,);      my $classlist = &get_limited_classlist(\@chosen_sections);
     &Apache::grades::reset_perm();  
     if (!(grep(/^all$/,@chosen_sections))) {      if (!(grep(/^all$/,@chosen_sections))) {
  $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections).   $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections).
     '</tt>.</p> '."\n";      '</tt>.</p> '."\n";
     }      }
   
       my ($view,$view_section);
       my $scope = $env{'request.course.id'};
       if (!($view=&Apache::lonnet::allowed('vgr',$scope))) {
    $scope .= '/'.$env{'request.course.sec'};
    if ( $view = &Apache::lonnet::allowed('vgr',$scope)) {
       $view_section=$env{'request.course.sec'};
    } else {
       undef($view);
    }
       }
   
     my $regexp="^$symb\0";      my $regexp="^$symb\0";
     my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);      my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
     my ($tmp)=%queue;      my ($tmp)=%queue;
     if ($tmp=~/^error: 2 /) {      if ($tmp=~/^error: 2 /) {
  return "\n<h3>Current Queue - $queue</h3><table border='1'><tr><td>Empty</td></tr></table>";   return "\n<h3>Current Queue - $queue</h3>".
       &Apache::loncommon::start_data_table().
       &Apache::loncommon::start_data_table_row().
       '<td>'.&mt('Empty').'</td>'.
       &Apache::loncommon::end_data_table_row().
       &Apache::loncommon::end_data_table();
     }      }
     my $title=&Apache::lonnet::gettitle($symb);      my $title=&Apache::lonnet::gettitle($symb);
     $result.="\n<h3>Current Queue - $title $queue </h3><table border='1'><tr>";      $result.="\n<h3>Current Queue - $title $queue </h3>".
    &Apache::loncommon::start_data_table().
    &Apache::loncommon::start_data_table_header_row();
     if ($with_selects) { $result.="<th>Status</th><th></th>"; }      if ($with_selects) { $result.="<th>Status</th><th></th>"; }
     $result.="<th>user</th><th>data</th></tr>";      $result.="<th>user</th><th>data</th>".
    &Apache::loncommon::end_data_table_header_row();
     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; }
   
    my $section = $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()];
   
    my $can_view=1;
    if (!$view
       || ($view_section && !$section)
       || ($view_section && $section && ($view_section ne $section))) {
       $can_view=0;
    }
   
  if ($key=~/locked$/ && !$with_selects) {   if ($key=~/locked$/ && !$with_selects) {
     $result.="<tr><td>$uname</td>";      $result.= &Apache::loncommon::start_data_table_row().
    "<td>$uname</td>";
     $result.='<td>'.$queue{$key}.'</td></tr>';      $result.='<td>'.$queue{$key}.'</td></tr>';
  } elsif ($key=~/timestamp$/ && !$with_selects) {   } elsif ($key=~/timestamp$/ && !$with_selects) {
     $result.="<tr><td></td>";      $result.=&Apache::loncommon::start_data_table_row()."<td></td>";
     $result.='<td>'.      $result.='<td>'.
  &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.= &Apache::loncommon::start_data_table_row();
     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=&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 1491  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 ($can_view && ($end_time ne '' && time > $end_time)) {
     $result.=(<<FORM);      $result.=(<<FORM);
 <td>$status</td>  <td>$status</td>
 <td>  <td>
Line 1212  sub show_queue { Line 1506  sub show_queue {
 </form>  </form>
 </td>  </td>
 FORM  FORM
                   } elsif (!$can_view && ($end_time ne '' && time > $end_time)) {
       $result.='<td>'.&mt("Not gradable").'</td><td>&nbsp;</td>'
                 } else {                  } else {
     $result.='<td>'.&mt("In Progress").'</td>'      $result.='<td>'.&mt("In Progress").'</td><td>&nbsp;</td>'
  }   }
     }      }
     $result.= "<td>".$fullname->{$uname.':'.$udom}.      $result.= "<td>".$classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_FULLNAME()].
  " <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>".&Apache::loncommon::end_data_table_row();
  }   }
     }      }
     $result.="</table><hr />\n";      $result.= &Apache::loncommon::end_data_table()."<hr />\n";
     return $result;      return $result;
 }  }
   
Line 1234  sub get_queue_counts { Line 1529  sub get_queue_counts {
     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 $classlist=&get_limited_classlist();
   
     my $regexp="^$symb\0";      my $regexp="^$symb\0";
     my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);      my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
     my ($tmp)=%queue;      my ($tmp)=%queue;
Line 1243  sub get_queue_counts { Line 1541  sub get_queue_counts {
     my ($entries,$ready_to_grade,$locks)=(0,0,0);      my ($entries,$ready_to_grade,$locks)=(0,0,0);
     my %slot_cache;      my %slot_cache;
     foreach my $key (sort(keys(%queue))) {      foreach my $key (sort(keys(%queue))) {
    my ($symb,$uname,$udom) = &decode_queue_key($key);
    if (!defined($classlist->{$uname.':'.$udom})) { next; }
   
  if ($key=~/locked$/) {   if ($key=~/locked$/) {
     $locks++;      $locks++;
  } elsif ($key=~/timestamp$/) {   } elsif ($key=~/timestamp$/) {
     #ignore      #ignore
  } elsif ($key!~/(timestamp|locked)$/) {   } elsif ($key!~/(timestamp|locked)$/) {
     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 1571  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 1596  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,$classlist)=@_;
     my @possible; # will hold queue entries that are valid to be selected      my @possible; # will hold queue entries that are valid to be selected
     foreach my $key (keys(%$queuedata)) {      foreach my $key (keys(%$queuedata)) {
  if ($key =~ /\0locked$/) { next; }   if ($key =~ /\0locked$/) { next; }
  if ($key =~ /\0timestamp$/) { next; }   if ($key =~ /\0timestamp$/) { next; }
   
  my ($symb,$uname,$udom)=&decode_queue_key($key);   my ($symb,$uname,$udom)=&decode_queue_key($key);
    if (!defined($classlist->{$uname.':'.$udom})) { next; }
   
  if ($check_section) {   if ($check_section) {
     my $section=&Apache::lonnet::getsection($uname,$udom);      my $section =
    $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()];
     if ($section eq $check_section) {      if ($section eq $check_section) {
  &Apache::lonxml::debug("my sec");   &Apache::lonxml::debug("my sec");
  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) {       &Apache::lonxml::debug("looking at slot $slot");
     &Apache::lonxml::debug("not time");      my %slot_data=&Apache::lonnet::get_slot($slot);
     next;      if ($slot_data{'endtime'} < time) { 
    $end_time = $slot_data{'endtime'};
       } else {
    &Apache::lonxml::debug("not time ".$slot_data{'endtime'});
    next;
       }
    } else {
       my $due_date = &Apache::lonhomework::due_date('0',$symb);
       if ($due_date < time) {
    $end_time = $due_date;
       } else {
    &Apache::lonxml::debug("not time $due_date");
    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;
 }  }
   
 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=&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 1695  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 1369  sub get_queue_symb_status { Line 1715  sub get_queue_symb_status {
  $cnum=$env{'course.'.$cid.'.num'};   $cnum=$env{'course.'.$cid.'.num'};
  $cdom=$env{'course.'.$cid.'.domain'};   $cdom=$env{'course.'.$cid.'.domain'};
     }      }
       my $classlist=&get_limited_classlist();
   
     my $regexp="^$symb\0";      my $regexp="^$symb\0";
     my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);      my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
     my ($tmp)=%queue;      my ($tmp)=%queue;
Line 1378  sub get_queue_symb_status { Line 1726  sub get_queue_symb_status {
  next if ($key=~/locked$/);   next if ($key=~/locked$/);
  next if ($key=~/timestamp$/);   next if ($key=~/timestamp$/);
  my ($symb,$uname,$udom) = &decode_queue_key($key);   my ($symb,$uname,$udom) = &decode_queue_key($key);
    next if (!defined($classlist->{$uname.':'.$udom}));
  push(@users,"$uname:$udom");   push(@users,"$uname:$udom");
     }      }
     return @users;      return @users;
Line 1393  sub get_from_queue { Line 1742  sub get_from_queue {
     &Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));      &Apache::lonxml::debug("found ".join(':',&decode_queue_key($todo)));
     if ($todo) { return $todo; }      if ($todo) { return $todo; }
     my $attempts=0;      my $attempts=0;
   
       my $classlist=&get_limited_classlist();
   
     while (1) {      while (1) {
  if ($attempts > 2) {   if ($attempts > 2) {
     # tried twice to get a queue entry, giving up      # tried twice to get a queue entry, giving up
Line 1403  sub get_from_queue { Line 1755  sub get_from_queue {
       $cdom,$cnum);        $cdom,$cnum);
  &Apache::lonxml::debug("$starttime");   &Apache::lonxml::debug("$starttime");
  my $regexp="^$symb\0queue\0";   my $regexp="^$symb\0queue\0";
  my $range= ($attempts < 1 ) ? '0-100' : '0-400';   #my $range= ($attempts < 1 ) ? '0-100' : '0-400';
   
  my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);   my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
  #make a pass looking for a user _not_ in my section   #make a pass looking for a user _not_ in my section
  if ($env{'request.course.sec'}) {   if ($env{'request.course.sec'}) {
     &Apache::lonxml::debug("sce");      &Apache::lonxml::debug("sce");
     $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},      $todo=&pick_from_queue_data($queue,$env{'request.course.sec'},
  \%queue,$cdom,$cnum);   \%queue,$cdom,$cnum,$classlist);
     &Apache::lonxml::debug("sce $todo");      &Apache::lonxml::debug("sce $todo");
  }   }
  # no one _not_ in our section so look for any user that is   # no one _not_ in our section so look for any user that is
  # ready for grading   # ready for grading
  if (!$todo) {   if (!$todo) {
     &Apache::lonxml::debug("no sce");      &Apache::lonxml::debug("no sce");
     $todo=&pick_from_queue_data($queue,undef,\%queue,$cdom,$cnum);      $todo=&pick_from_queue_data($queue,undef,\%queue,$cdom,$cnum,
    $classlist);
     &Apache::lonxml::debug("no sce $todo");      &Apache::lonxml::debug("no sce $todo");
  }   }
  # no user to grade    # no user to grade 
Line 1462  sub select_user { Line 1815  sub select_user {
   
     my @chosen_sections=      my @chosen_sections=
  &Apache::loncommon::get_env_multiple('form.chosensections');   &Apache::loncommon::get_env_multiple('form.chosensections');
     &Apache::grades::init_perm();  
     my ($classlist,$section,$fullname)=&Apache::grades::getclasslist(\@chosen_sections,);      my $classlist = &get_limited_classlist(\@chosen_sections);
     &Apache::grades::reset_perm();  
           
     my $result;      my $result;
     if (!(grep(/^all$/,@chosen_sections))) {      if (!(grep(/^all$/,@chosen_sections))) {
  $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections).   $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections).
     '</tt>.</p> '."\n";      '</tt>.</p> '."\n";
     }      }
     $result.='<table border="1">';      $result.=&Apache::loncommon::start_data_table();
   
     foreach my $student (sort {lc($$fullname{$a}) cmp lc($$fullname{$b}) } keys %$fullname) {      foreach my $student (sort {lc($classlist->{$a}[&Apache::loncoursedata::CL_FULLNAME()]) cmp lc($classlist->{$b}[&Apache::loncoursedata::CL_FULLNAME()]) } (keys(%$classlist))) {
  my ($uname,$udom) = split(/:/,$student);   my ($uname,$udom) = split(/:/,$student);
   
  my $cnum=$env{'course.'.$cid.'.num'};   my $cnum=$env{'course.'.$cid.'.num'};
Line 1494  sub select_user { Line 1846  sub select_user {
     }      }
  }   }
  my $todo =    my $todo = 
     &Apache::lonnet::escape(&encode_queue_key($symb,$udom,$uname));      &escape(&encode_queue_key($symb,$udom,$uname));
  if ($cannot_grade) {   if ($cannot_grade) {
     $result.='<tr><td>&nbsp;</td><td>'.$fullname->{$student}.      $result.=&Apache::loncommon::start_data_table_row().
    '<td>&nbsp;</td><td>'.$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()].
  '</td><td>';   '</td><td>';
  } else {   } else {
     my $seclist;      my $seclist;
Line 1504  sub select_user { Line 1857  sub select_user {
  $seclist.='<input type="hidden" name="chosensections"    $seclist.='<input type="hidden" name="chosensections" 
                                value="'.$sec.'" />';                                 value="'.$sec.'" />';
     }      }
     my $studentdis = $student;      $result.=&Apache::loncommon::start_data_table_row();
     $studentdis =~ tr/:/@/;  
     $result.=<<RESULT;      $result.=<<RESULT;
 <tr>  
   <td>    <td>
     <form style="display: inline" method="post">      <form style="display: inline" method="post">
       <input type="hidden" name="gradingkey" value="$todo" />        <input type="hidden" name="gradingkey" value="$todo" />
Line 1517  sub select_user { Line 1868  sub select_user {
       <input type="submit" name="submit" value="Regrade" />        <input type="submit" name="submit" value="Regrade" />
       $seclist        $seclist
     </form>      </form>
   <td>$fullname->{$student} <tt>($studentdis)</tt></td>    <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt></td>
   <td>    <td>
 RESULT  RESULT
         }          }
Line 1556  RESULT Line 1907  RESULT
  } else {   } else {
     $result.="&nbsp;";      $result.="&nbsp;";
  }   }
  $result.= '</td></tr>';   $result.= '</td>'.&Apache::loncommon::end_data_table_row();
     }      }
     $result.='</table>';      $result.=&Apache::loncommon::end_data_table();
     return $result;      return $result;
 }  }
   
Line 1603  sub end_ClosingParagraph { Line 1954  sub end_ClosingParagraph {
     return $result;      return $result;
 }  }
   
   sub get_dim_id {
       return $Apache::bridgetask::dimension[-1];
   }
   
 sub get_id {  sub get_id {
     my ($parstack,$safeeval)=@_;      my ($parstack,$safeeval)=@_;
     my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval);      my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval);
Line 1610  sub get_id { Line 1965  sub get_id {
     return $id;      return $id;
 }  }
   
 my %dimension;  sub start_Setup {
 sub start_Dimension {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     undef(%dimension);      #undef(%dimension);
     my $dim_id=&get_id($parstack,$safeeval);      my $dim = &get_id($parstack,$safeeval);
     $Apache::bridgetask::dimension=$dim_id;      push(@Apache::bridgetask::dimension,$dim);
     push(@Apache::bridgetask::dimensionlist,$dim_id);  
     undef(@Apache::bridgetask::instance);  
     $Apache::bridgetask::dimensionmandatory{$dim_id}=  
  &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);  
     &Apache::lonxml::startredirection();      &Apache::lonxml::startredirection();
     return &internal_location($dim_id);      return &internal_location($dim);
   }
   
   {
       my @allowed;
       sub enable_dimension_parsing {
    my ($id) = @_;
    push(@allowed,$id);
       }
       sub disable_dimension_parsing {
    pop(@allowed);
       }
       sub skip_dimension_parsing {
    my ($check) = @_;
    if (!@allowed) { return 0;}
    # if unspecified allow any id
    if ($allowed[-1] eq undef) { return 0;}
   
    return ($check ne $allowed[-1]);
       }
   }
   
   sub start_Question { return &start_Dimension(@_); }
   sub start_Dimension {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       my $dim = &get_id($parstack,$safeeval);
       my $previous_dim;
       if (@Apache::bridgetask::dimension) {
    $previous_dim = $Apache::bridgetask::dimension[-1];
    push(@{$Apache::bridgetask::dimension{$previous_dim}{'contains'}},
        $dim);
    if(&skip_dimension_parsing($dim)) {
       $dimension{$previous_dim}{'criteria.'.$dim} =
    $token->[4]
    .&Apache::lonxml::get_all_text('/'.$tagstack->[-1],$parser,
         $style)
    .'</'.$tagstack->[-1].'>';
    }
    $dimension{$previous_dim}{'criteria.'.$dim.'.type'}='dimension';
    $dimension{$previous_dim}{'criteria.'.$dim.'.mandatory'}=
       &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
    push(@{$dimension{$previous_dim}{'criterias'}},$dim);
    $dimension{$dim}{'nested'}=$previous_dim;
    &Apache::lonxml::debug("adding $dim as criteria to $previous_dim");
       } else {
    $Apache::bridgetask::top_dimensionlist{$dim}{'manadatory'}=
       &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
       }
       push(@Apache::bridgetask::dimension,$dim);
       &Apache::lonxml::startredirection();
       &enable_dimension_parsing($dim);
       return &internal_location($dim);
   }
   
   sub start_QuestionText {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       my $dim = &get_dim_id();
       my $text=&Apache::lonxml::get_all_text('/questiontext',$parser,$style);
       if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
    $dimension{$dim}{'questiontext'}=$text;
       }
       return '';
   }
   
   sub end_QuestionText {
       return '';
 }  }
   
 sub get_instance {  sub get_instance {
Line 1631  sub get_instance { Line 2046  sub get_instance {
  $rand_alg eq '64bit2' || $rand_alg eq '64bit3' ||   $rand_alg eq '64bit2' || $rand_alg eq '64bit3' ||
  $rand_alg eq '64bit4' ) {   $rand_alg eq '64bit4' ) {
  &Apache::response::pushrandomnumber();   &Apache::response::pushrandomnumber();
  my @order=&Math::Random::random_permutation(@{$dimension{'instances'}});   my @order=&Math::Random::random_permutation(@{$dimension{$dim}{'instances'}});
  my $num=@order;   my $num=@order;
  my $version=&get_version();   my $version=&get_version();
  my $which=($version-1)%$num;   my $which=($version-1)%$num;
Line 1643  sub get_instance { Line 2058  sub get_instance {
  if (defined($instance)) { return $instance; }   if (defined($instance)) { return $instance; }
   
  &Apache::response::pushrandomnumber();   &Apache::response::pushrandomnumber();
  my @instances = @{$dimension{'instances'}};   if (ref($dimension{$dim}{'instances'}) eq 'ARRAY') {
  # remove disabled instances      my @instances = @{$dimension{$dim}{'instances'}};
  for (my $i=0; $i < $#instances; $i++) {      # remove disabled instances
     if ($dimension{$instances[$i].'.disabled'}) {      for (my $i=0; $i < $#instances; $i++) {
  splice(@instances,$i,1);   if ($dimension{$dim}{$instances[$i].'.disabled'}) {
  $i--;      splice(@instances,$i,1);
       $i--;
    }
       }
       @instances = &Math::Random::random_permutation(@instances);
       $instance  = $instances[($version-1)%scalar(@instances)];
       if ($version =~ /^\d$/) {
    $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} = 
       $instance;
    $Apache::lonhomework::results{'INTERNAL_store'} = 1; 
     }      }
  }   }
  @instances = &Math::Random::random_permutation(@instances);  
  $instance  = $instances[($version-1)%scalar(@instances)];  
  $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} =   
     $instance;  
  $Apache::lonhomework::results{'INTERNAL_store'} = 1;   
  &Apache::response::poprandomnumber();   &Apache::response::poprandomnumber();
  return $instance;   return $instance;
     }      }
 }  }
   
   sub get_criteria {
       my ($what,$version,$dim,$id) = @_;
       my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
       my $prefix = ($type eq 'criteria') ? "$dim.$id"
                                  : "$id";
       my $entry = "resource.$version.0.$prefix.$what";
       if (exists($Apache::lonhomework::results{$entry})) {
    return $Apache::lonhomework::results{$entry};
       }
       return $Apache::lonhomework::history{$entry};
   }
   
 {  {
     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);
    if (&skip_dimension_parsing($dim)) {
       &disable_dimension_parsing($dim);
       pop(@Apache::bridgetask::dimension);
       return;
    }
  my $instance=&get_instance($dim);   my $instance=&get_instance($dim);
  my $version=&get_version();   my $version=&get_version();
  if ($target eq 'web') {   if ($target eq 'web') {
     @Apache::scripttag::parser_env = @_;      $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
     $result.=&Apache::scripttag::xmlparse($dimension{'intro'});  
     my @instances = $instance;      my @instances = $instance;
     if (&Apache::response::showallfoils()) {      if (&Apache::response::showallfoils()) {
  @instances = @{$dimension{'instances'}};   @instances = @{$dimension{$dim}{'instances'}};
     }      }
       my $shown_question_text;
     foreach my $instance (@instances) {      foreach my $instance (@instances) {
  @Apache::scripttag::parser_env = @_;   $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});   [@_]);
  if ($Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass' ||   $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
     $Apache::lonhomework::history{"resource.$version.0.status"} eq 'fail') {   [@_],{'set_dim_id' => undef});
    my $task_status = 
       $Apache::lonhomework::history{"resource.$version.0.status"};
    if ($task_status ne 'pass' && $task_status ne 'fail') {
   
       foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
       @{$dimension{$dim}{'criterias'}}) {
    my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
    &Apache::lonxml::debug("$id is $type");
    if ($type eq 'dimension') {
       $result.=
    &nested_parse(\$dimension{$dim}{'criteria.'.$id},
         [@_],{'set_dim_id' => $id});
    }
       }
    } else {
     my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};      my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
     my $mandatory='Mandatory';      my $mandatory='Mandatory';
     if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {      if ($Apache::bridgetask::dimensionmandatory{$dim} eq 'N') {
Line 1702  sub get_instance { Line 2154  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{$dim}{$instance.'.criterias'}},
  if ($dimension{$instance.'.criteria.'.$id.'.mandatory'}        @{$dimension{$dim}{'criterias'}} ) {
    my $status = &get_criteria('status',$version,$dim,$id);
    if ($dimension{$dim}{'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 ($status eq 'pass') { $opt_passed++; }
  $opt_passed++;  
     }  
  } else {   } else {
     $man_count++;      $man_count++;
     if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {      if ($status eq 'pass') { $man_passed++; }
  $man_passed++;  
     }  
  }   }
     }      }
     if ($man_passed eq $man_count) { $man_passed='all'; }      if ($man_passed eq $man_count) { $man_passed='all'; }
     my $opt_req=$dimension{$instance.'.optionalrequired'};  
     if ($opt_req !~ /\S/) { $opt_req='0'; }      my $opt_req=$dimension{$dim}{$instance.'.optionalrequired'};
       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{$dim}{$instance.'.criterias'}},
  my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};      @{$dimension{$dim}{'criterias'}}) {
  my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"};   my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
  my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');   if ($type eq 'dimension') {
       $result.=$dimension{$id}{'result'};
       next;
    }
    my $status= &get_criteria('status', $version,$dim,$id);
    my $comment=&get_criteria('comment',$version,$dim,$id);
    my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
  if ($mandatory) {   if ($mandatory) {
     $mandatory='Mandatory';      $mandatory='Mandatory';
  } else {   } else {
Line 1740  sub get_instance { Line 2202  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 = @_;   $result.=
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});      &nested_parse(\$dimension{$dim}{'criteria.'.$id},
     [@_],{'set_dim_id' => $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 ($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]',$comment).'</p>';
  }   }
  $result.='</div>';   $result.='</div>';
     }      }
Line 1756  sub get_instance { Line 2219  sub get_instance {
     }      }
  } elsif ($target eq 'webgrade') {   } elsif ($target eq 'webgrade') {
     # in case of any side effects that we need      # in case of any side effects that we need
     @Apache::scripttag::parser_env = @_;      &nested_parse(\$dimension{$dim}{'intro'},[@_]);
     &Apache::scripttag::xmlparse($dimension{'intro'});      &nested_parse(\$dimension{$dim}{$instance.'.text'},[@_]);
     @Apache::scripttag::parser_env = @_;      $result.=
     &Apache::scripttag::xmlparse($dimension{$instance.'.text'});   &nested_parse(\$dimension{$dim}{'questiontext'},[@_],
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {        {'set_dim_id'          => undef,
  my $link=&link($instance,$id);         'delayed_dim_results' => 1});
  my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};      foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
       @{$dimension{$dim}{'criterias'}} ) {
    my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
    if ($type eq 'dimension') {
       # dimensional 'criteria' don't get assigned grades
       $result.=
    &nested_parse(\$dimension{$dim}{'criteria.'.$id},
         [@_],{'set_dim_id' => $id});
       next;
    }
   
    my $link=&link($id);
    my $status= &get_criteria('status',$version,$dim,$id);
  $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".   $result.=
     '<div class="LC_GRADING_criteriatext">'."\n";      &nested_parse(\$dimension{$dim}{'criteria.'.$id},[@_]);
  @Apache::scripttag::parser_env = @_;  
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});  
  $result.='</div>'."\n".   $result.='</div>'."\n".
     #$dimension{$instance.'.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 2251  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(&get_criteria('comment',$version,$dim,$id),'<>"&').'</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;
     }      }
       if (&nest()) {
    &Apache::lonxml::debug(" for $dim stashing results into ".$dimension{$dim}{'nested'});
    $dimension{$dimension{$dim}{'nested'}}{'result'}.=$result;
    undef($result);
       }
  } elsif ($target eq 'grade' && $env{'form.webgrade'}) {   } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
     my $optional_passed=0;      my $optional_passed=0;
     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'}}) {  
  my $link=&link($instance,$id);      $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
  my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.status"}=$env{'form.HWVAL_'.$link};      $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
  $Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.comment"}=$env{'form.HWVAL_comment_'.$link};       [@_]);
  my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');      $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
        [@_],{'set_dim_id' => undef});
   
       foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
       @{$dimension{$dim}{'criterias'}}) {
    my $link=&link($id);
   
    my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
    if ($type eq 'criteria') {
       # dimensional 'criteria' don't get assigned grades
       $Apache::lonhomework::results{"resource.$version.0.$dim.$id.status"}=$env{'form.HWVAL_'.$link};
       $Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
    } else {
       $result .=
    &nested_parse(\$dimension{$dim}{'criteria.'.$id},
         [@_],{'set_dim_id' => $id});
    }
    my $status= &get_criteria('status',$version,$dim,$id);
   
    my $mandatory=($dimension{$dim}{'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 2307  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{$dim}{$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{$dim}{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
     if ($review) {      if ($review) {
  $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=   $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
     'review';      'review';
Line 1831  sub get_instance { Line 2336  sub get_instance {
     # any other targets no output      # any other targets no output
     undef($result);      undef($result);
  }   }
    &disable_dimension_parsing();
    pop(@Apache::bridgetask::dimension);
    return $result;
       }
   
       sub end_Setup {
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
    my $result=&Apache::lonxml::endredirection();
    my $dim=&get_id($parstack,$safeeval);
    my $instance=&get_instance($dim);
    my $version=&get_version();
    if ($target eq 'web') {
       @Apache::scripttag::parser_env = @_;
       $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
       my @instances = $instance;
       if (&Apache::response::showallfoils()) {
    @instances = @{$dimension{$dim}{'instances'}};
       }
       foreach my $instance (@instances) {
    @Apache::scripttag::parser_env = @_;
    $result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
    @Apache::scripttag::parser_env = @_;
    $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
       }
    } elsif ($target eq 'webgrade' 
    || $target eq 'grade' && $env{'form.webgrade'}) {
       # in case of any side effects that we need
       @Apache::scripttag::parser_env = @_;
       &Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
       @Apache::scripttag::parser_env = @_;
       &Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
       @Apache::scripttag::parser_env = @_;
       &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
    } else {
       # any other targets no output
       undef($result);
    }
    pop(@Apache::bridgetask::dimension);
  return $result;   return $result;
     }      }
 }  }
   
 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 1870  sub grading_history { Line 2413  sub grading_history {
 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;
     if ($target eq 'web' || $target eq 'webgrade') {      my $dim = &get_dim_id();
  if ($tagstack->[-2] eq 'Dimension') {      if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
     $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style);   if ($tagstack->[-2] eq 'Dimension' || $tagstack->[-2] eq 'Question' ) {
       $dimension{$dim}{'intro'}=
  } elsif ($target eq 'webgrade') {   &Apache::lonxml::get_all_text('/introparagraph',
     &Apache::lonxml::get_all_text('/introparagraph',$parser,$style);        $parser,$style);
           } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
       &Apache::lonxml::startredirection();
  }   }
   
     }      }
Line 1883  sub start_IntroParagraph { Line 2428  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 {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $id=&get_id($parstack,$safeeval);      my $dim = &get_dim_id();
     push(@{$dimension{'instances'}},$id);      my $id  = &get_id($parstack,$safeeval);
     push(@Apache::bridgetask::instance,$id);      push(@{$dimension{$dim}{'instances'}},$id);
       push(@{$Apache::bridgetask::instance{$dim}},$id);
     push(@Apache::bridgetask::instancelist,$id);      push(@Apache::bridgetask::instancelist,$id);
     $dimension{$id.'.optionalrequired'}=      $dimension{$dim}{$id.'.optionalrequired'}=
  &Apache::lonxml::get_param('OptionalRequired',$parstack,$safeeval);   &Apache::lonxml::get_param('OptionalRequired',$parstack,$safeeval);
     my $disabled = &Apache::lonxml::get_param('Disabled',$parstack,$safeeval);      my $disabled = &Apache::lonxml::get_param('Disabled',$parstack,$safeeval);
     if (lc($disabled) eq 'yes') {      if (lc($disabled) eq 'yes') {
  $dimension{$id.'.disabled'}='1';   $dimension{$dim}{$id.'.disabled'}='1';
     }      }
     return '';      return '';
 }  }
Line 1905  sub end_Instance { Line 2455  sub end_Instance {
   
 sub start_InstanceText {  sub start_InstanceText {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $instance_id=$Apache::bridgetask::instance[-1];      my $dim = &get_dim_id();
       my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
     my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style);      my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style);
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
  $dimension{$instance_id.'.text'}=$text;   $dimension{$dim}{$instance_id.'.text'}=$text;
     }      }
     return '';      return '';
 }  }
Line 1919  sub end_InstanceText { Line 2470  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 $dim = &get_dim_id();
  my $id=&get_id($parstack,$safeeval);   my $id=&get_id($parstack,$safeeval);
  $dimension{$instance_id.'.criteria.'.$id}=$criteria;   &Apache::lonxml::debug("Criteria $id with $dim");
  $dimension{$instance_id.'.criteria.'.$id.'.mandatory'}=   if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {
     &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);      my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
  push(@{$dimension{$instance_id.'.criterias'}},$id);      $dimension{$dim}{"criteria.$instance_id.$id"}=$criteria;
       $dimension{$dim}{"criteria.$instance_id.$id.type"}='criteria';
       $dimension{$dim}{"criteria.$instance_id.$id.mandatory"}=
    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
       push(@{$dimension{$dim}{$instance_id.'.criterias'}},"$instance_id.$id");
    } else {
       $dimension{$dim}{'criteria.'.$id}=$criteria;
       $dimension{$dim}{'criteria.'.$id.'.type'}='criteria';
       $dimension{$dim}{'criteria.'.$id.'.mandatory'}=
    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
       push(@{$dimension{$dim}{'criterias'}},$id);
    }
     }      }
     return '';      return '';
 }  }
Line 1965  sub proctor_validation_screen { Line 2527  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.126  
changed lines
  Added in v.1.180


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