Diff for /loncom/homework/bridgetask.pm between versions 1.226 and 1.273

version 1.226, 2007/02/22 21:40:40 version 1.273, 2023/01/23 20:31:13
Line 37  use Apache::lonmenu; Line 37  use Apache::lonmenu;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::slotrequest();  use Apache::slotrequest();
   use Apache::structuretags();
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
 use lib '/home/httpd/lib/perl/';  
 use LONCAPA;  use LONCAPA;
     
   
Line 65  sub initialize_bridgetask { Line 65  sub initialize_bridgetask {
 sub proctor_check_auth {  sub proctor_check_auth {
     my ($slot_name,$slot,$type)=@_;      my ($slot_name,$slot,$type)=@_;
     my $user=$env{'form.proctorname'};      my $user=$env{'form.proctorname'};
       $user =~ s/^\s+|\s+$//g;
     my $domain=$env{'form.proctordomain'};      my $domain=$env{'form.proctordomain'};
           
     my @allowed=split(",",$slot->{'proctor'});      my @allowed=split(",",$slot->{'proctor'});
Line 83  sub proctor_check_auth { Line 84  sub proctor_check_auth {
  }   }
     }      }
     if ($authenticated) {      if ($authenticated) {
  &check_in($type,$user,$domain,$slot_name);   my $check = &check_in($type,$user,$domain,$slot_name,$slot->{'iptied'});
                   if ($check =~ /^error:/) {
                       return 0;
                   }
  return 1;   return 1;
     }      }
  }   }
