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

version 1.126, 2006/03/28 22:03:47 version 1.184.2.4, 2006/11/06 17:50:17
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','GraderNote','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)) {
    $user = $env{'user.name'};
    $domain = $env{'user.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 174  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 228  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 272  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 281  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 300  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 262  sub style { Line 326  sub style {
     my ($target) = @_;      my ($target) = @_;
     if ($target eq 'web'      if ($target eq 'web'
  || $target eq 'webgrade') {   || $target eq 'webgrade') {
  return (<<STYLE);   my $style = (<<STYLE);
 <link rel="stylesheet" type="text/css" href="/res/adm/includes/task.css" />  <link rel="stylesheet" type="text/css" href="/res/adm/includes/task.css" />
 STYLE  STYLE
           if ($env{'browser.type'} eq 'explorer'
       && $env{'browser.os'} eq 'win' ) {
       if ($env{'browser.version'} < 7) {
    $style .= (<<STYLE);
   <link rel="stylesheet" type="text/css" href="/res/adm/includes/task_ie.css" />
   STYLE
               } else {
    $style .= (<<STYLE);
   <link rel="stylesheet" type="text/css" href="/res/adm/includes/task_ie7.css" />
   STYLE
       }
    }
    return $style;
     }      }
     return;      return;
 }  }
