Diff for /loncom/homework/bridgetask.pm between versions 1.146 and 1.163

version 1.146, 2006/05/09 19:01:19 version 1.163, 2006/06/09 22:31:36
Line 38  use Apache::lonlocal; Line 38  use Apache::lonlocal;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::slotrequest();  use Apache::slotrequest();
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
    
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Instance','InstanceText','Criteria','ClosingParagraph'));      &Apache::lonxml::register('Apache::bridgetask',('Task','IntroParagraph','Dimension','Question','QuestionText','Setup','Instance','InstanceText','Criteria','ClosingParagraph'));
 }  }
   
 sub initialize_bridgetask {  sub initialize_bridgetask {
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   &create_new_version($type,$user,$domain,$slot_name);
  my $version=  
     $Apache::lonhomework::history{'resource.0.version'};  
  $version++;  
   
  #clean out all current results  
  foreach my $key (keys(%Apache::lonhomework::history)) {  
     if ($key=~/^resource\.0\./) {  
  $Apache::lonhomework::results{$key}='';  
     }  
  }  
   
  #setup new version and who did it  
  $Apache::lonhomework::results{'resource.0.version'}=$version;  
  $Apache::lonhomework::results{"resource.$version.0.checkedin"}=  
     $user.':'.$domain;  
  $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=  
     $slot_name;  
   
  return 1;   return 1;
     } elsif ($authenticated && $type eq 'problem') {  
  &Apache::lonxml::debug("authed $slot_name");  
  $Apache::lonhomework::results{"resource.0.checkedin"}=  
     $user.':'.$domain;  
  $Apache::lonhomework::results{"resource.0.checkedin.slot"}=  
     $slot_name;  
     }      }
  }   }
     }      }
     return 0;      return 0;
 }  }
   
   sub create_new_version {
       my ($type,$user,$domain,$slot_name) = @_;
       if ($type eq 'Task') {
    # increment version
    my $version=
       $Apache::lonhomework::history{'resource.0.version'};
    $version++;
    &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;
    if (defined($user) && defined($domain)) {
       $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
    $user.':'.$domain;
    } else {
       $Apache::lonhomework::results{"resource.$version.0.checkedin"}=
    $env{'user.name'}.':'.$env{'user.domain'};
    }
    if (defined($slot_name)) {
       $Apache::lonhomework::results{"resource.$version.0.checkedin.slot"}=
    $slot_name;
    }
       } elsif ($type eq 'problem') {
    &Apache::lonxml::debug("authed $slot_name");
    if (defined($user) && defined($domain)) {
       $Apache::lonhomework::results{"resource.0.checkedin"}=
    $user.':'.$domain;
    }
    if (defined($slot_name)) {
       $Apache::lonhomework::results{"resource.0.checkedin.slot"}=
    $slot_name;
    }
       }
   }
   
 sub get_version {  sub get_version {
     my ($version,$previous);      my ($version,$previous);
     if ($env{'form.previousversion'} &&       if ($env{'form.previousversion'} && 
Line 120  sub get_version { Line 140  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 223  sub add_request_another_attempt_button { Line 247  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 266  STUFF
     }      }
           
     if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }      if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }
     $symb=&Apache::lonnet::escape($symb);      $symb=&escape($symb);
     $result.='<form method="post" action="/adm/slotrequest">'.      $result.='<form method="post" action="/adm/slotrequest">'.
  '<input type="hidden" name="symb" value="'.$symb.'" />'.   '<input type="hidden" name="symb" value="'.$symb.'" />'.
  '<input type="hidden" name="command" value="'.$action.'" />'.   '<input type="hidden" name="command" value="'.$action.'" />'.
Line 278  sub show_task { Line 308  sub show_task {
        ( $status eq 'NOT_IN_A_SLOT') ||         ( $status eq 'NOT_IN_A_SLOT') ||
        ( $status eq 'NEEDS_CHECKIN') ||         ( $status eq 'NEEDS_CHECKIN') ||
        ( $status eq 'WAITING_FOR_GRADE') ||         ( $status eq 'WAITING_FOR_GRADE') ||
        ( $status eq 'INVALID_ACCESS') )) {         ( $status eq 'INVALID_ACCESS') ||
          ( &get_version() eq ''))) {
  return 0;   return 0;
     }      }
     if ($env{'form.donescreen'}) { return 0; }      if ($env{'form.donescreen'}) { return 0; }