Line 92  sub proctor_check_auth { Line 96  sub proctor_check_auth {
 }  }
   
 sub check_in {  sub check_in {
     my ($type,$user,$domain,$slot_name) = @_;      my ($type,$user,$domain,$slot_name,$needsiptied) = @_;
     my $useslots = &Apache::lonnet::EXT("resource.0.useslots");      my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
       my $ip=$ENV{'REMOTE_ADDR'} || $env{'request.host'};
     if ( $useslots eq 'map_map') {      if ( $useslots eq 'map_map') {
  &check_in_sequence($user,$domain,$slot_name);   my $result = &check_in_sequence($user,$domain,$slot_name,$ip,$needsiptied);
           if ($result =~ /^error: /) {
               return $result;
           }
     } else {      } else {
  &create_new_version($type,$user,$domain,$slot_name);          my ($symb) = &Apache::lonnet::whichuser();
  &Apache::structuretags::finalize_storage();   my $result = &create_new_version($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied);
           if ($result eq 'ok') {
       &Apache::structuretags::finalize_storage();
           }
           return $result; 
     }      }
     return 1;      return 1;
 }  }
   
 sub check_in_sequence {  sub check_in_sequence {
     my ($user,$domain,$slot_name) = @_;      my ($user,$domain,$slot_name,$ip,$needsiptied) = @_;
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
       if (!defined($navmap)) {
           return 'error: No navmap';
       }
     my ($symb) = &Apache::lonnet::whichuser();      my ($symb) = &Apache::lonnet::whichuser();
     my ($map)  = &Apache::lonnet::decode_symb($symb);      my ($map)  = &Apache::lonnet::decode_symb($symb);
     my @resources =       my @resources = 
  $navmap->retrieveResources($map, sub { $_[0]->is_problem() },0,0);   $navmap->retrieveResources($map, sub { $_[0]->is_problem() || $_[0]->is_tool() },0,0);
     my %old_history = %Apache::lonhomework::history;      my %old_history = %Apache::lonhomework::history;
     my %old_results = %Apache::lonhomework::results;      my %old_results = %Apache::lonhomework::results;
   
       my $errorcount;
     foreach my $res (@resources) {      foreach my $res (@resources) {
  &Apache::lonxml::debug("doing ".$res->src);   &Apache::lonxml::debug("doing ".$res->src);
  &Apache::structuretags::initialize_storage($res->symb);   &Apache::structuretags::initialize_storage($res->symb);
  my $type = ($res->is_task()) ? 'Task' : 'problem';   my $type;
  &create_new_version($type,$user,$domain,$slot_name);          if ($res->is_task()) {
  &Apache::structuretags::finalize_storage($res->symb);              $type = 'Task';
           } elsif ($res->is_tool) {
               $type = 'tool';
           } else {
               $type = 'problem';
           }
    my $result = &create_new_version($type,$user,$domain,$slot_name,$res->symb,$ip,$needsiptied);
           if ($result eq 'ok') {
       &Apache::structuretags::finalize_storage($res->symb);
           } else {
               $errorcount ++;
           }
     }      }
           
     %Apache::lonhomework::history = %old_history;      %Apache::lonhomework::history = %old_history;
     %Apache::lonhomework::results = %old_results;      %Apache::lonhomework::results = %old_results;
       if ($errorcount) {
           return 'error: IP taken';
       }
 }  }
   
 sub create_new_version {  sub create_new_version {
     my ($type,$user,$domain,$slot_name) = @_;      my ($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied) = @_;
   
       if ($needsiptied) {
           my $uniqkey = "$slot_name\0$symb\0$ip";
           my ($cdom,$cnum);
           if ($env{'request.course.id'}) {
               my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
               my %hash = (
                             "$slot_name\0$symb\0$ip" => $env{'user.name'}.':'.$env{'user.domain'}, 
                          );
               unless (&Apache::lonnet::newput('slot_uniqueips',\%hash,$cdom,$cnum) eq 'ok') {
                   return 'error: IP taken';
               }
           }
       }
           
     my $id = '0';      my $id = '0';
     if ($type eq 'Task') {      if ($type eq 'Task') {
Line 150  sub create_new_version { Line 195  sub create_new_version {
     $domain = $env{'user.domain'};      $domain = $env{'user.domain'};
  }   }
   
     } elsif ($type eq 'problem') {      } elsif (($type eq 'problem') || ($type eq 'tool')) {
  &Apache::lonxml::debug("authed $slot_name");   &Apache::lonxml::debug("authed $slot_name");
     }      }
     if (!defined($user) || !defined($domain)) {      if (!defined($user) || !defined($domain)) {
Line 160  sub create_new_version { Line 205  sub create_new_version {
   
     $Apache::lonhomework::results{"resource.$id.checkedin"}=      $Apache::lonhomework::results{"resource.$id.checkedin"}=
  $user.':'.$domain;   $user.':'.$domain;
       $Apache::lonhomework::results{"resource.$id.checkedin.ip"}=$ip;
   
     if (defined($slot_name)) {      if (defined($slot_name)) {
  $Apache::lonhomework::results{"resource.$id.checkedin.slot"}=   $Apache::lonhomework::results{"resource.$id.checkedin.slot"}=
     $slot_name;      $slot_name;
     }      }
       return 'ok'; 
 }  }
   
 sub get_version {  sub get_version {
Line 190  sub get_version { Line 237  sub get_version {
   
 sub add_previous_version_button {  sub add_previous_version_button {
     my ($status)=@_;      my ($status)=@_;
       my (undef,undef,$udom,$uname)=&Apache::lonnet::whichuser();
       if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
           return;
       }
     my $result;      my $result;
     if ($Apache::lonhomework::history{'resource.0.version'} eq '') {      if ($Apache::lonhomework::history{'resource.0.version'} eq '') {
  return '';   return '';
Line 226  sub add_previous_version_button { Line 277  sub add_previous_version_button {
 }  }
   
 sub add_grading_button {  sub add_grading_button {
     my (undef,$cid)=&Apache::lonnet::whichuser();      my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
       if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
           return;
       }
     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 = &Apache::loncommon::get_sections($cdom,$cnum);      my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
Line 236  sub add_grading_button { Line 290  sub add_grading_button {
  $size=scalar(keys(%sections))+2;   $size=scalar(keys(%sections))+2;
     }      }
     my $sec_select = "\n".'<select multiple="multiple" name="chosensections" size="'.$size.'">'."\n";      my $sec_select = "\n".'<select multiple="multiple" name="chosensections" size="'.$size.'">'."\n";
     $sec_select .= "\t<option value='all' selected='selected'>all</option>\n";      $sec_select .= "\t".'<option value="all" selected="selected">'.&mt('all')."</option>\n";
     foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {      foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
  $sec_select .= "\t<option value=\"$sec\">$sec</option>\n";   $sec_select .= "\t<option value=\"$sec\">$sec</option>\n";
     }      }
     $sec_select .= "\t<option value='none'>none</option>\n</select>\n";      $sec_select .= "\t".'<option value="none">'.&mt('none')."</option>\n</select>\n";
       
     my $result="\n\t".'<input type="submit" name="gradeasubmission" value="'.      my $uri=$env{'request.uri'};
  &mt("Get a submission to grade").'" />';      if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
     $result.="\n\t".'<input type="hidden" name="grade_target" value="webgrade" />';      my $result = 
     if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {          '<form name="gradesubmission" method="post" action="'.$uri.'">'.
           "\n\t".'<input type="submit" name="gradeasubmission" value="'.
    &mt("Get a submission to grade").'" />'.
           "\n\t".'<input type="hidden" name="grade_target" value="webgrade" />';
       my $see_all = &Apache::lonnet::allowed('mgq',$env{'request.course.id'});
       my $see_sec = &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.
      '/'.$env{'request.course.sec'});
   
       if ($see_all || $see_sec) {
  my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');   my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');
  $result.="\n\t".'<table>'."\n\t\t".'<tr>';   $result.="\n\t".'<table>'."\n\t\t".'<tr>';
  $result.="\n\t\t\t".'<td rowspan="4">Specify a section: </td>'.   if ($see_all || (!&section_restricted())) {
     "\n\t\t\t".'<td rowspan="4">'.$sec_select."\n\t\t\t".'</td>';      $result.="\n\t\t\t".'<td rowspan="4">'.&mt('Specify a section:').' </td>'.
    "\n\t\t\t".'<td rowspan="4">'.$sec_select."\n\t\t\t".'</td>';
    } else {
       $result.="\n\t\t\t".'<td rowspan="4">'.&mt('Grading section:').' </td>'.
    "\n\t\t\t".'<td rowspan="4">'.$env{'request.course.sec'}."\n\t\t\t".'</td>';
    }
  $result.="\n\t\t\t".'<td>'.'<input type="submit" name="reviewagrading" value="'.   $result.="\n\t\t\t".'<td>'.'<input type="submit" name="reviewagrading" value="'.
     &mt("Select an entry from the grading queue:").'" /> ';      &mt("Select an entry from the grading queue:").'" /> ';
   
Line 281  sub add_grading_button { Line 348  sub add_grading_button {
  $result.=&Apache::loncommon::studentbrowser_javascript();   $result.=&Apache::loncommon::studentbrowser_javascript();
  $result.= '</p>'."\n";   $result.= '</p>'."\n";
     }      }
       $result .= '</form>'."\n";
       return $result;
   }
   
   sub add_slotlist_button {
       my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
       if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
           return;
       }
       my $symb=&Apache::lonnet::symbread();
       my $result;
       if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'}) ||
           &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
           $result = '<form method="post" name="slotrequest" action="/adm/slotrequest">'.
                     '<input type="hidden" name="symb" value="'.$symb.'" />'.
                     '<input type="hidden" name="command" value="showslots" />'.
                     '<input type="submit" name="requestattempt" value="'.
                     &mt('Show Slot list').'" />'.
                     '</form>';
           my $target_id =
                  &Apache::lonstathelpers::make_target_id({symb => $symb,
                                                                part => '0'});
           if (!&section_restricted()) {
               $result.='<form method="post" name="gradingstatus" action="/adm/statistics">'.
                        '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.
                        '<input type="hidden" name="reportSelected" value="grading_analysis" />'.
                        '<input type="submit" name="grading" value="'.
                        &mt('Show Grading Status').'" />'.
                        '</form>';
           }
       }
     return $result;      return $result;
 }  }
   
 sub add_request_another_attempt_button {  sub add_request_another_attempt_button {
     my ($text)=@_;      my ($text)=@_;
     if (!$text) { $text="Request another attempt"; }      my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
       if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
           return;
       }
       if (!$text) { $text=&mt('Request another attempt'); }
     my $result;      my $result;
     my $symb=&Apache::lonnet::symbread();      my $symb=&Apache::lonnet::symbread();
     # not a slot access based resource      # not a slot access based resource
Line 298  sub add_request_another_attempt_button { Line 400  sub add_request_another_attempt_button {
     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) {
  $text="Change reservation.";   $text=&mt('Change reservation');
  $action='change_reservation';   $action='change_reservation';
  my $description=&Apache::slotrequest::get_description($slot_name,   my $description=&Apache::slotrequest::get_description($slot_name,
       $slot);        $slot);
  $result.=(<<STUFF);   $result.='<p>'
     <p> Will be next available: $description </p>                  .&mt('Will be next available:')
 STUFF                  .' '.$description
                   .'</p>';
     }      }
           
     if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }      if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }
Line 314  STUFF Line 417  STUFF
  '<input type="hidden" name="symb" value="'.$symb.'" />'."\n\t\t".   '<input type="hidden" name="symb" value="'.$symb.'" />'."\n\t\t".
  '<input type="hidden" name="command" value="'.$action.'" />'."\n\t\t".   '<input type="hidden" name="command" value="'.$action.'" />'."\n\t\t".
  '<input type="submit" name="requestattempt" value="'.   '<input type="submit" name="requestattempt" value="'.
  &mt($text).'" />'."\n\t".   $text.'" />'."\n\t".
  '</form>'."\n";   '</form>'."\n";
     return $result;      return $result;
 }  }
Line 362  sub show_task { Line 465  sub show_task {
        ( $status eq 'BANNED') ||         ( $status eq 'BANNED') ||
        ( $status eq 'UNAVAILABLE') ||         ( $status eq 'UNAVAILABLE') ||
        ( $status eq 'NOT_IN_A_SLOT') ||         ( $status eq 'NOT_IN_A_SLOT') ||
                          ( $status eq 'NOT_YET_VIEWED') ||
        ( $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') ||
Line 464  sub file_list { Line 568  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><span style="white-space: nowrap;"><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.   $file_list.='<li><span class="LC_nobreak"><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.
     &Apache::loncommon::icon($file).'" alt="file icon" border="0" /> '.$file.      &Apache::loncommon::icon($file).'" alt="file icon" border="0" /> '.$file.
     '</a></span></li>'."\n";      '</a></span></li>'."\n";
     }      }
Line 484  sub webgrade_standard_info { Line 588  sub webgrade_standard_info {
   
     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=('done'   => 'Next Item',      my %lt = &Apache::lonlocal::texthash(
     'stop'   => 'Quit Grading',          'done'   => 'Next Item',
     'fail'   => 'Fail Rest',          'stop'   => 'Quit Grading',
     'cancel' => 'Cancel',          'fail'   => 'Fail Rest',
     );          'cancel' => 'Cancel',
     %lt=&Apache::lonlocal::texthash(%lt);          'submit' => 'Submit Grades',
       );
   
     my $result=<<INFO;      my $result=<<INFO;
   <div class="LC_GRADING_maincontrols">    <div class="LC_GRADING_maincontrols">
 INFO  INFO
   
     if (&grade_mode() eq 'regrade') {      if ($env{'request.state'} eq 'construct') {
  $result.=<<INFO;   $result.=<<INFO;
       <input type="submit" name="next" value="$lt{'submit'}" />
   INFO
       } else {
    if (&grade_mode() eq 'regrade' && $env{'request.state'} ne 'construct') {
       $result.=<<INFO;
     <input type="submit" name="cancel" value="$lt{'cancel'}" />      <input type="submit" name="cancel" value="$lt{'cancel'}" />
 INFO  INFO
     }          }
   
     $result.=<<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'}" />
   INFO
       }
       $result.=<<INFO;
     <input type="button" name="fail" value="$lt{'fail'}"       <input type="button" name="fail" value="$lt{'fail'}" 
            onclick="javascript:onFailRest()" />             onclick="javascript:onFailRest()" />
   </div>    </div>
   $file_list    $file_list
 INFO  INFO
     return $result;      return $result;
   
 }  }
   
 sub done_screen {  sub done_screen {
     my ($version) = @_;      my ($version) = @_;
     my $title=&Apache::lonnet::gettitle();      my $title=&Apache::lonnet::gettitle($env{'request.uri'});
     my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});      my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});
     my (undef,undef,$domain,$user)= &Apache::lonnet::whichuser();      my (undef,undef,$domain,$user)= &Apache::lonnet::whichuser();
     my $files = '<ul>';      my ($msg,$files,$shown);
     my $msg;      if (@files > 0) {
     foreach my $file (@files) {          $files = '<ul>';
  my $url="/uploaded/$domain/$user/portfolio$file";          foreach my $file (@files) {
  if (! &Apache::lonnet::stat_file($url)) {      my $url="/uploaded/$domain/$user/portfolio$file";
     $file = &mt('<span class="LC_error"> Nonexistent file:</span> '.      if (! &Apache::lonnet::stat_file($url)) {
  '<span class="LC_filename">[_1]</span>',$file);          $file = '<span class="LC_error">'
     $msg .= "<p>Submitted non-existant file $file</p>\n";                         .&mt('[_1]Nonexistent file:[_2]'
  } else {                             ,'<span class="LC_error"> '
     $file = '<span class="LC_filename">'.$file.'</span>';                             ,'</span> <span class="LC_filename">'.$file.'</span>');
     $msg .= "<p>Submitted file $file</p>\n";          $msg .= "<p>".&mt('Submitted non-existent file [_1]',$file)."</p>\n";
  }      } else {
  $files .= '<li>'.$file.'</li>';          $file = '<span class="LC_filename">'.$file.'</span>';
           $msg .= "<p>".&mt('Submitted file [_1]',$file)."</p>\n";
       }
       $files .= '<li>'.$file.'</li>';
           }
           $files.='</ul>';
           $shown = '<p>'.&mt('Files submitted: [_1]',$files).'</p>'
                   .'<p>'.&mt('You are now done with this Bridge Task').'</p>'
                   .'<hr />'
                   .'<p><a href="/adm/logout">'.&mt('Logout').'</a></p>'
                   .'<p><a href="/adm/roles">'.&mt('Change to a different course').'</a></p>';
       } else {
           $msg = &mt("Submission status: no files currently submitted, when 'Done' was indicated.");
           $shown = '<p class="LC_error">'.
                    &mt('You did not submit any files.  Please try again.').'</span>'.
                    '</p><p><a href="javascript:history.go(-1);">'.&mt('Back to Bridge Task').'</a></p><hr />';
     }      }
     $files.='</ul>';      my $subject = &mt('Submission message for [_1]',$title);
     my $subject = "Submission message for $title";  
     my ($message_status,$comment_status);      my ($message_status,$comment_status);
     my $setting = $env{'course.'.$env{'request.course.id'}.'.task_messages'};      my $setting = $env{'course.'.$env{'request.course.id'}.'.task_messages'};
     $setting =~ s/^\s*(\S*)\s*$/$1/;      $setting =~ s/^\s*(\S*)\s*$/$1/;
Line 551  sub done_screen { Line 679  sub done_screen {
  $comment_status = '<p>'.&mt('Message sent to instructor: [_1]',   $comment_status = '<p>'.&mt('Message sent to instructor: [_1]',
     $comment_status).' </p>';      $comment_status).' </p>';
     }      }
     return <<DONESCREEN;   
 <h2>$title</h2>      return "<h2>$title</h2>"
 <p> Files submitted: $files </p>            .$shown
 <p> You are now done with this Bridge Task </p>            .$message_status
 <hr />            .$comment_status;
 <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 {
Line 591  sub start_Task { Line 713  sub start_Task {
     &Apache::structuretags::page_start($target,$token,$tagstack,      &Apache::structuretags::page_start($target,$token,$tagstack,
        $parstack,$parser,$safeeval,         $parstack,$parser,$safeeval,
        $name,&style($target));         $name,&style($target));
   
       }
       if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
           $target eq 'tex') {
           if ($env{'form.markaccess'}) {
               my @interval=&Apache::lonnet::EXT("resource.0.interval");
               my ($timelimit) = ($interval[0] =~ /^(\d+)/);
               &Apache::lonnet::set_first_access($interval[1],$timelimit);
           }
     }      }
   
     if ($target eq 'web' && $env{'request.state'} ne 'construct') {      if ($target eq 'web' && $env{'request.state'} ne 'construct') {
  if ($Apache::lonhomework::queuegrade   if ($Apache::lonhomework::queuegrade
     || $Apache::lonhomework::modifygrades) {      || $Apache::lonhomework::modifygrades) {
     $result.='<form name="gradesubmission" method="post" action="';      $result .= &add_grading_button();
     my $uri=$env{'request.uri'};  
     if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }  
     $result.=$uri.'">'.&add_grading_button()."</form>\n";  
     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'})
  $result.='<form method="post" name="slotrequest" action="/adm/slotrequest">'.   || &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
     '<input type="hidden" name="symb" value="'.$symb.'" />'.                  $result .= &add_slotlist_button(); 
     '<input type="hidden" name="command" value="showslots" />'.  
     '<input type="submit" name="requestattempt" value="'.  
     &mt('Show Slot list').'" />'.  
     '</form>';  
  my $target_id =   
     &Apache::lonstathelpers::make_target_id({symb => $symb,  
      part => '0'});  
  $result.='<form method="post" name="gradingstatus" action="/adm/statistics">'.  
     '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.  
     '<input type="hidden" name="reportSelected" value="grading_analysis" />'.  
     '<input type="submit" name="grading" value="'.  
     &mt('Show Grading Status').'" />'.  
     '</form>';  
     }      }
  }   }
     }      }
     if ($target eq 'web' && $env{'request.state'} eq 'construct') {      if ($target =~/(web|webgrade)/ && $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'       if ($target eq 'web' 
Line 630  sub start_Task { Line 745  sub start_Task {
  my ($version,$previous)=&get_version();   my ($version,$previous)=&get_version();
  ($status,$accessmsg,my $slot_name,$slot) =    ($status,$accessmsg,my $slot_name,$slot) = 
     &Apache::lonhomework::check_slot_access('0','Task');      &Apache::lonhomework::check_slot_access('0','Task');
  if ($status eq 'CAN_ANSWER' && $version eq '') {   if ((($status eq 'CAN_ANSWER') || ($status eq 'NOT_YET_VIEWED')) && ($version eq '')) {
     # CAN_ANSWER mode, and no current version, unproctored access      # CAN_ANSWER or NOT_YET_VIEWED mode, and no current version, unproctored access
     # thus self-checkedin      # thus self-checkedin
     &check_in('Task',undef,undef,$slot_name);              my $needsiptied;
               if (ref($slot)) {
                   $needsiptied = $slot->{'iptied'};
               }
       my $check = &check_in('Task',undef,undef,$slot_name,$needsiptied);
               if ($check =~ /^error:\s+(.*)$/) {
                   my $symb=&Apache::lonnet::symbread();
                   &Apache::lonnet::logthis("Error: $1 during self-checkin of version $version of Task (symb: $symb) using slot: $slot_name");   
               }
     &add_to_queue('gradingqueue',{'type' => 'Task',      &add_to_queue('gradingqueue',{'type' => 'Task',
   'time' => time,    'time' => time,
   'slot' => $slot_name});    'slot' => $slot_name});
     ($version,$previous)=&get_version();      ($version,$previous)=&get_version();
  }   }
           if (($target eq 'web') && ($version ne '') && ($slot_name ne '')) {
  my $status_id =               if (ref($slot) eq 'HASH') {
     ($previous || $status eq 'SHOW_ANSWER') ? 'LC_task_feedback'                  if ($slot->{'endtime'} > time()) {
                                             : 'LC_task_take';                      $result .=
                           &Apache::lonhtmlcommon::set_due_date($slot->{'endtime'});
                   }
               }
    }
   
    my $status_id = 'LC_task_take';
           if ($previous && $target eq 'answer') {
               $status_id = 'LC_task_answer';
           } elsif ($previous || $status eq 'SHOW_ANSWER') {
       $status_id = 'LC_task_feedback';
           }
  $result .= '<div class="LC_task" id="'.$status_id.'">'."\n";   $result .= '<div class="LC_task" id="'.$status_id.'">'."\n";
   
  push(@Apache::inputtags::status,$status);   push(@Apache::inputtags::status,$status);
Line 660  sub start_Task { Line 794  sub start_Task {
  }   }
  my $msg;   my $msg;
  if ($status eq 'UNAVAILABLE') {   if ($status eq 'UNAVAILABLE') {
     $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';      $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>';
  } elsif ($status eq 'NOT_IN_A_SLOT') {   } elsif ($status eq 'NOT_IN_A_SLOT') {
     $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>';      $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>';
     $msg.=&add_request_another_attempt_button("Sign up for time to work.");      $msg.=&add_request_another_attempt_button("Sign up for time to work");
  } elsif ($status eq 'NEEDS_CHECKIN') {   } elsif ($status eq 'NEEDS_CHECKIN') {
     $msg.='<h1>'.&mt('You need the Proctor to validate you.').      $msg.='<p class="LC_warning">'.&mt('You need the Proctor to validate you.').
  '</h1>'.&proctor_validation_screen($slot);   '</p>'.&proctor_validation_screen($slot);
  } elsif ($status eq 'WAITING_FOR_GRADE') {   } elsif ($status eq 'WAITING_FOR_GRADE') {
     $msg.='<h1>'.&mt('Your submission is in the grading queue.').'</h1>';      $msg.='<p class="LC_info">'.&mt('Your submission is in the grading queue.').'</p>';
  } elsif ($env{'form.donescreen'}) {   } elsif ($env{'form.donescreen'}) {
     $result .= &done_screen($version);      $result .= &done_screen($version);
  } elsif ($status ne 'NOT_YET_VIEWED') {   } elsif ($status eq 'NOT_YET_VIEWED') {
     $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';                      my $symb=&Apache::lonnet::symbread();
                       $msg.=&Apache::structuretags::firstaccess_msg($accessmsg,$symb);
                   } elsif ($status eq 'NEED_DIFFERENT_IP') {
   #FIXME
    } else {
       $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>';
  }   }
  if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {   if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
     $msg.='The problem '.$accessmsg;      $msg.='The problem '.$accessmsg;
  }   }
  $result.=$msg.'<br />';   $result.=$msg.'<br />';
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $result.='\begin{document}\noindent \vskip 1 mm  \begin{minipage}{\textwidth}\vskip 0 mm';   $result.='\noindent \vskip 1 mm  \begin{minipage}{\textwidth}\vskip 0 mm';
  if ($status eq 'UNAVAILABLE') {   if ($status eq 'UNAVAILABLE') {
     $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';      $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
  } else {   } else {
Line 724  sub start_Task { Line 863  sub start_Task {
  if ($todo) {   if ($todo) {
     &setup_env_for_other_user($todo,$safeeval);      &setup_env_for_other_user($todo,$safeeval);
     my ($symb,$uname,$udom)=&decode_queue_key($todo);      my ($symb,$uname,$udom)=&decode_queue_key($todo);
     $result.="\n".'<table><tr><td>Found '.      if ($env{'request.state'} eq 'construct') {
  &Apache::lonnet::gettitle($symb).' for '.$uname.' at '.$udom.'</td></tr></table>';   $symb = $env{'request.uri'};
       }
       $result.="\n".'<p>'.
    &mt('Grading [_1] for [_2] at [_3]',
       &Apache::lonnet::gettitle($symb),$uname,$udom).'</p>';
     $form_tag_start.=      $form_tag_start.=
  '<input type="hidden" name="gradingkey" value="'.   '<input type="hidden" name="gradingkey" value="'.
  &escape($todo).'" />';   &escape($todo).'" />';
Line 745  sub start_Task { Line 888  sub start_Task {
     $result.='<b>'.&mt("Stopped grading.").'</b>'.$back;      $result.='<b>'.&mt("Stopped grading.").'</b>'.$back;
  } elsif ($status_code eq 'cancel') {   } elsif ($status_code eq 'cancel') {
     $result.='<b>'.&mt("Cancelled grading.").'</b>'.$back;      $result.='<b>'.&mt("Cancelled grading.").'</b>'.$back;
                   } elsif ($status_code eq 'terminated') {
                       $result.= '<b>'.&mt('Terminated grading').'</b><br />'.
                                 '<span class="LC_error">'.
                                 &mt('Grading for [_1] has not been saved because of a grading key mismatch.',
                                 '<tt>'.$env{'form.terminated'}.'</tt>').'</span><br />'.$back;
  } elsif ($status_code eq 'never_versioned') {   } elsif ($status_code eq 'never_versioned') {
     $result.='<b>'.      $result.='<b>'.
  &mt("Requested user has never accessed the task.").   &mt("Requested user has never accessed the task.").
Line 791  sub start_Task { Line 939  sub start_Task {
  $result.='<input type="hidden" name="regrade" value="'.   $result.='<input type="hidden" name="regrade" value="'.
     $env{'form.regrade'}.'" />';      $env{'form.regrade'}.'" />';
     }      }
     if ($env{'form.chosensections'}) {      if ($env{'form.chosensections'} || &section_restricted()) {
  my @chosen_sections=   my @chosen_sections = &get_allowed_sections();
     &Apache::loncommon::get_env_multiple('form.chosensections');  
  foreach my $sec (@chosen_sections) {   foreach my $sec (@chosen_sections) {
     $result.='<input type="hidden" name="chosensections"       $result.='<input type="hidden" name="chosensections" 
                                value="'.$sec.'" />';                                 value="'.$sec.'" />';
  }   }
     }      }
     if ($webgrade eq 'yes') { $result.=&webgrade_standard_info(); }      if ($webgrade eq 'yes') { $result.=&webgrade_standard_info(); }
    } elsif ($target eq 'webgrade' 
    && $env{'request.state'} eq 'construct') {
       $result.=$form_tag_start;
       $result.='<input type="hidden" name="webgrade" value="'.
    $webgrade.'" />';
       $result.=&webgrade_standard_info();
  }   }
  if ($target eq 'webgrade') {   if ($target eq 'webgrade') {
     $result.="\n".'<div id="LC_GRADING_criterialist">';      $result.="\n".'<div id="LC_GRADING_criterialist">';
Line 847  sub get_key_todo { Line 1000  sub get_key_todo {
     my ($target)=@_;      my ($target)=@_;
     my $todo;      my $todo;
   
       if ($env{'request.state'} eq 'construct') {
    my ($symb,$cid,$udom,$uname) = &Apache::lonnet::whichuser();
    my $gradingkey=&encode_queue_key($symb,$udom,$uname);
    return ($gradingkey);
       }
   
     if (defined($env{'form.reviewasubmission'})) {      if (defined($env{'form.reviewasubmission'})) {
  &Apache::lonxml::debug("review a submission....");   &Apache::lonxml::debug("review a submission....");
  $env{'form.queue'}='reviewqueue';   $env{'form.queue'}='reviewqueue';
Line 877  sub get_key_todo { Line 1036  sub get_key_todo {
  my $cdom  = $env{'course.'.$cid.'.domain'};   my $cdom  = $env{'course.'.$cid.'.domain'};
  my $uname = &LONCAPA::clean_username($env{'form.gradinguser'});   my $uname = &LONCAPA::clean_username($env{'form.gradinguser'});
  my $udom  = &LONCAPA::clean_domain($env{'form.gradingdomain'});   my $udom  = &LONCAPA::clean_domain($env{'form.gradingdomain'});
   
    if (&section_restricted()) {
       my $classlist=&get_limited_classlist();
       if (!&allow_grade_user($classlist->{$uname.':'.$udom})) {
    return (undef,'not_allowed',
    &mt("Requested student ([_1]) is in a section you aren't allowed to grade.",$uname.':'.$udom));
       }
    }
  my $gradingkey=&encode_queue_key($symb,$udom,$uname);   my $gradingkey=&encode_queue_key($symb,$udom,$uname);
   
  my $queue;   my $queue;
Line 947  sub get_key_todo { Line 1113  sub get_key_todo {
     return (undef,'stop');      return (undef,'stop');
  } elsif ($env{'form.cancel'}) {   } elsif ($env{'form.cancel'}) {
     return (undef,'cancel');      return (undef,'cancel');
                   } elsif ($env{'form.terminated'}) {
                       return (undef, 'terminated');
  } elsif ($env{'form.next'}) {   } elsif ($env{'form.next'}) {
     return (undef,'select_user');      return (undef,'select_user');
  }   }
Line 992  sub get_key_todo { Line 1160  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.cancel'} || $env{'form.stop'})       if (!(($env{'form.cancel'} || $env{'form.stop'} || $env{'form.terminated'}) 
       && $target eq 'webgrade')         && $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));
  } else {   } else {
     return (undef,'stop');              if ($env{'form.terminated'}) {
                   return (undef,'terminated');
               } else {
                   return (undef,'stop');
               }
  }   }
     }      }
     return (undef,undef)      return (undef,undef)
Line 1028  sub end_Task { Line 1200  sub end_Task {
  }   }
  if ($status eq 'CAN_ANSWER' && !$previous &&    if ($status eq 'CAN_ANSWER' && !$previous && 
     !$env{'form.donescreen'}) {      !$env{'form.donescreen'}) {
     $result.="\n".'<table border="1">'.                      my ($portheader,$porttext);
                       if ($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"}) {
                           $portheader = &mt('Submit Additional Portfolio Files for Grading');
                           $porttext = &mt('Indicate which additional files from your portfolio are to be evaluated in grading this task.');
                       } else {
                           $portheader = &mt('Submit Portfolio Files for Grading');
                           $porttext = &mt('Indicate the files from your portfolio to be evaluated in grading this task.');
                       }
       $result.="\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box().
  &Apache::inputtags::file_selector("$version.0",   &Apache::inputtags::file_selector("$version.0",
   "bridgetask","*",    "bridgetask","*",
   'portfolioonly',    'portfolioonly',
   '                                                            '<h3>'.$portheader.'</h3><br />'.
 <h2>'.&mt('Submit Portfolio Files for Grading').'</h2>                                                            $porttext.'<br />').
 <p>'.&mt('Indicate the files from your portfolio to be evaluated in grading this task.').'</p>').   &Apache::lonhtmlcommon::end_pick_box().'</div>';
   "</table>";  
  }   }
  if (!$previous && $status ne 'SHOW_ANSWER' &&   if (!$previous && $status ne 'SHOW_ANSWER' &&
     &show_task($status,$previous)) {      &show_task($status,$previous)) {
     $result.=&Apache::inputtags::gradestatus('0');      $result.=&Apache::inputtags::gradestatus('0',$target,1);
  }   }
   
  $result.='</form>';   $result.='</form>';
Line 1047  sub end_Task { Line 1226  sub end_Task {
  if (!$previous && $status ne 'SHOW_ANSWER' &&   if (!$previous && $status ne 'SHOW_ANSWER' &&
     &show_task($status,$previous)) {      &show_task($status,$previous)) {
     my $action = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $action = &Apache::lonenc::check_encrypt($env{'request.uri'});
                       my $donetext = &mt('Done');
     $result.=<<DONEBUTTON;      $result.=<<DONEBUTTON;
 <form name="done" method="post" action="$action">  <form name="done" method="post" action="$action">
    <input type="hidden" name="donescreen" value="1" />     <input type="hidden" name="donescreen" value="1" />
    <input type="submit" value="Done" />     <input type="submit" value="$donetext" />
 </form>  </form>
 DONEBUTTON  DONEBUTTON
                 }                  }
  if (&show_task($status,$previous) &&   if (&show_task($status,$previous) &&
     $Apache::lonhomework::history{"resource.$version.0.status"} =~ /^(pass|fail)$/) {      $Apache::lonhomework::history{"resource.$version.0.status"} =~ /^(pass|fail)$/) {
     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($env{'request.uri'});
   
     my $start_time;      my $start_time;
   
     my $slot_name=      my $slot_name=
Line 1084  DONEBUTTON Line 1263  DONEBUTTON
  "</p>\n";   "</p>\n";
   
     if ($bt_status eq 'pass')  {      if ($bt_status eq 'pass')  {
  $status.='<h2>You passed the '.$title.' given on '.   $status.='<h2>'
     $start_time.'</h2>';                                  .&mt('You passed the [_1] given on [_2].',$title,$start_time)
                                   .'</h2>';
  $status.=$question_status;   $status.=$question_status;
     }      }
     if ($bt_status eq 'fail')  {      if ($bt_status eq 'fail')  {
  $status.='<h2>You did not pass the '.$title.' given on '.   $status.='<h2>'
     $start_time.'</h2>';                                  .&mt('You did not pass the [_1] given on [_2].',$title,$start_time)
                                   .'</h2>';
  $status.=$question_status;   $status.=$question_status;
  if (!$previous) {   if (!$previous) {
     $status.=&add_request_another_attempt_button();      $status.=&add_request_another_attempt_button();
Line 1116  DONEBUTTON Line 1297  DONEBUTTON
  }   }
  $result.="\n</div>\n".   $result.="\n</div>\n".
     &Apache::loncommon::end_page({'discussion' => 1});      &Apache::loncommon::end_page({'discussion' => 1});
     }      } elsif ($target eq 'answer') {
                   $result.="\n</div>\n";
               }
  }   }
   
  my $useslots = &Apache::lonnet::EXT("resource.0.useslots");   my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
Line 1127  DONEBUTTON Line 1310  DONEBUTTON
  } elsif (defined($Apache::lonhomework::history{"resource.$version.0.checkedin.slot"})) {   } elsif (defined($Apache::lonhomework::history{"resource.$version.0.checkedin.slot"})) {
     $queue_data{'slot'} = $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
     && $status eq 'CAN_ANSWER') {      && $status eq 'CAN_ANSWER') {
     my $award='SUBMITTED';      my $award='SUBMITTED';
               my $uploadedflag=0;
               my $totalsize=0;
               my @deletions = &Apache::loncommon::get_env_multiple('form.HWFILE'.$version.'_0_bridgetask_delete');
     &Apache::essayresponse::file_submission("$version.0",'bridgetask',      &Apache::essayresponse::file_submission("$version.0",'bridgetask',
     'portfiles',\$award);      \$award,\$uploadedflag,\$totalsize,\@deletions);
     if ($award eq 'SUBMITTED' &&      if ($award eq 'SUBMITTED' &&
  $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}) {   $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}) {
  $Apache::lonhomework::results{"resource.0.tries"}=   $Apache::lonhomework::results{"resource.0.tries"}=
Line 1146  DONEBUTTON Line 1332  DONEBUTTON
  $Apache::lonhomework::results{"resource.0.submission"}=   $Apache::lonhomework::results{"resource.0.submission"}=
     $Apache::lonhomework::results{"resource.$version.0.submission"}='';      $Apache::lonhomework::results{"resource.$version.0.submission"}='';
     } else {      } else {
  delete($Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"});                  unless($uploadedflag) {
                       delete($Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"});
                   }
  $award = '';   $award = '';
     }      }
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
Line 1249  DONEBUTTON Line 1437  DONEBUTTON
     $Apache::lonhomework::results{"resource.$version.0.solved"};      $Apache::lonhomework::results{"resource.$version.0.solved"};
     }      }
     &minimize_storage();      &minimize_storage();
     &Apache::structuretags::finalize_storage();              my ($canstore,$domain,$name,$symb,$courseid);
                   ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser();
     # data stored, now handle queue  
     if ($review) {              if ($env{'form.gradingkey'}) {
  if ($env{'form.queue'} eq 'reviewqueue') {                  my $todo=&unescape($env{'form.gradingkey'});
     &check_queue_unlock($env{'form.queue'});                  my ($keysymb,$uname,$udom)=&decode_queue_key($todo);
     &Apache::lonxml::debug(" still needs review not changing status.");                  if ($symb eq $keysymb) {
  } else {                      if (($domain eq $udom) && ($name eq $uname)) {
     if ($env{'form.queue'} ne 'none') {                          $canstore = 1;           
  &move_between_queues($env{'form.queue'},'reviewqueue');                      }
                   }
               }
               if ($canstore) {
           &Apache::structuretags::finalize_storage();
                   my @interval = &Apache::lonnet::EXT("resource.0.interval");
                   if ($interval[0] =~ /^\d+/ && $interval[1] eq 'resource') {
                       my $key=$courseid."\0".$symb;
                       my %times=&Apache::lonnet::get('firstaccesstimes',
                                                      [$key],$domain,$name);
                       if ($times{$key}) {
                           my $delresult.=&Apache::lonnet::del('firstaccesstimes',
                                                               [$key],$domain,$name);
                       }
                   }
           # 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 {      } else {
  &add_to_queue('reviewqueue',\%queue_data);          if ($env{'form.queue'} ne 'none') {
       &move_between_queues($env{'form.queue'},'reviewqueue');
           } else {
       &add_to_queue('reviewqueue',\%queue_data);
           }
     }      }
  }          } elsif ($ungraded) {
     } elsif ($ungraded) {      if ($env{'form.queue'} eq 'reviewqueue') {
  if ($env{'form.queue'} eq 'reviewqueue') {          &Apache::lonxml::debug("moving back.");
     &Apache::lonxml::debug("moving back.");          &move_between_queues($env{'form.queue'},
     &move_between_queues($env{'form.queue'},       'gradingqueue');
  'gradingqueue');      } elsif ($env{'form.queue'} eq 'none' ) {
  } elsif ($env{'form.queue'} eq 'none' ) {          &add_to_queue('gradingqueue',\%queue_data);
     &add_to_queue('gradingqueue',\%queue_data);      } else {
  } else {          &check_queue_unlock($env{'form.queue'});
     &check_queue_unlock($env{'form.queue'});      }
  }          } elsif ($mandatory_failed) {
     } elsif ($mandatory_failed) {      &remove_from_queue($env{'form.queue'}); 
  &remove_from_queue($env{'form.queue'});           } else {
     } else {      &remove_from_queue($env{'form.queue'});
  &remove_from_queue($env{'form.queue'});          }
     }              } else {
  }                  &check_queue_unlock($env{'form.queue'});
                   $env{'form.terminated'} = $name.':'.$domain;
               }
           }
  if (exists($Apache::lonhomework::results{'INTERNAL_store'})) {   if (exists($Apache::lonhomework::results{'INTERNAL_store'})) {
     # instance generation occured and hasn't yet been stored      # instance generation occurred and hasn't yet been stored
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
  }   }
     } elsif ($target eq 'webgrade') {      } elsif ($target eq 'webgrade') {
Line 1332  DONEBUTTON Line 1546  DONEBUTTON
  $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') {      } elsif ($target eq 'edit') {
  &Apache::structuretags::reset_problem_globals('Task');   $result.= &Apache::structuretags::problem_edit_footer();
  undef($Apache::lonhomework::parsing_a_task);  
  return ('','no');  
     }      }
     &Apache::structuretags::reset_problem_globals('Task');      &Apache::structuretags::reset_problem_globals('Task');
     undef($Apache::lonhomework::parsing_a_task);      undef($Apache::lonhomework::parsing_a_task);
       if ( ($target eq 'grade' && $env{'form.webgrade'}) ||
             $target eq 'webgrade') {
           delete($env{'form.grade_symb'});
           delete($env{'form.grade_domain'});
           delete($env{'form.grade_username'});
           delete($env{'form.grade_courseid'});
       }
     return $result;      return $result;
 }  }
   
Line 1496  sub get_limited_classlist { Line 1715  sub get_limited_classlist {
         }          }
     }      }
   
     if (ref($sections) && !grep('all',@{ $sections })) {      if (ref($sections) && !grep {$_ eq 'all'} (@{ $sections })) {
  foreach my $student (keys(%$classlist)) {   foreach my $student (keys(%$classlist)) {
     my $section  =       my $section  = 
  $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()];   $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()];
     if (! grep($section,@{ $sections })) {      if (! grep {$_ eq $section} (@{ $sections })) {
  delete($classlist->{$student});   delete($classlist->{$student});
     }      }
  }   }
Line 1516  sub show_queue { Line 1735  sub show_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 @chosen_sections=      my @chosen_sections = &get_allowed_sections();
  &Apache::loncommon::get_env_multiple('form.chosensections');  
   
     my $classlist = &get_limited_classlist(\@chosen_sections);      my $classlist = &get_limited_classlist(\@chosen_sections);
   
     if (!(grep(/^all$/,@chosen_sections))) {      if (!(grep(/^all$/,@chosen_sections))) {
  $result.='<p> Showing only sections <tt>'.join(', ',@chosen_sections).   $result.='<p>'
     '</tt>.</p> '."\n";                  .&mt('Showing only sections [_1].'
                       ,'<tt>'.join(', ',@chosen_sections).'</tt>')
                   ."</p>\n";
     }      }
   
     my ($view,$view_section);      my ($view,$view_section);
Line 1537  sub show_queue { Line 1757  sub show_queue {
  }   }
     }      }
   
       $result .= 
    '<p><a href="/adm/flip?postdata=return:">'.
    &mt('Return to resource').'</a></p><hr />'.
    "\n<h3>".&mt('Current Queue - [_1]',$queue)."</h3>";
     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>".   $result.=
     &Apache::loncommon::start_data_table().      &Apache::loncommon::start_data_table().
     &Apache::loncommon::start_data_table_row().      &Apache::loncommon::start_data_table_row().
     '<td>'.&mt('Empty').'</td>'.      '<td>'.&mt('Empty').'</td>'.
     &Apache::loncommon::end_data_table_row().      &Apache::loncommon::end_data_table_row().
     &Apache::loncommon::end_data_table();      &Apache::loncommon::end_data_table();
    return $result;
     }      }
     my $title=&Apache::lonnet::gettitle($symb);      my $title=&Apache::lonnet::gettitle($symb);
     $result.="\n<h3>Current Queue - $title $queue </h3>".      $result.=
  &Apache::loncommon::start_data_table().   &Apache::loncommon::start_data_table().
  &Apache::loncommon::start_data_table_header_row();   &Apache::loncommon::start_data_table_header_row();
     if ($with_selects) { $result.="<th>Status</th><th></th>"; }      if ($with_selects) { $result.='<th>'.&mt('Status').'</th><th></th>'; }
     $result.="<th>user</th><th>data</th>".      $result.='<th>'.&mt('User').'</th><th>'.&mt('Data').'</th>'.
  &Apache::loncommon::end_data_table_header_row();   &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; }   next if (!defined($classlist->{$uname.':'.$udom}));
    next if (!&allow_grade_user($classlist->{$uname.':'.$udom}));
   
  my $section = $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()];   my $section = $classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_SECTION()];
   