Line 278  sub show_task { Line 355  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 295  sub submission_time_stamp { Line 405  sub submission_time_stamp {
     my $submissiontime;      my $submissiontime;
     my $version=$Apache::lonhomework::history{'resource.0.version'};      my $version=$Apache::lonhomework::history{'resource.0.version'};
     for (my $v=$Apache::lonhomework::history{'version'};$v>0;$v--) {      for (my $v=$Apache::lonhomework::history{'version'};$v>0;$v--) {
  if (defined($Apache::lonhomework::history{$v.':resource.'.$version.'.0.bridgetask.portfiles'})) {   if (defined($Apache::lonhomework::history{$v.':resource.'.$version.'.0.bridgetask.portfiles'})
       && defined($Apache::lonhomework::history{$v.':resource.'.$version.'.0.tries'})) {
     $submissiontime=$Apache::lonhomework::history{$v.':timestamp'};      $submissiontime=$Apache::lonhomework::history{$v.':timestamp'};
       last;
  }   }
     }      }
     my $result;      my $result;
Line 307  sub submission_time_stamp { Line 419  sub submission_time_stamp {
  my ($color,$when)=('#FF6666','after');   my ($color,$when)=('#FF6666','after');
  if ($diff > 0) { ($color,$when)=('#336600','before'); }   if ($diff > 0) { ($color,$when)=('#336600','before'); }
  my $info;   my $info;
    $diff = abs($diff);
  if ($diff%60) { $info=($diff%60).' seconds'; }   if ($diff%60) { $info=($diff%60).' seconds'; }
  $diff=int($diff/60);   $diff=int($diff/60);
  if ($diff%60) { $info=($diff%60).' minutes '.$info; }   if ($diff%60) { $info=($diff%60).' minutes '.$info; }
  $diff=int($diff/60);   $diff=int($diff/60);
  if ($diff) {    $info=$diff.' hours '.$info; }   if ($diff) {    $info=$diff.' hours '.$info; }
  $result='<p><font color="'.$color.'">'.   $result='<p><font color="'.$color.'">'.
     &mt('Student submitted [_1] [_2] the deadline.       &mt('Student submitted [_1] [_2] the deadline. '.
                  (Submission was at [_3], end of period was [_4].)',   '(Submission was at [_3], end of period was [_4].)',
  $info,$when,scalar(localtime($submissiontime)),   $info,$when,
  scalar(localtime($slot{'endtime'}))).   &Apache::lonlocal::locallocaltime($submissiontime),
    &Apache::lonlocal::locallocaltime($slot{'endtime'})).
  '</font></p>';   '</font></p>';
     }      }
     return $result;      return $result;
Line 334  sub file_list { Line 448  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 562  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 596  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 608  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 650  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 669  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 691  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 711  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 726  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 757  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 788  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 801  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 838  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 863  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 900  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 910  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 964  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 1026  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 1056  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 1076  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>';  
     }      }
  }   }
   
    my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
    my %queue_data = ('type' => 'Task',
     'time' => time,);
    if (defined($Apache::inputtags::slot_name)) {
       $queue_data{'slot'} = $Apache::inputtags::slot_name;
    } elsif (defined($Apache::lonhomework::history{"resource.$version.0.checkedin.slot"})) {
       $queue_data{'slot'} = $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};
    }
   
   
  if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {   if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous) {
     my $award='SUBMITTED';      my $award='SUBMITTED';
     &Apache::essayresponse::file_submission("$version.0",'bridgetask',      &Apache::essayresponse::file_submission("$version.0",'bridgetask',
Line 868  DONEBUTTON Line 1112  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)) {   &add_to_queue('gradingqueue',\%queue_data);
  &add_to_queue('gradingqueue',[$Apache::inputtags::slot_name]);  
     }      }
  } elsif ($Apache::lonhomework::results{'INTERNAL_store'}) {  
     &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 1130  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 1150  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') {  
     &check_queue_unlock($env{'form.queue'});  
     &Apache::lonxml::debug(" still needs review not changing status.");  
  } else {  
     &move_between_queues($env{'form.queue'},'reviewqueue');  
  }  
     } elsif ($ungraded) {      } elsif ($ungraded) {
  $Apache::lonhomework::results{"resource.$version.0.status"}='ungraded';   $Apache::lonhomework::results{"resource.$version.0.status"}='ungraded';
  if ($env{'form.queue'} eq 'reviewqueue' ||  
     $env{'form.queue'} eq 'none' ) {  
     &Apache::lonxml::debug("moving back.");  
     &move_between_queues($env{'form.queue'},'gradingqueue');  
  } else {  
     &check_queue_unlock($env{'form.queue'});  
  }  
     } elsif ($mandatory_failed) {      } elsif ($mandatory_failed) {
  $Apache::lonhomework::results{"resource.$version.0.status"}='fail';   $Apache::lonhomework::results{"resource.$version.0.status"}='fail';
  $Apache::lonhomework::results{"resource.$version.0.solved"}='incorrect_by_override';   $Apache::lonhomework::results{"resource.$version.0.solved"}='incorrect_by_override';
  $Apache::lonhomework::results{"resource.$version.0.award"}='INCORRECT';   $Apache::lonhomework::results{"resource.$version.0.award"}='INCORRECT';
  $Apache::lonhomework::results{"resource.$version.0.awarded"}='0';   $Apache::lonhomework::results{"resource.$version.0.awarded"}='0';
  &remove_from_queue($env{'form.queue'});   
   
  my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();   my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
   
  if ($env{'form.regrade'} ne 'yes') {   if ($env{'form.regrade'} ne 'yes') {
Line 947  DONEBUTTON Line 1178  DONEBUTTON
  $Apache::lonhomework::results{"resource.$version.0.solved"}='correct_by_override';   $Apache::lonhomework::results{"resource.$version.0.solved"}='correct_by_override';
  $Apache::lonhomework::results{"resource.$version.0.award"}='EXACT_ANS';   $Apache::lonhomework::results{"resource.$version.0.award"}='EXACT_ANS';
  $Apache::lonhomework::results{"resource.$version.0.awarded"}='1';   $Apache::lonhomework::results{"resource.$version.0.awarded"}='1';
  &remove_from_queue($env{'form.queue'});  
   
  my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();   my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
  if ($env{'form.regrade'} ne 'yes') {   if ($env{'form.regrade'} ne 'yes') {
     $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}=      $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}=
Line 972  DONEBUTTON Line 1201  DONEBUTTON
     }      }
     &minimize_storage();      &minimize_storage();
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
       
       # data stored, now handle queue
       if ($review) {
    if ($env{'form.queue'} eq 'reviewqueue') {
       &check_queue_unlock($env{'form.queue'});
       &Apache::lonxml::debug(" still needs review not changing status.");
    } else {
       if ($env{'form.queue'} ne 'none') {
    &move_between_queues($env{'form.queue'},'reviewqueue');
       } else {
    &add_to_queue('reviewqueue',\%queue_data);
       }
    }
       } elsif ($ungraded) {
    if ($env{'form.queue'} eq 'reviewqueue') {
       &Apache::lonxml::debug("moving back.");
       &move_between_queues($env{'form.queue'},
    'gradingqueue');
    } elsif ($env{'form.queue'} eq 'none' ) {
       &add_to_queue('gradingqueue',\%queue_data);
    } else {
       &check_queue_unlock($env{'form.queue'});
    }
       } elsif ($mandatory_failed) {
    &remove_from_queue($env{'form.queue'}); 
       } else {
    &remove_from_queue($env{'form.queue'});
       }
    }
    if (exists($Apache::lonhomework::results{'INTERNAL_store'})) {
       # instance generation occured and hasn't yet been stored
       &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 1245  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 995  DONEBUTTON Line 1256  DONEBUTTON
       'Partial Credit Factor');        'Partial Credit Factor');
  $result.=&Apache::response::meta_stores_write('status','string',   $result.=&Apache::response::meta_stores_write('status','string',
       'Bridge Task Status');        'Bridge Task Status');
       } elsif ($target eq 'edit') {
    &Apache::structuretags::reset_problem_globals('Task');
    undef($Apache::lonhomework::parsing_a_task);
    return ('','no');
     }      }
       &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 1275  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 1288  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 1352  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 1379  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 1406  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 1443  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 1529  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 1544  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 1567  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 1579  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 1608  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 1633  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 1732  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 1752  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 1763  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 1779  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 1792  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 1852  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 1883  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 1894  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 1905  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 1944  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 1991  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 2002  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);      &Apache::lonxml::startredirection();
     undef(@Apache::bridgetask::instance);      return &internal_location($dim);
     $Apache::bridgetask::dimensionmandatory{$dim_id}=  }
  &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);  
   {
       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();      &Apache::lonxml::startredirection();
     return &internal_location($dim_id);      &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 2083  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 2095  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::lonxml::get_param('Mandatory',$parstack,$safeeval) eq 'N') {
  $mandatory='Optional';   $mandatory='Optional';
     }      }
     my $dim_info="<div class='LC_$dim_status LC_question_grade'>\n";      my $dim_info="<div class='LC_$dim_status LC_question_grade'>\n";