Line 334  sub file_list { Line 365  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',      'fail'   => 'Fail Rest',
        );      'cancel' => 'Cancel',
              );
       my %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'}"       <input type="button" name="fail" value="$lt{'fail'}" 
Line 395  sub start_Task { Line 444  sub start_Task {
     }      }
   
     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
       || $Apache::lonhomework::modifygrades) {
     $result.='<form name="gradesubmission" method="post" action="';      $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); }
Line 423  sub start_Task { Line 473  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 '') {
       &create_new_version('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.'";';
Line 495  DONESCREEN Line 555  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");
     }      }
  }   }
Line 533  DONESCREEN Line 597  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 548  DONESCREEN Line 612  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 '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 568  DONESCREEN Line 634  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 658  sub get_key_todo { Line 726  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
       #FIXME don't allow pregrade
       &Apache::lonxml::debug("not in queue no lock");
     return ($gradingkey);      return ($gradingkey);
  }   }
   
  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 689  sub get_key_todo { Line 761  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 741  sub get_key_todo { Line 815  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 802  DONEBUTTON Line 877  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 835  DONEBUTTON Line 918  DONEBUTTON
     $man_count++;      $man_count++;
  }   }
     }      }
       
     my $opt_req=&Apache::lonxml::get_param('OptionalRequired',      my $opt_req=&Apache::lonxml::get_param('OptionalRequired',
  $parstack,$safeeval);   $parstack,$safeeval);
     if ($opt_req !~ /\S/) { $opt_req='0'; }      if ($opt_req !~ /\S/) { $opt_req='0'; }
Line 843  DONEBUTTON Line 927  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/;
  }   }
     }   
     if ($target eq 'web') {  
  $result.="\n</div>\n".   $result.="\n</div>\n".
     &Apache::loncommon::end_page({'discussion' => 1});      &Apache::loncommon::end_page({'discussion' => 1});
     }      }