Line 1599  sub show_queue { Line 1825  sub show_queue {
    'start');     'start');
     }      }
     my $me=$env{'user.name'}.':'.$env{'user.domain'};      my $me=$env{'user.name'}.':'.$env{'user.domain'};
     $status=&mt('Locked by <tt>[_1]</tt> [_2]',$locker,$time);      $status=&mt('Locked by [_1] [_2]','<tt>'.$locker.'</tt>',$time);
     if ($me eq $locker) {      if ($me eq $locker) {
  ($action,$description)=('resume',&mt('Resume'));   ($action,$description)=('resume',&mt('Resume'));
     } else {      } else {
Line 1615  sub show_queue { Line 1841  sub show_queue {
     $result.=(<<FORM);      $result.=(<<FORM);
 <td>$status</td>  <td>$status</td>
 <td>  <td>
 <form style="display: inline" method="post">  <form style="display: inline" method="post" action="">
  <input type="hidden" name="gradingkey" value="$ekey" />   <input type="hidden" name="gradingkey" value="$ekey" />
  <input type="hidden" name="queue" value="$queue" />   <input type="hidden" name="queue" value="$queue" />
  <input type="hidden" name="gradingaction" value="$action" />   <input type="hidden" name="gradingaction" value="$action" />
Line 1634  FORM Line 1860  FORM
     }      }
     $result.= "<td>".$classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_FULLNAME()].      $result.= "<td>".$classlist->{$uname.':'.$udom}[&Apache::loncoursedata::CL_FULLNAME()].
  " <tt>($uname:$udom)</tt> </td>";   " <tt>($uname:$udom)</tt> </td>";
     $result.='<td>'.$slot_text.' End time: '.              $result.='<td>'.$slot_text.' '
  &Apache::lonlocal::locallocaltime($end_time).                      .&mt('End time: [_1]'
  "</td>".&Apache::loncommon::end_data_table_row();                          ,&Apache::lonlocal::locallocaltime($end_time))
                       .'</td>'
                       .&Apache::loncommon::end_data_table_row();
  }   }
     }      }
     $result.= &Apache::loncommon::end_data_table()."<hr />\n";      $result.= &Apache::loncommon::end_data_table()."<hr />\n";
     return $result;      return $result;
 }  }
   
   sub get_allowed_sections {
       my @chosen_sections;
       if (&section_restricted()) {
    @chosen_sections = ($env{'request.course.sec'});
       } else {
    @chosen_sections =
       &Apache::loncommon::get_env_multiple('form.chosensections');
       }
   
       return @chosen_sections;
   }
   
   sub section_restricted {
       my $cid =(&Apache::lonnet::whichuser())[1];
       return (lc($env{'course.'.$cid.'.task_grading'}) eq 'section'
       && $env{'request.course.sec'} ne '' );
   }
   
   sub allow_grade_user {
       my ($classlist_entry) = @_;
   
       if (&section_restricted()
    && $env{'request.course.sec'} ne
         $classlist_entry->[&Apache::loncoursedata::CL_SECTION()]) {
    return 0;
       }
       return 1;
   }
   
 sub get_queue_counts {  sub get_queue_counts {
     my ($queue)=@_;      my ($queue)=@_;
     my $result;      my $result;
Line 1658  sub get_queue_counts { Line 1915  sub get_queue_counts {
     if ($tmp=~/^error: 2 /) {      if ($tmp=~/^error: 2 /) {
  return (0,0,0);   return (0,0,0);
     }      }
   
     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);   my ($symb,$uname,$udom) = &decode_queue_key($key);
  if (!defined($classlist->{$uname.':'.$udom})) { next; }   next if (!defined($classlist->{$uname.':'.$udom}));
    next if (!&allow_grade_user($classlist->{$uname.':'.$udom}));
   
  if ($key=~/locked$/) {   if ($key=~/locked$/) {
     $locks++;      $locks++;
  } elsif ($key=~/timestamp$/) {   } elsif ($key=~/timestamp$/) {
Line 1739  sub pick_from_queue_data { Line 1999  sub pick_from_queue_data {
  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; }   next if (!defined($classlist->{$uname.':'.$udom}));
    next if (!&allow_grade_user($classlist->{$uname.':'.$udom}));
   
  if ($check_section) {   if ($check_section) {
     my $section =      my $section =
Line 1848  sub lock_key { Line 2109  sub lock_key {
 sub get_queue_symb_status {  sub get_queue_symb_status {
     my ($queue,$symb,$cdom,$cnum) = @_;      my ($queue,$symb,$cdom,$cnum) = @_;
     if (!defined($cdom) || !defined($cnum)) {      if (!defined($cdom) || !defined($cnum)) {
  my (undef,$cid)=&Apache::lonnet::whichuser();   my (undef,$cid) =&Apache::lonnet::whichuser();
  $cnum=$env{'course.'.$cid.'.num'};   $cnum=$env{'course.'.$cid.'.num'};
  $cdom=$env{'course.'.$cid.'.domain'};   $cdom=$env{'course.'.$cid.'.domain'};
     }      }
Line 1864  sub get_queue_symb_status { Line 2125  sub get_queue_symb_status {
  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}));   next if (!defined($classlist->{$uname.':'.$udom}));
    next if (!&allow_grade_user($classlist->{$uname.':'.$udom}));
  push(@users,"$uname:$udom");   push(@users,"$uname:$udom");
     }      }
     return @users;      return @users;
Line 1950  sub get_from_queue { Line 2212  sub get_from_queue {
 sub select_user {  sub select_user {
     my ($symb,$cid)=&Apache::lonnet::whichuser();      my ($symb,$cid)=&Apache::lonnet::whichuser();
   
     my @chosen_sections=      my @chosen_sections = &get_allowed_sections();
  &Apache::loncommon::get_env_multiple('form.chosensections');  
   
     my $classlist = &get_limited_classlist(\@chosen_sections);      my $classlist = &get_limited_classlist(\@chosen_sections);
           
     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>'
     '</tt>.</p> '."\n";                  .&mt('Showing only sections [_1].'
                       ,'<tt>'.join(', ',@chosen_sections).'</tt>')
                   .'</p> '."\n";
     }      }
     $result.=&Apache::loncommon::start_data_table();      $result.=&Apache::loncommon::start_data_table();
   
Line 1994  sub select_user { Line 2256  sub select_user {
  $seclist.='<input type="hidden" name="chosensections"    $seclist.='<input type="hidden" name="chosensections" 
                                value="'.$sec.'" />';                                 value="'.$sec.'" />';
     }      }
               my $buttontext=&mt('Regrade');
     $result.=&Apache::loncommon::start_data_table_row();      $result.=&Apache::loncommon::start_data_table_row();
     $result.=<<RESULT;      $result.=<<RESULT;
   <td>    <td>
     <form style="display: inline" method="post">      <form style="display: inline" method="post" action="">
       <input type="hidden" name="gradingkey" value="$todo" />        <input type="hidden" name="gradingkey" value="$todo" />
       <input type="hidden" name="queue" value="$queue" />        <input type="hidden" name="queue" value="$queue" />
       <input type="hidden" name="webgrade" value="no" />        <input type="hidden" name="webgrade" value="no" />
       <input type="hidden" name="regrade" value="yes" />        <input type="hidden" name="regrade" value="yes" />
       <input type="submit" name="submit" value="Regrade" />        <input type="submit" name="submit" value="$buttontext" />
       $seclist        $seclist
     </form>      </form>
   <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt></td>    <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt> Sec: $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()]</td>
   <td>    <td>
 RESULT  RESULT
         }          }
Line 2078  sub start_ClosingParagraph { Line 2341  sub start_ClosingParagraph {
     } elsif ($target eq 'webgrade') {      } elsif ($target eq 'webgrade') {
  &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  my $bodytext=&Apache::lonxml::get_all_text("/closingparagraph",  
    $parser);  
  $result = &Apache::edit::tag_start($target,$token);   $result = &Apache::edit::tag_start($target,$token);
  $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result = $token->[4].&Apache::edit::modifiedfield('/closingparagraph',  
    $parser);  
     }      }
     return $result;      return $result;
 }  }
Line 2099  sub end_ClosingParagraph { Line 2357  sub end_ClosingParagraph {
     return $result;      return $result;
 }  }
   
   sub insert_ClosingParagraph {
       return '
   <ClosingParagraph>
       <startouttext />
       <endouttext />
   </ClosingParagraph>';
   }
   
 sub get_dim_id {  sub get_dim_id {
     if (@Apache::bridgetask::dimension) {      if (@Apache::bridgetask::dimension) {
  return $Apache::bridgetask::dimension[-1];   return $Apache::bridgetask::dimension[-1];
Line 2109  sub get_dim_id { Line 2375  sub get_dim_id {
   
 sub get_id {  sub get_id {
     my ($parstack,$safeeval)=@_;      my ($parstack,$safeeval)=@_;
     my $id=&Apache::lonxml::get_param('id',$parstack,$safeeval);      return &Apache::lonxml::get_id($parstack,$safeeval);
     if (!$id) { $id=$Apache::lonxml::curdepth; }  
     return $id;  
 }  }
   
 sub start_Setup {  sub start_Setup {
Line 2199  sub start_Dimension { Line 2463  sub start_Dimension {
  $result.=     $result.=  
     &Apache::edit::text_arg('Id:','id',$token,10).' '.      &Apache::edit::text_arg('Id:','id',$token,10).' '.
     &Apache::edit::select_arg('Passing is Mandatory:','Mandatory',      &Apache::edit::select_arg('Passing is Mandatory:','Mandatory',
       [['yes', 'Yes'],        [['Y', 'Yes'],
        ['no','No'],],         ['N','No'],],
       $token).' <br /> '.        $token).' <br /> '.
     &Apache::edit::text_arg('Required number of passed optional elements to pass the '.$token->[1].':',      &Apache::edit::text_arg('Required number of passed optional elements to pass the '.$token->[1].':',
     'OptionalRequired',$token,4).      'OptionalRequired',$token,4).
Line 2225  sub start_QuestionText { Line 2489  sub start_QuestionText {
     my $dim = &get_dim_id();      my $dim = &get_dim_id();
  $dimension{$dim}{'questiontext'}=$text;   $dimension{$dim}{'questiontext'}=$text;
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  my $bodytext=&Apache::lonxml::get_all_text("/questiontext",$parser);  
  $result = &Apache::edit::tag_start($target,$token);   $result = &Apache::edit::tag_start($target,$token);
  $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result = $token->[4].&Apache::edit::modifiedfield('/questiontext',  
    $parser);  
     }      }
     return $result;      return $result;
 }  }
Line 2239  sub end_QuestionText { Line 2499  sub end_QuestionText {
     return '';      return '';
 }  }
   
   sub insert_QuestionText {
       return '
   <QuestionText>
       <startouttext />
       <endouttext />
   </QuestionText>';
   }
   
 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 2350  sub end_Dimension { Line 2618  sub end_Dimension {
     ('sub' x $dimension{$dim}{'depth'}).'question';      ('sub' x $dimension{$dim}{'depth'}).'question';
  $ucquestion =~ s/^(.)/uc($1)/e;   $ucquestion =~ s/^(.)/uc($1)/e;
  if ($dim_status eq 'pass') {   if ($dim_status eq 'pass') {
     $dim_info.='<h3>'.$ucquestion.' : you passed this '.$mandatory.' '.$question.'</h3>';                      $dim_info.='<h3>'.$ucquestion.' : '
                                 .&mt('you passed this [_1] [_2]',$mandatory,$question)
                                 .'</h3>';
  }   }
  if ($dim_status eq 'fail') {   if ($dim_status eq 'fail') {
     $dim_info.='<h3>'.$ucquestion.' : you did not pass this '.$mandatory.' '.$question.'</h3>';                      $dim_info.='<h3>'.$ucquestion.' : '
                                 .&mt('you did not pass this [_1] [_2]',$mandatory,$question)
                                 .'</h3>';
  }   }
  my %counts = &get_counts($dim,$instance,$parstack,   my %counts = &get_counts($dim,$instance,$parstack,
  $safeeval);   $safeeval);
Line 2552  sub question_status_message { Line 2824  sub question_status_message {
     }      }
     $status .= '.';      $status .= '.';
     if ($counts->{'opt'}) {      if ($counts->{'opt'}) {
  $status .= ' You were required to pass '.$counts->{'opt_req'}.          if ($counts->{'opt_dim'} + $counts->{'man_dim'} < 1) {
     ' optional ';              $status .= ' '.&mt('You were required to pass [quant,_1,optional criterion,optional criteria].',$counts->{'opt_req'});
  if ($counts->{'opt_dim'} + $counts->{'man_dim'} < 1) {          } else { 
     $status .=              $status .= ' '.&mt('You were required to pass [quant,_1,optional component].',$counts->{'opt_req'});
  ($counts->{'opt_req'} == 1?'criterion':'criteria');          }
  } else {  
     $status .=  
  'component'.($counts->{'opt_req'} == 1?'':'s');  
  }  
  $status .= '.';  
     }      }
     return $status;      return $status;
 }  }
Line 2660  sub end_Setup { Line 2927  sub end_Setup {
   
 sub grading_history {  sub grading_history {
     my ($version,$dim,$id) = @_;      my ($version,$dim,$id) = @_;
     if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {      if (!&Apache::lonnet::allowed('mgq',$env{'request.course.id'})
    && !&Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
  return '';   return '';
     }      }
     my ($result,$grader);      my ($result,$grader);
Line 2707  sub start_IntroParagraph { Line 2975  sub start_IntroParagraph {
  }   }
   
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  my $bodytext=&Apache::lonxml::get_all_text("/introparagraph",$parser);  
  $result = &Apache::edit::tag_start($target,$token);   $result = &Apache::edit::tag_start($target,$token);
  $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result = $token->[4].&Apache::edit::modifiedfield('/introparagraph',  
    $parser);  
     }      }
     return $result;      return $result;
 }  }
Line 2724  sub end_IntroParagraph { Line 2988  sub end_IntroParagraph {
     }      }
 }  }
   
   sub insert_IntroParagraph {
       return '
   <IntroParagraph>
       <startouttext />
       <endouttext />
   </IntroParagraph>';
   }
   
 sub start_Instance {  sub start_Instance {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $dim = &get_dim_id();      my $dim = &get_dim_id();
Line 2780  sub start_InstanceText { Line 3052  sub start_InstanceText {
  my $instance_id=$Apache::bridgetask::instance{$dim}[-1];   my $instance_id=$Apache::bridgetask::instance{$dim}[-1];
  $dimension{$dim}{$instance_id.'.text'}=$text;   $dimension{$dim}{$instance_id.'.text'}=$text;
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  my $bodytext=&Apache::lonxml::get_all_text("/instancetext",$parser);  
  $result = &Apache::edit::tag_start($target,$token);   $result = &Apache::edit::tag_start($target,$token);
  $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result = $token->[4].&Apache::edit::modifiedfield('/instancetext',  
    $parser);  
     }      }
     return $result;      return $result;
 }  }
Line 2794  sub end_InstanceText { Line 3062  sub end_InstanceText {
     return '';      return '';
 }  }
   
   sub insert_InstanceText {
       return '
   <InstanceText>
       <startouttext />
       <endouttext />
   </InstanceText>';
   }
   
 sub start_Criteria {  sub start_Criteria {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
Line 2826  sub start_Criteria { Line 3102  sub start_Criteria {
     push(@{$dimension{$dim}{'criterias'}},$id);      push(@{$dimension{$dim}{'criterias'}},$id);
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  if (0) {  
     $result = &Apache::edit::tag_start($target,$token);  
     my $text=&Apache::lonxml::get_all_text("/criteria",$parser);  
     &Apache::lonnet::logthis("get_all_text criteria \n$text");  
     my $local_parser = HTML::LCParser->new(\$text);  
     $local_parser->xml_mode(1);  
     $local_parser->marked_sections(1);  
     while (1) {  
  my $criteria_text =   
     &Apache::lonxml::get_all_text('gradernote',$local_parser);  
  $result.=  
     &Apache::edit::editfield($token->[1],$criteria_text,'',80,4);  
   
  # check for a <GraderNote> next might be end  
  my $token = $local_parser->get_token();  
  # is the end  
  last if (!$token);  
  my $gradernote = &Apache::lonxml::get_all_text('/gradernote',  
        $local_parser);  
  # purge the end tag  
  my $token = $local_parser->get_token();  
  $gradernote = '<GraderNote>'.$gradernote.'</GraderNote>';  
  @Apache::scripttag::parser_env = @_;  
  $result .=   
     &Apache::edit::end_row().&Apache::edit::start_spanning_row().  
     &Apache::scripttag::xmlparse($gradernote).  
     &Apache::edit::end_row().&Apache::edit::start_spanning_row();  
     }  
  }  
  $result .=&Apache::edit::tag_start($target,$token);   $result .=&Apache::edit::tag_start($target,$token);
  $result.=     $result.=  
     &Apache::edit::text_arg('Id:','id',$token,10).' '.      &Apache::edit::text_arg('Id:','id',$token,10).' '.
     &Apache::edit::select_arg('Passing is Mandatory:','Mandatory',      &Apache::edit::select_arg('Passing is Mandatory:','Mandatory',
       [['yes', 'Yes'],        [['Y', 'Yes'],
        ['no','No'],],         ['N','No'],],
       $token)        $token)
     .' <br /> '.&Apache::edit::end_row().      .' <br /> '.&Apache::edit::end_row().
     &Apache::edit::start_spanning_row();      &Apache::edit::start_spanning_row();
Line 2911  sub layout_webgrade_Criteria { Line 3158  sub layout_webgrade_Criteria {
     my $link=&link($id);      my $link=&link($id);
     my $version = &get_version();      my $version = &get_version();
     my $status  = &get_criteria('status',$version,$dim,$id);      my $status  = &get_criteria('status',$version,$dim,$id);
     my %lt = ( 'ungraded' => 'Ungraded',      my %lt = &Apache::lonlocal::texthash(
        'fail'     => 'Fail',          'ungraded' => 'Ungraded',
        'pass'     => 'Pass',          'fail'     => 'Fail',
        'review'   => 'Review',          'pass'     => 'Pass',
        'comment'  => 'Additional Comment for Student',          'review'   => 'Review',
        );          'comment'  => 'Additional Comment for Student',
     %lt = &Apache::lonlocal::texthash(%lt);      );
     my $comment = &get_criteria('comment',$version,$dim,$id);      my $comment = &get_criteria('comment',$version,$dim,$id);
     $comment = &HTML::Entities::encode($comment,'<>"&');      $comment = &HTML::Entities::encode($comment,'<>"&');
     my %checked;      my %checked;
     foreach my $which ('ungraded','fail','pass','review') {      foreach my $which ('ungraded','fail','pass','review') {
  if ($status eq $which) { $checked{$which} = 'checked="checked"'; }   if ($status eq $which) { $checked{$which} = ' checked="checked"'; }
     }      }
     if (!%checked) { $checked{'ungraded'} = 'checked="checked"'; }      if (!%checked) { $checked{'ungraded'} = ' checked="checked"'; }
     my $buttons;      my $buttons;
     foreach my $which  ('ungraded','fail','pass','review') {      foreach my $which  ('ungraded','fail','pass','review') {
  $buttons .= <<END_BUTTON;   $buttons .= <<END_BUTTON;
  <label class="LC_GRADING_$which">   <label class="LC_GRADING_$which">
  <input type="radio" name="HWVAL_$link" value="$which" $checked{$which} />   <input type="radio" name="HWVAL_$link" value="$which"$checked{$which} />
  $lt{$which}   $lt{$which}
  </label>   </label>
 END_BUTTON  END_BUTTON
Line 2960  sub end_Criteria { Line 3207  sub end_Criteria {
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
     }      }
 }  }
   sub insert_Criteria {
       return '
   <Criteria>
       <CriteriaText>
           <startouttext />
           <endouttext />
       </CriteriaText>
   </Criteria>';
   }
   
 sub start_CriteriaText {  sub start_CriteriaText {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
Line 2967  sub start_CriteriaText { Line 3223  sub start_CriteriaText {
     if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {      if ($target eq 'grade' || $target eq 'web' || $target eq 'webgrade') {
   
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  my $bodytext=&Apache::lonxml::get_all_text("/criteriatext",$parser);  
  $result = &Apache::edit::tag_start($target,$token);   $result = &Apache::edit::tag_start($target,$token);
  $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result = $token->[4].&Apache::edit::modifiedfield('/criteriatext',  
    $parser);  
     }      }
     return $result;      return $result;
 }  }
Line 2981  sub end_CriteriaText { Line 3233  sub end_CriteriaText {
     return '';      return '';
 }  }
   
   sub insert_CriteriaText {
       return '
   <CriteriaText>
       <startouttext />
       <endouttext />
   </CriteriaText>';
   }
   
 sub start_GraderNote {  sub start_GraderNote {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
Line 2988  sub start_GraderNote { Line 3248  sub start_GraderNote {
  $result = '<div class="LC_GRADING_gradernote"><b>'.   $result = '<div class="LC_GRADING_gradernote"><b>'.
     &mt('Note to graders:').'</b>';      &mt('Note to graders:').'</b>';
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  my $bodytext=&Apache::lonxml::get_all_text("/gradernote",$parser);  
  $result = &Apache::edit::tag_start($target,$token);   $result = &Apache::edit::tag_start($target,$token);
  $result.= &Apache::edit::editfield($token->[1],$bodytext,'',80,4);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result = $token->[4].&Apache::edit::modifiedfield('/gradernote',  
    $parser);  
     } elsif ($target eq 'web' || $target eq 'grade') {      } elsif ($target eq 'web' || $target eq 'grade') {
  my $note=&Apache::lonxml::get_all_text('/gradernote',$parser,$style);    my $note=&Apache::lonxml::get_all_text('/gradernote',$parser,$style); 
     }      }
Line 3009  sub end_GraderNote { Line 3265  sub end_GraderNote {
     return;      return;
 }  }
   
   sub insert_GraderNote {
       return '
   <GraderNote>
       <startouttext />
       <endouttext />
   </GraderNote>';
   }
   
   
 sub proctor_validation_screen {  sub proctor_validation_screen {
     my ($slot) = @_;      my ($slot) = @_;
     my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser();      my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser();
     my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');      my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');
       if ($url ne '/adm/lonKaputt/lonlogo_broken.gif') {
    $url = "<tr><td colspan=\"2\"><img src=\"$url\" /></td></tr>";
       } else {
    undef($url);
       }
   
     my $name=&Apache::loncommon::plainname($user,$domain);      my $name=&Apache::loncommon::plainname($user,$domain);
           
     my $msg;      my $msg;
     if ($env{'form.proctorpassword'}) {      if ($env{'form.proctorpassword'}) {
  $msg='<p><font color="red">'.&mt("Failed to authenticate the proctor.")   $msg.='<p><span class="LC_warning">'
     .'</font></p>';      .&mt("Failed to authenticate the proctor.")
       .'</span></p>';
     }      }
   
       my $valid;
       my @possible_proctors=split(",",$slot->{'proctor'});
       foreach my $proctor (@possible_proctors) {
    if ($proctor =~ /$LONCAPA::username_re:$LONCAPA::domain_re/) {
       $valid = 1;
       last;
    }
       }
       if (!$valid) {
    $msg.='<p><span class="LC_error">'
       .&mt("No valid proctors are defined.")
       .'</span></p>';
       }
       
     if (!$env{'form.proctordomain'}) { $env{'form.proctordomain'}=$domain; }      if (!$env{'form.proctordomain'}) { $env{'form.proctordomain'}=$domain; }
       my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
       $uri = &HTML::Entities::encode($uri,'<>&"');
       my %lt = &Apache::lonlocal::texthash(
                               'prva' => "Proctor Validation",
                               'yoro' => "Your room's proctor needs to validate your access to this resource.",
                               'prus'  => "Proctor's Username:",
                               'pasw'  => "Password:",
                               'prdo'  => "Proctor's Domain:",
                               'vali'  => 'Validate',
                               'stui'  => "Student who should be logged in is:",
                               'name'  => "Name:",
                               'sid'   => "Student/Employee ID",
                               'unam'  => "Username:",
                              );
     my $result= (<<ENDCHECKOUT);      my $result= (<<ENDCHECKOUT);
 <h2>Proctor Validation</h2>  <h2>$lt{'prva'}</h2>
     <p>Your room's proctor needs to validate your access to this resource.</p>      <p>$lt{'yoro'}</p>
     $msg      $msg
 <form name="checkout" method="post" action="$env{'request.uri'}">  <form name="checkout" method="post" action="$uri">
 <input type="hidden" name="validate" value="yes" />  <input type="hidden" name="validate" value="yes" />
 <input type="hidden" name="submitted" value="yes" />  <input type="hidden" name="submitted" value="yes" />
 <table>  <table>
   <tr><td>Proctor's Username:</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" /></td></tr>    <tr><td>$lt{'prus'}</td><td><input type="text" name="proctorname" value="$env{'form.proctorname'}" autocomplete="new-password" /></td></tr>
   <tr><td>Password:</td><td><input type="password" name="proctorpassword" value="" /></td></tr>    <tr><td>$lt{'pasw'}</td><td><input type="password" name="proctorpassword" value="" autocomplete="new-password" /></td></tr>
   <tr><td>Proctor's Domain:</td><td><input type="string" name="proctordomain" value="$env{'form.proctordomain'}" /></td></tr>    <tr><td>$lt{'prdo'}</td><td><input type="text" name="proctordomain" value="$env{'form.proctordomain'}" autocomplete="off" /></td></tr>
 </table>  </table>
 <input type="submit" name="checkoutbutton" value="Validate"  /><br />  <input type="submit" name="checkoutbutton" value="$lt{'vali'}"  /><br />
 <table border="1">  <table border="1">
   <tr><td>    <tr><td>
     <table>      <table>
       <tr><td colspan="2">Student who should be logged in is:</td></tr>        <tr><td colspan="2">$lt{'stui'}</td></tr>
       <tr><td>Name:</td><td>$name</td></tr>        <tr><td>$lt{'name'}</td><td>$name</td></tr>
       <tr><td>Student ID:</td><td>$env{'environment.id'}</td></tr>        <tr><td>$lt{'sid'}</td><td>$env{'environment.id'}</td></tr>
       <tr><td>Usename</td><td>$user:$domain</td></tr>        <tr><td>$lt{'unam'}</td><td>$user:$domain</td></tr>
       <tr><td colspan="2"><img src="$url" /></td></tr>        $url
     </table>      </table>
   </tr></td>    </tr></td>
 </table>  </table>
 </form>  </form>
 ENDCHECKOUT  ENDCHECKOUT
   
     return $result;      return $result;
 }  }
   

Removed from v.1.226  
changed lines
  Added in v.1.273


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