Line 1702  sub get_instance { Line 2191  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') {
  if ($mandatory) {      $result.=$dimension{$id}{'result'};
     $mandatory='Mandatory';      next;
  } else {  
     $mandatory='Optional';  
  }  
  if ($status eq 'fail') {  
  } elsif ($status eq 'pass') {  
  } else {  
     &Apache::lonxml::error("Student viewing a graded bridgetask was shown a status of $status");  
  }  
  my $status_display=$status;  
  $status_display=~s/^([a-z])/uc($1)/e;  
  @Apache::scripttag::parser_env = @_;  
  $result.=  
     '<div class="LC_'.$status.' LC_criteria"><h4>'  
     .$mandatory.' Criteria</h4><p>';  
  @Apache::scripttag::parser_env = @_;  
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});  
  $result.='</p><p class="LC_grade">'.$status_display.'</p>';  
  if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}) {  
     $result.='<p class="LC_comment">'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}).'</p>';  
  }   }
  $result.='</div>';  
     }      }
  }   }
     }      }
  } 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 2261  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 2317  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 2346  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 2423  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 2438  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 2465  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 2480  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);
       my $result = '';
     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);
   
       my $version=&get_version();
       my $task_status = 
    $Apache::lonhomework::history{"resource.$version.0.status"};
       if ($target eq 'web' 
    && ($task_status eq 'pass' || $task_status eq 'fail')) {
    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) {
       $mandatory='Mandatory';
    } else {
       $mandatory='Optional';
    }
    my $status_display=$status;
    $status_display=~s/^([a-z])/uc($1)/e;
    $result.=
       '<div class="LC_'.$status.' LC_criteria"><h4>'
       .$mandatory.' Criteria</h4><p>';
    $result.=
       &nested_parse(\$dimension{$dim}{'criteria.'.$id},[@_]);
    $result.='</p><p class="LC_grade">'.$status_display.'</p>';
    if ($comment =~ /\w/) {
       $result.='<p class="LC_comment">'.
    &mt('Comment: [_1]',$comment).'</p>';
    }
    $result.='</div>';
       }
    }
     }      }
     return '';      return $result;
 }  }
   
 sub end_Criteria {  sub end_Criteria {
 }  }
   
   sub start_GraderNote {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       
       if ($target eq 'webgrade') {
    return '<div class="LC_GRADING_gradernote"><b>'.
       &mt('Note to graders:').'</b>';
       }
       my $note=&Apache::lonxml::get_all_text('/gradernote',$parser,$style); 
       return;
   }
   
   sub end_GraderNote {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
       if ($target eq 'webgrade') {
    return '</div>';
       }
       return;
   }
   
   
   
 sub proctor_validation_screen {  sub proctor_validation_screen {
     my ($slot) = @_;      my ($slot) = @_;
     my (undef,undef,$domain,$user) = &Apache::lonxml::whichuser();      my (undef,undef,$domain,$user) = &Apache::lonxml::whichuser();
Line 1965  sub proctor_validation_screen { Line 2588  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.184.2.4


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