Line 870  DONEBUTTON Line 952  DONEBUTTON
     }      }
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
     if ($award eq 'SUBMITTED'      if ($award eq 'SUBMITTED') {
  && defined($Apache::inputtags::slot_name)) {   my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
  &add_to_queue('gradingqueue',[$Apache::inputtags::slot_name]);   if ($useslots =~ /^\s*no\s*$/i) {
       &add_to_queue('gradingqueue',
     {'type' => 'Task',
      'time' => time});
    } elsif (defined($Apache::inputtags::slot_name)) {
       &add_to_queue('gradingqueue',
     {'type' => 'Task',
      'time' => time,
      'slot' => $Apache::inputtags::slot_name});
    }
     }      }
  } elsif ($Apache::lonhomework::results{'INTERNAL_store'}) {   } elsif ($Apache::lonhomework::results{'INTERNAL_store'}) {
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
  }   }
  if ($target eq 'grade' && $env{'form.webgrade'} eq 'yes') {   if ($target eq 'grade' && $env{'form.webgrade'} eq 'yes' 
       && exists($env{'form.cancel'})) {
       &check_queue_unlock($env{'form.queue'});
       &Apache::lonxml::debug(" cancelled grading .".$env{'form.queue'});
    } elsif ($target eq 'grade' && $env{'form.webgrade'} eq 'yes' 
    && !exists($env{'form.cancel'})) {
     my $optional_required=      my $optional_required=
  &Apache::lonxml::get_param('OptionalRequired',$parstack,   &Apache::lonxml::get_param('OptionalRequired',$parstack,
    $safeeval);     $safeeval);
Line 1011  sub move_between_queues { Line 1107  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 1031  sub check_queue_unlock { Line 1127  sub check_queue_unlock {
     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 1110  sub check_queue_for_key { Line 1207  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 1141  sub add_to_queue { Line 1238  sub add_to_queue {
     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 1150  sub show_queue { Line 1271  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'};
Line 1199  sub show_queue { Line 1357  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 1214  sub show_queue { Line 1372  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 1236  sub get_queue_counts { Line 1395  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 1245  sub get_queue_counts { Line 1407  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 1292  sub queue_key_locked { Line 1462  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
Line 1336  sub pick_from_queue_data { Line 1540  sub pick_from_queue_data {
   
 sub find_mid_grade {  sub find_mid_grade {
     my ($queue,$symb,$cdom,$cnum)=@_;      my ($queue,$symb,$cdom,$cnum)=@_;
     my $todo=&Apache::lonnet::unescape($env{'form.gradingkey'});      my $todo=&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);
Line 1377  sub get_queue_symb_status { Line 1581  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 1386  sub get_queue_symb_status { Line 1592  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 1401  sub get_from_queue { Line 1608  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 1411  sub get_from_queue { Line 1621  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 1470  sub select_user { Line 1681  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 1502  sub select_user { Line 1712  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 1512  sub select_user { Line 1723  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 1525  sub select_user { Line 1734  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 1564  RESULT Line 1773  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 1619  sub get_id { Line 1828  sub get_id {
 }  }
   
 my %dimension;  my %dimension;
   sub start_Setup {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       undef(%dimension);
       my $dim_id=&get_id($parstack,$safeeval);
       $Apache::bridgetask::dimension=$dim_id;
       undef(@Apache::bridgetask::instance);
       &Apache::lonxml::startredirection();
       return &internal_location($dim_id);
   }
   sub start_Question { return &start_Dimension(@_); }
 sub start_Dimension {  sub start_Dimension {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     undef(%dimension);      undef(%dimension);
Line 1632  sub start_Dimension { Line 1851  sub start_Dimension {
     return &internal_location($dim_id);      return &internal_location($dim_id);
 }  }
   
   sub start_QuestionText {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       my $dim_id=$Apache::bridgetask::dimension;
       my $text=&Apache::lonxml::get_all_text('/questiontext',$parser,$style);
       if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
    $dimension{'questiontext'}=$text;
       }
       return '';
   }
   
   sub end_QuestionText {
       return '';
   }
   
 sub get_instance {  sub get_instance {
     my ($dim)=@_;      my ($dim)=@_;
     my $rand_alg=&Apache::lonnet::get_rand_alg();      my $rand_alg=&Apache::lonnet::get_rand_alg();
Line 1661  sub get_instance { Line 1894  sub get_instance {
  }   }
  @instances = &Math::Random::random_permutation(@instances);   @instances = &Math::Random::random_permutation(@instances);
  $instance  = $instances[($version-1)%scalar(@instances)];   $instance  = $instances[($version-1)%scalar(@instances)];
  $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} =    if ($version =~ /^\d$/) {
     $instance;      $Apache::lonhomework::results{"resource.$version.0.$dim.instance"} = 
  $Apache::lonhomework::results{'INTERNAL_store'} = 1;    $instance;
       $Apache::lonhomework::results{'INTERNAL_store'} = 1; 
    }
  &Apache::response::poprandomnumber();   &Apache::response::poprandomnumber();
  return $instance;   return $instance;
     }      }
Line 1672  sub get_instance { Line 1907  sub get_instance {
 {  {
     my $last_link;      my $last_link;
     sub link {      sub link {
  my ($instance,$id) = @_;   my ($id) = @_;
  return 'LC_GRADING_criteria_'.$instance.'_'.$id;   $id =~ s/\./_/g;
    return 'LC_GRADING_criteria_'.$id;
     }      }
       sub end_Question { return &end_Dimension(@_); }
     sub end_Dimension {      sub end_Dimension {
  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;   my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
  my $result=&Apache::lonxml::endredirection();   my $result=&Apache::lonxml::endredirection();
Line 1688  sub get_instance { Line 1925  sub get_instance {
     if (&Apache::response::showallfoils()) {      if (&Apache::response::showallfoils()) {
  @instances = @{$dimension{'instances'}};   @instances = @{$dimension{'instances'}};
     }      }
       my $shown_question_text;
     foreach my $instance (@instances) {      foreach my $instance (@instances) {
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});   $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});
    @Apache::scripttag::parser_env = @_;
    $result.=&Apache::scripttag::xmlparse($dimension{'questiontext'});
  if ($Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass' ||   if ($Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass' ||
     $Apache::lonhomework::history{"resource.$version.0.status"} eq 'fail') {      $Apache::lonhomework::history{"resource.$version.0.status"} eq 'fail') {
   
Line 1710  sub get_instance { Line 1950  sub get_instance {
     my $man_passed=0;      my $man_passed=0;
     my $opt_count=0;      my $opt_count=0;
     my $opt_passed=0;      my $opt_passed=0;
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {      foreach my $id ( @{$dimension{$instance.'.criterias'}},
  if ($dimension{$instance.'.criteria.'.$id.'.mandatory'}        @{$dimension{'criterias'}} ) {
    if ($dimension{'criteria.'.$id.'.mandatory'} 
     eq 'N') {      eq 'N') {
     $opt_count++;      $opt_count++;
     if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"} eq 'pass') {      if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"} eq 'pass') {
  $opt_passed++;   $opt_passed++;
     }      }
  } else {   } else {
Line 1725  sub get_instance { Line 1966  sub get_instance {
  }   }
     }      }
     if ($man_passed eq $man_count) { $man_passed='all'; }      if ($man_passed eq $man_count) { $man_passed='all'; }
   
     my $opt_req=$dimension{$instance.'.optionalrequired'};      my $opt_req=$dimension{$instance.'.optionalrequired'};
     if ($opt_req !~ /\S/) { $opt_req='0'; }      if ($opt_req !~ /\S/) {
    $opt_req=
       &Apache::lonxml::get_param('OptionalRequired',
          $parstack,$safeeval);
    if ($opt_req !~ /\S/) { $opt_req = 0; }
       }
     $dim_info.="\n<p>".&mt('You passed [_1] of the [_2] mandatory components and [_3] of the [_4] optional components, of which you were required to pass [_5].',$man_passed,$man_count,$opt_passed,$opt_count,$opt_req)."</p>\n</div>";      $dim_info.="\n<p>".&mt('You passed [_1] of the [_2] mandatory components and [_3] of the [_4] optional components, of which you were required to pass [_5].',$man_passed,$man_count,$opt_passed,$opt_count,$opt_req)."</p>\n</div>";
   
     my $internal_location=&internal_location($dim);      my $internal_location=&internal_location($dim);
     $result=~s/\Q$internal_location\E/$dim_info/;      $result=~s/\Q$internal_location\E/$dim_info/;
   
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {      foreach my $id (@{$dimension{$instance.'.criterias'}},
  my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};      @{$dimension{'criterias'}}) {
  my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"};   my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
  my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');   my $comment=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"};
    my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N');
  if ($mandatory) {   if ($mandatory) {
     $mandatory='Mandatory';      $mandatory='Mandatory';
  } else {   } else {
Line 1748  sub get_instance { Line 1996  sub get_instance {
  }   }
  my $status_display=$status;   my $status_display=$status;
  $status_display=~s/^([a-z])/uc($1)/e;   $status_display=~s/^([a-z])/uc($1)/e;
  @Apache::scripttag::parser_env = @_;  
  $result.=   $result.=
     '<div class="LC_'.$status.' LC_criteria"><h4>'      '<div class="LC_'.$status.' LC_criteria"><h4>'
     .$mandatory.' Criteria</h4><p>';      .$mandatory.' Criteria</h4><p>';
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});   $result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id});
  $result.='</p><p class="LC_grade">'.$status_display.'</p>';   $result.='</p><p class="LC_grade">'.$status_display.'</p>';
  if ($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}) {   if ($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}) {
     $result.='<p class="LC_comment">'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}).'</p>';      $result.='<p class="LC_comment">'.&mt('Comment: [_1]',$Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'</p>';
  }   }
  $result.='</div>';   $result.='</div>';
     }      }
Line 1768  sub get_instance { Line 2015  sub get_instance {
     &Apache::scripttag::xmlparse($dimension{'intro'});      &Apache::scripttag::xmlparse($dimension{'intro'});
     @Apache::scripttag::parser_env = @_;      @Apache::scripttag::parser_env = @_;
     &Apache::scripttag::xmlparse($dimension{$instance.'.text'});      &Apache::scripttag::xmlparse($dimension{$instance.'.text'});
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {      @Apache::scripttag::parser_env = @_;
  my $link=&link($instance,$id);      &Apache::scripttag::xmlparse($dimension{'questiontext'});
  my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.status"};      foreach my $id (@{$dimension{$instance.'.criterias'}},
       @{$dimension{'criterias'}} ) {
    my $link=&link($id);
    my $status=$Apache::lonhomework::history{"resource.$version.0.$dim.$id.status"};
  $result.='<div class="LC_GRADING_criteria" id="'.$link.'">'."\n".   $result.='<div class="LC_GRADING_criteria" id="'.$link.'">'."\n".
     '<div class="LC_GRADING_criteriatext" id="next_'.$last_link.'">'."\n";      '<div class="LC_GRADING_criteriatext" id="next_'.$last_link.'">'."\n";
  @Apache::scripttag::parser_env = @_;   @Apache::scripttag::parser_env = @_;
  $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.criteria.'.$id});   $result.=&Apache::scripttag::xmlparse($dimension{'criteria.'.$id});
  $result.='</div>'."\n".   $result.='</div>'."\n".
     #$dimension{$instance.'.criteria.'.$id}.      #$dimension{'criteria.'.$id}.
     '<div class="LC_GRADING_grade">'."\n".      '<div class="LC_GRADING_grade">'."\n".
     '<label class="LC_GRADING_ungraded"><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label>'."\n".      '<label class="LC_GRADING_ungraded"><input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.&mt('Ungraded').'</label>'."\n".
     '<label class="LC_GRADING_fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".      '<label class="LC_GRADING_fail"><input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.&mt('Fail').'</label>'."\n".
Line 1784  sub get_instance { Line 2034  sub get_instance {
     '<label class="LC_GRADING_review"><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label>'."\n".      '<label class="LC_GRADING_review"><input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.&mt('Review').'</label>'."\n".
     '</div>'."\n".      '</div>'."\n".
     '<label class="LC_GRADING_comment">'.&mt('Additional Comment for Student')."\n".      '<label class="LC_GRADING_comment">'.&mt('Additional Comment for Student')."\n".
     '<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode($Apache::lonhomework::history{"resource.$version.0.$dim.$instance.$id.comment"}).'</textarea>'."\n".      '<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode($Apache::lonhomework::history{"resource.$version.0.$dim.$id.comment"}).'</textarea>'."\n".
     '</label>'."\n".      '</label>'."\n".
     '<ul class="LC_GRADING_navbuttons">'."\n".      '<ul class="LC_GRADING_navbuttons">'."\n".
     '<li><a href="#'.$last_link.'">Prev</a></li>'."\n".      '<li><a href="#'.$last_link.'">Prev</a></li>'."\n".
     '<li><a href="#next_'.$link.'">Next</a></li>'."\n".      '<li><a href="#next_'.$link.'">Next</a></li>'."\n".
     '</ul>'."\n".      '</ul>'."\n".
                     '</div>'."\n";                      '</div>'."\n";
  $result.=&grading_history($version,$dim,$instance,$id);   $result.=&grading_history($version,$dim,$id);
  $last_link=$link;   $last_link=$link;
     }      }
  } elsif ($target eq 'grade' && $env{'form.webgrade'}) {   } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
Line 1799  sub get_instance { Line 2049  sub get_instance {
     my $mandatory_failed=0;      my $mandatory_failed=0;
     my $ungraded=0;      my $ungraded=0;
     my $review=0;      my $review=0;
     foreach my $id (@{$dimension{$instance.'.criterias'}}) {  
  my $link=&link($instance,$id);      @Apache::scripttag::parser_env = @_;
  my $status=$Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.status"}=$env{'form.HWVAL_'.$link};      $result.=&Apache::scripttag::xmlparse($dimension{'intro'});
  $Apache::lonhomework::results{"resource.$version.0.$dim.$instance.$id.comment"}=$env{'form.HWVAL_comment_'.$link};      @Apache::scripttag::parser_env = @_;
  my $mandatory=($dimension{$instance.'.criteria.'.$id.'.mandatory'} ne 'N');      $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});
       @Apache::scripttag::parser_env = @_;
       &Apache::scripttag::xmlparse($dimension{'questiontext'});
   
       foreach my $id (@{$dimension{$instance.'.criterias'}},
       @{$dimension{'criterias'}}) {
    my $link=&link($id);
    my $status=$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};
    my $mandatory=($dimension{'criteria.'.$id.'.mandatory'} ne 'N');
  if ($status eq 'pass') {   if ($status eq 'pass') {
     if (!$mandatory) { $optional_passed++; }      if (!$mandatory) { $optional_passed++; }
  } elsif ($status eq 'fail') {   } elsif ($status eq 'fail') {
Line 1816  sub get_instance { Line 2075  sub get_instance {
     $ungraded++;      $ungraded++;
  }   }
     }      }
     if ($optional_passed < $dimension{$instance.'.optionalrequired'}) {      # FIXME optional required can apply to only <instance> right now...
       my $opt_req=$dimension{$instance.'.optionalrequired'};
       if ($opt_req !~ /\S/) {
    $opt_req=
       &Apache::lonxml::get_param('OptionalRequired',
          $parstack,$safeeval);
    if ($opt_req !~ /\S/) { $opt_req = 0; }
       }
       if ($optional_passed < $opt_req) {
  $mandatory_failed++;   $mandatory_failed++;
     }      }
     &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");      &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
Line 1839  sub get_instance { Line 2106  sub get_instance {
  }   }
  return $result;   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{'intro'});
       my @instances = $instance;
       if (&Apache::response::showallfoils()) {
    @instances = @{$dimension{'instances'}};
       }
       foreach my $instance (@instances) {
    @Apache::scripttag::parser_env = @_;
    $result.=&Apache::scripttag::xmlparse($dimension{$instance.'.text'});
    @Apache::scripttag::parser_env = @_;
    $result.=&Apache::scripttag::xmlparse($dimension{'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{'intro'});
       @Apache::scripttag::parser_env = @_;
       &Apache::scripttag::xmlparse($dimension{$instance.'.text'});
       @Apache::scripttag::parser_env = @_;
       &Apache::scripttag::xmlparse($dimension{'questiontext'});
    } else {
       # any other targets no output
       undef($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) = 
Line 1876  sub grading_history { Line 2178  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') {      if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
  if ($tagstack->[-2] eq 'Dimension') {   if ($tagstack->[-2] eq 'Dimension' || $tagstack->[-2] eq 'Question' ) {
     $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style);      $dimension{'intro'}=
    &Apache::lonxml::get_all_text('/introparagraph',
  } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {        $parser,$style);
           } elsif ($tagstack->[-2] eq 'Task' && $target eq 'webgrade') {
     &Apache::lonxml::startredirection();      &Apache::lonxml::startredirection();
  }   }
   
Line 1917  sub start_InstanceText { Line 2220  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 $instance_id=$Apache::bridgetask::instance[-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{$instance_id.'.text'}=$text;
     }      }
     return '';      return '';
Line 1929  sub end_InstanceText { Line 2232  sub end_InstanceText {
   
 sub start_Criteria {  sub start_Criteria {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $instance_id=$Apache::bridgetask::instance[-1];  
     my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser,$style);      my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser,$style);
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {      if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {
  my $id=&get_id($parstack,$safeeval);   my $id=&get_id($parstack,$safeeval);
  $dimension{$instance_id.'.criteria.'.$id}=$criteria;   if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {
  $dimension{$instance_id.'.criteria.'.$id.'.mandatory'}=      my $instance_id=$Apache::bridgetask::instance[-1];
     &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);      $dimension{"criteria.$instance_id.$id"}=$criteria;
  push(@{$dimension{$instance_id.'.criterias'}},$id);      $dimension{"criteria.$instance_id.$id.mandatory"}=
    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
       push(@{$dimension{$instance_id.'.criterias'}},"$instance_id.$id");
    } else {
       $dimension{'criteria.'.$id}=$criteria;
       $dimension{'criteria.'.$id.'.mandatory'}=
    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
       push(@{$dimension{'criterias'}},$id);
    }
     }      }
     return '';      return '';
 }  }

Removed from v.1.146  
changed lines
  Added in v.1.163


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