Diff for /loncom/interface/slotrequest.pm between versions 1.48 and 1.85

version 1.48, 2006/02/26 19:40:14 version 1.85, 2008/12/21 04:14:39
Line 36  use Apache::lonlocal; Line 36  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::lonnavmaps();  use Apache::lonnavmaps();
 use Date::Manip;  use Date::Manip;
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
   
 sub fail {  sub fail {
     my ($r,$code)=@_;      my ($r,$code)=@_;
     if ($code eq 'not_valid') {      if ($code eq 'not_valid') {
  $r->print('<p>'.&mt('Unable to understand what resource you wanted to sign up for.').'</p>');   $r->print('<p>'.&mt('Unable to understand what resource you wanted to sign up for.').'</p>');
       } elsif ($code eq 'not_available') {
    $r->print('<p>'.&mt('No slots are available.').'</p>');
     } elsif ($code eq 'not_allowed') {      } elsif ($code eq 'not_allowed') {
  $r->print('<p>'.&mt('Not allowed to sign up or change reservations at this time.').'</p>');   $r->print('<p>'.&mt('Not allowed to sign up or change reservations at this time.').'</p>');
     } else {      } else {
Line 54  sub fail { Line 57  sub fail {
   
 sub start_page {  sub start_page {
     my ($r,$title)=@_;      my ($r,$title)=@_;
     my $html=&Apache::lonxml::xmlbegin();      $r->print(&Apache::loncommon::start_page($title));
     $r->print($html.'<head><title>'.&mt($title).'</title></head>');  
     $r->print(&Apache::loncommon::bodytag($title));  
 }  }
   
 sub end_page {  sub end_page {
     my ($r)=@_;      my ($r)=@_;
     $r->print(&Apache::loncommon::endbodytag().'</html>');      $r->print(&Apache::loncommon::end_page());
 }  }
   
 =pod  =pod
Line 76  sub end_page { Line 77  sub end_page {
 =cut  =cut
   
 sub get_course {  sub get_course {
     (undef,my $courseid)=&Apache::lonxml::whichuser();      (undef,my $courseid)=&Apache::lonnet::whichuser();
     my $cdom=$env{'course.'.$courseid.'.domain'};      my $cdom=$env{'course.'.$courseid.'.domain'};
     my $cnum=$env{'course.'.$courseid.'.num'};      my $cnum=$env{'course.'.$courseid.'.num'};
     return ($cnum,$cdom);      return ($cnum,$cdom);
Line 89  sub get_reservation_ids { Line 90  sub get_reservation_ids {
   
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,      my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
        "^$slot_name\0");         "^$slot_name\0");
     if (&network_error(%consumed)) {       if (&Apache::lonnet::error(%consumed)) { 
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }      }
     my ($tmp)=%consumed;      my ($tmp)=%consumed;
Line 126  sub check_for_reservation { Line 127  sub check_for_reservation {
     my ($cnum,$cdom)=&get_course();      my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);      my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);
   
     if (&network_error($student) || &network_error($course)  ||      if (&Apache::lonnet::error($student) 
  &network_error(%slots)) {   || &Apache::lonnet::error($course)
    || &Apache::lonnet::error(%slots)) {
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }          }    
     my @got;      my @got;
Line 163  sub check_for_reservation { Line 165  sub check_for_reservation {
 sub get_consumed_uniqueperiods {  sub get_consumed_uniqueperiods {
     my ($slots) = @_;      my ($slots) = @_;
     my $navmap=Apache::lonnavmaps::navmap->new;      my $navmap=Apache::lonnavmaps::navmap->new;
       if (!defined($navmap)) {
           return 'error: Unable to determine current status';
       }
     my @problems = $navmap->retrieveResources(undef,      my @problems = $navmap->retrieveResources(undef,
       sub { $_[0]->is_problem() },1,0);        sub { $_[0]->is_problem() },1,0);
     my %used_slots;      my %used_slots;
Line 174  sub get_consumed_uniqueperiods { Line 179  sub get_consumed_uniqueperiods {
  my $course =  &Apache::lonnet::EXT("resource.0.available",   my $course =  &Apache::lonnet::EXT("resource.0.available",
    $symb, $env{'user.domain'},     $symb, $env{'user.domain'},
    $env{'user.name'});     $env{'user.name'});
  if (&network_error($student) || &network_error($course)) {   if (&Apache::lonnet::error($student) 
       || &Apache::lonnet::error($course)) {
     return 'error: Unable to determine current status';      return 'error: Unable to determine current status';
  }   }
  foreach my $slot (split(/:/,$student), split(/:/, $course)) {   foreach my $slot (split(/:/,$student), split(/:/, $course)) {
Line 185  sub get_consumed_uniqueperiods { Line 191  sub get_consumed_uniqueperiods {
     if (!ref($slots)) {      if (!ref($slots)) {
  my ($cnum,$cdom)=&get_course();   my ($cnum,$cdom)=&get_course();
  my %slots=&Apache::lonnet::get('slots', [keys(%used_slots)], $cdom, $cnum);   my %slots=&Apache::lonnet::get('slots', [keys(%used_slots)], $cdom, $cnum);
  if (&network_error(%slots)) {   if (&Apache::lonnet::error(%slots)) {
     return 'error: Unable to determine current status';      return 'error: Unable to determine current status';
  }   }
  $slots = \%slots;   $slots = \%slots;
Line 211  sub check_for_conflict { Line 217  sub check_for_conflict {
   
     if (!ref($consumed_uniqueperiods)) {      if (!ref($consumed_uniqueperiods)) {
  $consumed_uniqueperiods = &get_consumed_uniqueperiods($slots);   $consumed_uniqueperiods = &get_consumed_uniqueperiods($slots);
  if (&network_error(%$consumed_uniqueperiods)) {          if (ref($consumed_uniqueperiods) eq 'HASH') {
     return 'error: Unable to determine current status';      if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {
  }          return 'error: Unable to determine current status';
       }
           } else {
               return 'error: Unable to determine current status';
           }
     }      }
           
     my ($new_uniq_start,$new_uniq_end) = @{$new_slot->{'uniqueperiod'}};      my ($new_uniq_start,$new_uniq_end) = @{$new_slot->{'uniqueperiod'}};
Line 226  sub check_for_conflict { Line 236  sub check_for_conflict {
  }   }
     }      }
     return undef;      return undef;
   
 }  
   
 sub network_error {  
     my ($result) = @_;  
     if ($result =~ /^(con_lost|no_such_host|error: [^2])/) {  
  return 1;  
     }  
     return 0;  
 }  }
   
 sub make_reservation {  sub make_reservation {
Line 245  sub make_reservation { Line 246  sub make_reservation {
     my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb,      my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb,
    $env{'user.domain'},$env{'user.name'});     $env{'user.domain'},$env{'user.name'});
     &Apache::lonxml::debug("value is  $value<br />");      &Apache::lonxml::debug("value is  $value<br />");
     if (&network_error($value)) {   
       my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",$symb,
    $env{'user.domain'},$env{'user.name'});
       &Apache::lonxml::debug("use_slots is  $use_slots<br />");
   
       if (&Apache::lonnet::error($value) 
    || &Apache::lonnet::error($use_slots)) { 
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }      }
   
       my $parm_symb  = $symb;
       my $parm_level = 1;
       if ($use_slots eq 'map' || $use_slots eq 'map_map') {
    my ($map) = &Apache::lonnet::decode_symb($symb);
    $parm_symb = &Apache::lonnet::symbread($map);
    $parm_level = 2;
       }
   
     foreach my $other_slot (split(/:/, $value)) {      foreach my $other_slot (split(/:/, $value)) {
  if ($other_slot eq $slot_name) {   if ($other_slot eq $slot_name) {
     my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom,      my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom,
        $cnum, "^$slot_name\0");            $cnum, "^$slot_name\0");   
     if (&network_error($value)) {       if (&Apache::lonnet::error($value)) { 
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }      }
     my $me=$env{'user.name'}.'@'.$env{'user.domain'};      my $me=$env{'user.name'}.':'.$env{'user.domain'};
     foreach my $key (keys(%consumed)) {      foreach my $key (keys(%consumed)) {
  if ($consumed{$key}->{'name'} eq $me) {   if ($consumed{$key}->{'name'} eq $me) {
     my $num=(split('\0',$key))[1];      my $num=(split('\0',$key))[1];
Line 270  sub make_reservation { Line 285  sub make_reservation {
     if (!defined($max)) { $max=99999; }      if (!defined($max)) { $max=99999; }
   
     my (@ids)=&get_reservation_ids($slot_name);      my (@ids)=&get_reservation_ids($slot_name);
     if (&network_error(@ids)) {       if (&Apache::lonnet::error(@ids)) { 
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }      }
     my $last=0;      my $last=0;
Line 286  sub make_reservation { Line 301  sub make_reservation {
  return undef;   return undef;
     }      }
           
     my %reservation=('name'      => $env{'user.name'}.'@'.$env{'user.domain'},      my %reservation=('name'      => $env{'user.name'}.':'.$env{'user.domain'},
      'timestamp' => time,       'timestamp' => time,
      'symb'      => $symb);       'symb'      => $parm_symb);
   
     my $success=&Apache::lonnet::newput('slot_reservations',      my $success=&Apache::lonnet::newput('slot_reservations',
  {"$slot_name\0$wanted" =>   {"$slot_name\0$wanted" =>
Line 302  sub make_reservation { Line 317  sub make_reservation {
  }   }
  my $result=&Apache::lonparmset::storeparm_by_symb($symb,   my $result=&Apache::lonparmset::storeparm_by_symb($symb,
       '0_availablestudent',        '0_availablestudent',
        1, $new_value, 'string',         $parm_level, $new_value,
          'string',
        $env{'user.name'},         $env{'user.name'},
                $env{'user.domain'});                 $env{'user.domain'});
  &Apache::lonxml::debug("hrrm $result");   &Apache::lonxml::debug("hrrm $result");
Line 315  sub make_reservation { Line 331  sub make_reservation {
   
 sub remove_registration {  sub remove_registration {
     my ($r) = @_;      my ($r) = @_;
       if ($env{'form.entry'} ne 'remove all') {
    return &remove_registration_user($r);
       }
       my $slot_name = $env{'form.slotname'};
       my %slot=&Apache::lonnet::get_slot($slot_name);
   
       my ($cnum,$cdom)=&get_course();
       my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
          "^$slot_name\0");
       if (&Apache::lonnet::error(%consumed)) {
    $r->print("<p><span class=\"LC_error\">".&mt('A network error has occurred.').'</span></p>');
    return;
       }
       if (!%consumed) {
    $r->print("<p>".&mt('Slot <tt>[_1]</tt> has no reservations.',
       $slot_name)."</p>");
    return;
       }
   
       my @names = map { $consumed{$_}{'name'} } (sort(keys(%consumed)));
       my $names = join(' ',@names);
   
       my $msg = &mt('Remove all of [_1] from slot [_2]?',$names,$slot_name);
       &remove_registration_confirmation($r,$msg,['entry','slotname']);
   }
   
   sub remove_registration_user {
       my ($r) = @_;
       
       my $slot_name = $env{'form.slotname'};
   
     my $name = &Apache::loncommon::plainname($env{'form.uname'},      my $name = &Apache::loncommon::plainname($env{'form.uname'},
      $env{'form.udom'});       $env{'form.udom'});
   
     my $title = &Apache::lonnet::gettitle($env{'form.symb'});      my $title = &Apache::lonnet::gettitle($env{'form.symb'});
   
       my $msg = &mt('Remove [_1] from slot [_2] for [_3]',
     $name,$slot_name,$title);
       
       &remove_registration_confirmation($r,$msg,['uname','udom','slotname',
          'entry','symb']);
   }
   
   sub remove_registration_confirmation {
       my ($r,$msg,$inputs) =@_;
   
     my $hidden_input;      my $hidden_input;
     foreach my $parm ('uname','udom','slotname','entry','symb') {      foreach my $parm (@{$inputs}) {
  $hidden_input .=   $hidden_input .=
     '<input type="hidden" name="'.$parm.'" value="'      '<input type="hidden" name="'.$parm.'" value="'
     .&HTML::Entities::encode($env{'form.'.$parm},'"<>&\'').'" />'."\n";      .&HTML::Entities::encode($env{'form.'.$parm},'"<>&\'').'" />'."\n";
     }      }
       my %lt = &Apache::lonlocal::texthash('yes' => 'Yes',
    'no'  => 'No',);
     $r->print(<<"END_CONFIRM");      $r->print(<<"END_CONFIRM");
 <p> Remove $name from slot $env{'form.slotname'} for $title</p>  <p> $msg </p>
 <form action="/adm/slotrequest" method="POST">  <form action="/adm/slotrequest" method="post">
     <input type="hidden" name="command" value="release" />      <input type="hidden" name="command" value="release" />
       <input type="hidden" name="button" value="yes" />
     $hidden_input      $hidden_input
     <input type="submit" name="Yes" value="yes" />      <input type="submit" value="$lt{'yes'}" />
 </form>  </form>
 <form action="/adm/slotrequest" method="POST">  <form action="/adm/slotrequest" method="post">
     <input type="hidden" name="command" value="showslots" />      <input type="hidden" name="command" value="showslots" />
     <input type="submit" name="No" value="no" />      <input type="submit" value="$lt{'no'}" />
 </form>  </form>
 END_CONFIRM  END_CONFIRM
   
 }  }
   
   sub release_all_slot {
       my ($r,$mgr)=@_;
       
       my $slot_name = $env{'form.slotname'};
   
       my ($cnum,$cdom)=&get_course();
   
       my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
          "^$slot_name\0");
       
       $r->print('<p>'.&mt('Releasing reservations').'</p>');
   
       foreach my $entry (sort { $consumed{$a}{'name'} cmp 
     $consumed{$b}{'name'} } (keys(%consumed))) {
    my ($uname,$udom) = split(':',$consumed{$entry}{'name'});
    my ($result,$msg) =
       &release_reservation($slot_name,$uname,$udom,
    $consumed{$entry}{'symb'},$mgr);
           if (!$result) {
               $r->print('<p><span class="LC_error">'.&mt($msg).'</span></p>');
           } else {
       $r->print("<p>$msg</p>");
           }
    $r->rflush();
       }
       $r->print('<p><a href="/adm/slotrequest?command=showslots">'.
         &mt('Return to slot list').'</a></p>');
       &return_link($r);
   }
   
 sub release_slot {  sub release_slot {
     my ($r,$symb,$slot_name,$inhibit_return_link,$mgr)=@_;      my ($r,$symb,$slot_name,$inhibit_return_link,$mgr)=@_;
   
     if ($slot_name eq '') { $slot_name=$env{'form.slotname'}; }      if ($slot_name eq '') { $slot_name=$env{'form.slotname'}; }
     my ($cnum,$cdom)=&get_course();  
   
     my ($uname,$udom) = ($env{'user.name'}, $env{'user.domain'});      my ($uname,$udom) = ($env{'user.name'}, $env{'user.domain'});
     if ($mgr eq 'F'       if ($mgr eq 'F' 
Line 355  sub release_slot { Line 444  sub release_slot {
   
     if ($mgr eq 'F'       if ($mgr eq 'F' 
  && defined($env{'form.symb'})) {   && defined($env{'form.symb'})) {
  $symb = $env{'form.symb'};   $symb = &unescape($env{'form.symb'});
     }      }
   
       my ($result,$msg) =
    &release_reservation($slot_name,$uname,$udom,$symb,$mgr);
       if (!$result) {
           $r->print('<p><span class="LC_error">'.&mt($msg).'</span></p>');
       } else {
           $r->print("<p>$msg</p>");
       }
       
       if ($mgr eq 'F') {
    $r->print('<p><a href="/adm/slotrequest?command=showslots">'.
     &mt('Return to slot list').'</a></p>');
       }
   
       if (!$inhibit_return_link) { &return_link($r);  }
       return $result;
   }
   
   sub release_reservation {
       my ($slot_name,$uname,$udom,$symb,$mgr) = @_;
     my %slot=&Apache::lonnet::get_slot($slot_name);      my %slot=&Apache::lonnet::get_slot($slot_name);
     my $description=&get_description($env{'form.slotname'},\%slot);      my $description=&get_description($slot_name,\%slot);
   
     if ($mgr ne 'F') {      if ($mgr ne 'F') {
  if ($slot{'starttime'} < time) {   if ($slot{'starttime'} < time) {
     $r->print("<p>Not allowed to release Reservation: $description, as it has already ended.  </p>");      return (0,&mt('Not allowed to release Reservation: [_1], as it has already ended.',$description));
     &return_link($r);  
     return 0;  
  }   }
     }      }
   
       # if the reservation symb is for a map get a resource in that map
       # to check slot parameters on
       my $navmap=Apache::lonnavmaps::navmap->new;
       if (!defined($navmap)) {
           return (0,'error: Unable to determine current status');
       }
       my $passed_resource = $navmap->getBySymb($symb);
       if ($passed_resource->is_map()) {
    my ($a_resource) = 
       $navmap->retrieveResources($passed_resource, 
          sub {$_[0]->is_problem()},0,1);
    $symb = $a_resource->symb();
       }
   
     # get parameter string, check for existance, rebuild string with the slot      # get parameter string, check for existance, rebuild string with the slot
     my @slots = split(/:/,&Apache::lonnet::EXT("resource.0.availablestudent",      my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
        $symb,$udom,$uname));                                         $symb,$udom,$uname);
       my @slots = split(/:/,$student);
   
     my @new_slots;      my @new_slots;
     foreach my $exist_slot (@slots) {      foreach my $exist_slot (@slots) {
Line 378  sub release_slot { Line 501  sub release_slot {
     }      }
     my $new_param = join(':',@new_slots);      my $new_param = join(':',@new_slots);
   
       my ($cnum,$cdom)=&get_course();
   
     # get slot reservations, check if user has one, if so remove reservation      # get slot reservations, check if user has one, if so remove reservation
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,      my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
        "^$slot_name\0");         "^$slot_name\0");
     foreach my $entry (keys(%consumed)) {      foreach my $entry (keys(%consumed)) {
  if ( $consumed{$entry}->{'name'} eq ($uname.'@'.$udom) ) {   if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
     &Apache::lonnet::del('slot_reservations',[$entry],      &Apache::lonnet::del('slot_reservations',[$entry],
  $cdom,$cnum);   $cdom,$cnum);
  }   }
     }      }
   
       my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",
    $symb,$udom,$uname);
       &Apache::lonxml::debug("use_slots is  $use_slots<br />");
   
       if (&Apache::lonnet::error($use_slots)) { 
    return (0,'error: Unable to determine current status');
       }
   
       my $parm_level = 1;
       if ($use_slots eq 'map' || $use_slots eq 'map_map') {
    $parm_level = 2;
       }
     # store new parameter string      # store new parameter string
     my $result=&Apache::lonparmset::storeparm_by_symb($symb,      my $result=&Apache::lonparmset::storeparm_by_symb($symb,
       '0_availablestudent',        '0_availablestudent',
       1, $new_param, 'string',        $parm_level, $new_param,
       $uname,$udom);        'string', $uname, $udom);
     $r->print("<p>Released Reservation: $description</p>");  
       my $msg;
     if ($mgr eq 'F') {      if ($mgr eq 'F') {
  $r->print('<p><a href="/adm/slotrequest?command=showslots">'.   $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
   &mt('Return to slot list').'</a></p>');      } else {
    $msg = &mt('Released Reservation: [_1]',$description);
     }      }
     if (!$inhibit_return_link) { &return_link($r);  }      return (1,$msg);
     return 1;  
 }  }
   
 sub delete_slot {  sub delete_slot {
Line 421  sub delete_slot { Line 559  sub delete_slot {
  if ($ret eq 'ok') {   if ($ret eq 'ok') {
     $r->print("<p>Slot <tt>$slot_name</tt> marked as deleted.</p>");      $r->print("<p>Slot <tt>$slot_name</tt> marked as deleted.</p>");
  } else {   } else {
     $r->print("<p> An error ($ret) occurse when attempting to delete Slot <tt>$slot_name</tt>.</p>");      $r->print("<p><span class=\"LC_error\"> An error ($ret) occurse when attempting to delete Slot <tt>$slot_name</tt>.</span></p>");
  }   }
     } else {      } else {
  if (%consumed) {   if (%consumed) {
Line 442  sub return_link { Line 580  sub return_link {
 }  }
   
 sub get_slot {  sub get_slot {
     my ($r,$symb)=@_;      my ($r,$symb,$conflictable_slot,$inhibit_return_link)=@_;
   
     my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});      my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
     my $slot_name=&check_for_conflict($symb,$env{'form.slotname'},\%slot);      my $slot_name=&check_for_conflict($symb,$env{'form.slotname'},\%slot);
   
     if ($slot_name =~ /^error: (.*)/) {      if ($slot_name =~ /^error: (.*)/) {
  $r->print("<p>An error occured while attempting to make a reservation. ($1)</p>");   $r->print('<p><span class="LC_error">'
                    .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
                    .'</span></p>');
  &return_link($r);   &return_link($r);
  return;   return 0;
     }      }
     if ($slot_name) {      if ($slot_name && $slot_name ne $conflictable_slot) {
  my %slot=&Apache::lonnet::get_slot($slot_name);   my %slot=&Apache::lonnet::get_slot($slot_name);
  my $description1=&get_description($slot_name,\%slot);   my $description1=&get_description($slot_name,\%slot);
  %slot=&Apache::lonnet::get_slot($env{'form.slotname'});   %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
Line 460  sub get_slot { Line 600  sub get_slot {
  $r->print("<p>Already have a reservation: $description1</p>");   $r->print("<p>Already have a reservation: $description1</p>");
  if ($slot_name ne $env{'form.slotname'}) {   if ($slot_name ne $env{'form.slotname'}) {
     $r->print(<<STUFF);      $r->print(<<STUFF);
 <form method="POST" action="/adm/slotrequest">  <form method="post" action="/adm/slotrequest">
    <input type="hidden" name="symb" value="$env{'form.symb'}" />     <input type="hidden" name="symb" value="$env{'form.symb'}" />
    <input type="hidden" name="slotname" value="$env{'form.slotname'}" />     <input type="hidden" name="slotname" value="$env{'form.slotname'}" />
    <input type="hidden" name="releaseslot" value="$slot_name" />     <input type="hidden" name="releaseslot" value="$slot_name" />
Line 480  STUFF Line 620  STUFF
         } else {          } else {
     &return_link($r);      &return_link($r);
  }   }
  return;   return 0;
     }      }
   
     my $reserved=&make_reservation($env{'form.slotname'},      my $reserved=&make_reservation($env{'form.slotname'},
    \%slot,$symb);     \%slot,$symb);
     my $description=&get_description($env{'form.slotname'},\%slot);      my $description=&get_description($env{'form.slotname'},\%slot);
     if (defined($reserved)) {      if (defined($reserved)) {
    my $retvalue = 0;
  if ($slot_name =~ /^error: (.*)/) {   if ($slot_name =~ /^error: (.*)/) {
     $r->print("<p>An error occured while attempting to make a reservation. ($1)</p>");      $r->print('<p><span class="LC_error">'
                        .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
                        .'</span></p>');
  } elsif ($reserved > -1) {   } elsif ($reserved > -1) {
     $r->print("<p>Success: $description</p>");      $r->print("<p>Success: $description</p>");
       $retvalue = 1;
  } elsif ($reserved < 0) {   } elsif ($reserved < 0) {
     $r->print("<p>Already reserved: $description</p>");      $r->print("<p>Already reserved: $description</p>");
  }   }
  &return_link($r);   if (!$inhibit_return_link) { &return_link($r); }
  return;   return 1;
     }      }
   
     my %lt=('request'=>"Availibility list",      my %lt=('request'=>"Availibility list",
     'try'    =>'Try again');      'try'    =>'Try again');
     %lt=&Apache::lonlocal::texthash(%lt);      %lt=&Apache::lonlocal::texthash(%lt);
   
       my $extra_input;
       if ($conflictable_slot) {
    $extra_input='<input type="hidden" name="releaseslot" value="'.$env{'form.slotname'}.'" />';
       }
   
     $r->print(<<STUFF);      $r->print(<<STUFF);
 <p> <font color="red">Failed</font> to reserve a spot for $description. </p>  <p> <span class="LC_warning">Failed</span> to reserve a spot for $description. </p>
 <p>  <p>
 <form method="POST" action="/adm/slotrequest">  <form method="post" action="/adm/slotrequest">
    <input type="submit" name="Try Again" value="$lt{'try'}" />     <input type="submit" name="Try Again" value="$lt{'try'}" />
    <input type="hidden" name="symb" value="$env{'form.symb'}" />     <input type="hidden" name="symb" value="$env{'form.symb'}" />
    <input type="hidden" name="slotname" value="$env{'form.slotname'}" />     <input type="hidden" name="slotname" value="$env{'form.slotname'}" />
    <input type="hidden" name="command" value="get" />     <input type="hidden" name="command" value="$env{'form.command'}" />
      $extra_input
 </form>  </form>
 ?  ?
 </p>  </p>
 <p>  <p>
 or  or
 <form method="POST" action="/adm/slotrequest">  <form method="post" action="/adm/slotrequest">
     <input type="hidden" name="symb" value="$env{'form.symb'}" />      <input type="hidden" name="symb" value="$env{'form.symb'}" />
     <input type="submit" name="requestattempt" value="$lt{'request'}" />      <input type="submit" name="requestattempt" value="$lt{'request'}" />
 </form>  </form>
Line 523  or Line 673  or
 or  or
 STUFF  STUFF
   
     &return_link($r);      if (!$inhibit_return_link) { &return_link($r); }
     return;      return 0;
 }  }
   
 sub allowed_slot {  sub allowed_slot {
     my ($slot_name,$slot,$symb,$slots,$consumed_uniqueperiods)=@_;      my ($slot_name,$slot,$symb,$slots,$consumed_uniqueperiods)=@_;
   
     #already started      #already started
     if ($slot->{'starttime'} < time) {      if ($slot->{'starttime'} < time) {
  # all open slot to be schedulable   return 0;
  #return 0;  
     }      }
     &Apache::lonxml::debug("$slot_name starttime good");      &Apache::lonxml::debug("$slot_name starttime good");
   
     #already ended      #already ended
     if ($slot->{'endtime'} < time) {      if ($slot->{'endtime'} < time) {
  return 0;   return 0;
     }      }
     &Apache::lonxml::debug("$slot_name endtime good");      &Apache::lonxml::debug("$slot_name endtime good");
   
     # not allowed to pick this one      # not allowed to pick this one
     if (defined($slot->{'type'})      if (defined($slot->{'type'})
  && $slot->{'type'} ne 'schedulable_student') {   && $slot->{'type'} ne 'schedulable_student') {
  return 0;   return 0;
     }      }
     &Apache::lonxml::debug("$slot_name type good");      &Apache::lonxml::debug("$slot_name type good");
   
       # reserve time not yet started
       if ($slot->{'startreserve'} > time) {
    return 0;
       }
       &Apache::lonxml::debug("$slot_name reserve good");
   
       my $userallowed=0;
       # its for a different set of users
       if (defined($slot->{'allowedsections'})) {
    if (!defined($env{'request.role.sec'})
       && grep(/^No section assigned$/,
       split(',',$slot->{'allowedsections'}))) {
       $userallowed=1;
    }
    if (defined($env{'request.role.sec'})
       && grep(/^\Q$env{'request.role.sec'}\E$/,
       split(',',$slot->{'allowedsections'}))) {
       $userallowed=1;
    }
    if (defined($env{'request.course.groups'})) {
       my @groups = split(/:/,$env{'request.course.groups'});
       my @allowed_sec = split(',',$slot->{'allowedsections'});
       foreach my $group (@groups) {
    if (grep {$_ eq $group} (@allowed_sec)) {
       $userallowed=1;
       last;
    }
       }
    }
       }
       &Apache::lonxml::debug("$slot_name sections is $userallowed");
   
       # its for a different set of users
       if (defined($slot->{'allowedusers'})
    && grep(/^\Q$env{'user.name'}:$env{'user.domain'}\E$/,
    split(',',$slot->{'allowedusers'}))) {
    $userallowed=1;
       }
   
       if (!defined($slot->{'allowedusers'})
    && !defined($slot->{'allowedsections'})) {
    $userallowed=1;
       }
   
       &Apache::lonxml::debug("$slot_name user is $userallowed");
       return 0 if (!$userallowed);
   
     # not allowed for this resource      # not allowed for this resource
     if (defined($slot->{'symb'})      if (defined($slot->{'symb'})
  && $slot->{'symb'} ne $symb) {   && $slot->{'symb'} ne $symb) {
  return 0;   return 0;
     }      }
   
     my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots,      my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots,
        $consumed_uniqueperiods);         $consumed_uniqueperiods);
     if ($conflict) {      if ($conflict =~ /^error: /) {
           return 0;
       } else {
  if ($slots->{$conflict}{'starttime'} < time) {   if ($slots->{$conflict}{'starttime'} < time) {
     return 0;      return 0;
  }   }
Line 579  sub show_choices { Line 782  sub show_choices {
     my ($cnum,$cdom)=&get_course();      my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);      my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
     my $consumed_uniqueperiods = &get_consumed_uniqueperiods(\%slots);      my $consumed_uniqueperiods = &get_consumed_uniqueperiods(\%slots);
       if (ref($consumed_uniqueperiods) eq 'HASH') {
           if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {
               $r->print('<span class="LC_error">'.
                         &mt('An error occurred determining slot availability').
                         '</span>');
               return;
           }
       } elsif ($consumed_uniqueperiods =~ /^error: /) {
           $r->print('<span class="LC_error">'.
                     &mt('An error occurred determining slot availability').
                     '</span>');
           return;
       }
     my $available;      my $available;
     $r->print('<table border="1">');  
     &Apache::lonxml::debug("Checking Slots");      &Apache::lonxml::debug("Checking Slots");
     my @got_slots=&check_for_reservation($symb,'allslots');      my @got_slots=&check_for_reservation($symb,'allslots');
       if ($got_slots[0] =~ /^error: /) {
           $r->print('<span class="LC_error">'.
                     &mt('An error occurred determining slot availability').
                     '</span>');
           return;
       }
       $r->print('<table border="1">');
     foreach my $slot (sort       foreach my $slot (sort 
       { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }        { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }
       (keys(%slots)))  {        (keys(%slots)))  {
Line 601  sub show_choices { Line 823  sub show_choices {
     my $text=&mt('Select');      my $text=&mt('Select');
     my $command='get';      my $command='get';
     if (grep(/^\Q$slot\E$/,@got_slots)) {      if (grep(/^\Q$slot\E$/,@got_slots)) {
  $text=&mt('Free Reservation');   $text=&mt('Drop Reservation');
  $command='release';   $command='release';
     } else {      } else {
  my $conflict = &check_for_conflict($symb,$slot,$slots{$slot},   my $conflict = &check_for_conflict($symb,$slot,$slots{$slot},
    \%slots,     \%slots,
    $consumed_uniqueperiods);     $consumed_uniqueperiods);
  if ($conflict) {                  if ($conflict) {
     $text=&mt('Change Reservation');                      if ($conflict =~ /^error: /) {
     $command='get';                          $r->print('<tr><td><span class="LC_error" colspan="2">'
  }                                    .&mt('Slot: [_1] has unknown status.',$description)
                                     .'</span></td></tr>');
                       } else {
           $text=&mt('Change Reservation');
           $command='get';
       }
                   }
     }      }
     my $escsymb=&Apache::lonnet::escape($symb);      my $escsymb=&escape($symb);
     $form=<<STUFF;      $form=<<STUFF;
    <form method="POST" action="/adm/slotrequest">     <form method="post" action="/adm/slotrequest">
      <input type="submit" name="Select" value="$text" />       <input type="submit" name="Select" value="$text" />
      <input type="hidden" name="symb" value="$escsymb" />       <input type="hidden" name="symb" value="$escsymb" />
      <input type="hidden" name="slotname" value="$slot" />       <input type="hidden" name="slotname" value="$slot" />
Line 638  STUFF Line 866  STUFF
 }  }
   
 sub to_show {  sub to_show {
     my ($slot,$when,$deleted) = @_;      my ($slotname,$slot,$when,$deleted,$name) = @_;
     my $time=time;      my $time=time;
     my $week=60*60*24*7;      my $week=60*60*24*7;
   
     if ($deleted eq 'hide' && $slot->{'type'} eq 'deleted') {      if ($deleted eq 'hide' && $slot->{'type'} eq 'deleted') {
  return 0;   return 0;
     }      }
   
       if ($name && $name->{'value'} =~ /\w/) {
    if ($name->{'type'} eq 'substring') {
       if ($slotname !~ /\Q$name->{'value'}\E/) {
    return 0;
       }
    }
    if ($name->{'type'} eq 'exact') {
       if ($slotname eq $name->{'value'}) {
    return 0;
       }
    }
       }
   
     if ($when eq 'any') {      if ($when eq 'any') {
  return 1;   return 1;
     } elsif ($when eq 'now') {      } elsif ($when eq 'now') {
Line 688  sub to_show { Line 931  sub to_show {
 sub remove_link {  sub remove_link {
     my ($slotname,$entry,$uname,$udom,$symb) = @_;      my ($slotname,$entry,$uname,$udom,$symb) = @_;
   
     $slotname  = &Apache::lonnet::escape($slotname);      my $remove = &mt('Remove');
     $entry     = &Apache::lonnet::escape($entry);  
     $uname     = &Apache::lonnet::escape($uname);      if ($entry eq 'remove all') {
     $udom      = &Apache::lonnet::escape($udom);   $remove = &mt('Remove All');
     $symb      = &Apache::lonnet::escape($symb);   undef($uname);
    undef($udom);
       }
   
     my $remove= &mt('Remove');      $slotname  = &escape($slotname);
       $entry     = &escape($entry);
       $uname     = &escape($uname);
       $udom      = &escape($udom);
       $symb      = &escape($symb);
   
     return <<"END_LINK";      return <<"END_LINK";
  <a href="/adm/slotrequest?command=remove_registration&slotname=$slotname&entry=$entry&uname=$uname&udom=$udom&symb=$symb"   <a href="/adm/slotrequest?command=remove_registration&amp;slotname=$slotname&amp;entry=$entry&amp;uname=$uname&amp;udom=$udom&amp;symb=$symb"
    >($remove)</a>     >($remove)</a>
 END_LINK  END_LINK
   
Line 713  sub show_table { Line 962  sub show_table {
     }       } 
     my $available;      my $available;
     if ($mgr eq 'F') {      if ($mgr eq 'F') {
       # FIXME: This line should be deleted once Slots uses breadcrumbs
       $r->print(&Apache::loncommon::help_open_topic('Slot About', 'Help on slots'));
   
  $r->print('<div>');   $r->print('<div>');
  $r->print('<form method="POST" action="/adm/slotrequest">   $r->print('<form method="post" action="/adm/slotrequest">
 <input type="hidden" name="command" value="uploadstart" />  <input type="hidden" name="command" value="uploadstart" />
 <input type="submit" name="start" value="'.&mt('Upload Slot List').'" />  <input type="submit" name="start" value="'.&mt('Upload Slot List').'" />
 </form>');  </form>');
  $r->print('<form method="POST" action="/adm/helper/newslot.helper">   $r->print(&Apache::loncommon::help_open_topic('Slot CommaDelimited'));
    $r->print('<form method="post" action="/adm/helper/newslot.helper">
 <input type="submit" name="newslot" value="'.&mt('Create a New Slot').'" />  <input type="submit" name="newslot" value="'.&mt('Create a New Slot').'" />
 </form>');  </form>');
    $r->print(&Apache::loncommon::help_open_topic('Slot AddInterface'));
  $r->print('</div>');   $r->print('</div>');
     }      }
           
     my %Saveable_Parameters = ('show'    => 'array',      my %Saveable_Parameters = ('show'              => 'array',
        'when'    => 'scalar',         'when'              => 'scalar',
        'order'   => 'scalar',         'order'             => 'scalar',
        'deleted' => 'scalar',         'deleted'           => 'scalar',
          'name_filter_type'  => 'scalar',
          'name_filter_value' => 'scalar',
        );         );
     &Apache::loncommon::store_course_settings('slotrequest',      &Apache::loncommon::store_course_settings('slotrequest',
       \%Saveable_Parameters);        \%Saveable_Parameters);
Line 737  sub show_table { Line 993  sub show_table {
     my ($classlist,$section,$fullname)=&Apache::grades::getclasslist('all');      my ($classlist,$section,$fullname)=&Apache::grades::getclasslist('all');
     &Apache::grades::reset_perm();      &Apache::grades::reset_perm();
   
       # what to display filtering
     my %show_fields=&Apache::lonlocal::texthash(      my %show_fields=&Apache::lonlocal::texthash(
      'name'         => 'Slot Name',       'name'            => 'Slot Name',
      'description'  => 'Description',       'description'     => 'Description',
      'type'         => 'Type',       'type'            => 'Type',
      'starttime'    => 'Start time',       'starttime'       => 'Start time',
      'endtime'      => 'End Time',       'endtime'         => 'End Time',
              'startreserve' => 'Time students can start reserving',               'startreserve'    => 'Time students can start reserving',
      'secret'       => 'Secret Word',       'secret'          => 'Secret Word',
      'maxspace'     => 'Maximum # of students',       'space'           => '# of students/max',
      'ip'           => 'IP or DNS restrictions',       'ip'              => 'IP or DNS restrictions',
      'symb'         => 'Resource slot is restricted to.',       'symb'            => 'Resource slot is restricted to.',
      'uniqueperiod' => 'Period of time slot is unique',       'allowedsections' => 'Sections slot is restricted to.',
      'scheduled'    => 'Scheduled Students',       'allowedusers'    => 'Users slot is restricted to.',
      'proctor'      => 'List of proctors');       'uniqueperiod'    => 'Period of time slot is unique',
        'scheduled'       => 'Scheduled Students',
        'proctor'         => 'List of proctors');
     my @show_order=('name','description','type','starttime','endtime',      my @show_order=('name','description','type','starttime','endtime',
        'startreserve','secret','maxspace','ip','symb',      'startreserve','secret','space','ip','symb',
        'uniqueperiod','scheduled','proctor');      'allowedsections','allowedusers','uniqueperiod',
       'scheduled','proctor');
     my @show =       my @show = 
  (exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')   (exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')
                             : keys(%show_fields);                              : keys(%show_fields);
     my %show =  map { $_ => 1 } (@show);      my %show =  map { $_ => 1 } (@show);
   
       #when filtering setup
     my %when_fields=&Apache::lonlocal::texthash(      my %when_fields=&Apache::lonlocal::texthash(
      'now'      => 'Open now',       'now'      => 'Open now',
      'nextweek' => 'Open within the next week',       'nextweek' => 'Open within the next week',
Line 772  sub show_table { Line 1033  sub show_table {
     my $when = (exists($env{'form.when'})) ? $env{'form.when'}      my $when = (exists($env{'form.when'})) ? $env{'form.when'}
                                             : 'now';                                              : 'now';
   
       #display of students setup
     my %stu_display_fields=      my %stu_display_fields=
  &Apache::lonlocal::texthash('username' => 'User name',   &Apache::lonlocal::texthash('username' => 'User name',
     'fullname' => 'Full name',      'fullname' => 'Full name',
Line 782  sub show_table { Line 1044  sub show_table {
                                   : keys(%stu_display_fields);                                    : keys(%stu_display_fields);
     my %stu_display =  map { $_ => 1 } (@stu_display);      my %stu_display =  map { $_ => 1 } (@stu_display);
   
       #name filtering setup
       my %name_filter_type_fields=
    &Apache::lonlocal::texthash('substring' => 'Substring',
       'exact'     => 'Exact',
       #'reg'       => 'Regular Expression',
       );
       my @name_filter_type_order=('substring','exact');
   
       $name_filter_type_fields{'select_form_order'} = \@name_filter_type_order;
       my $name_filter_type = 
    (exists($env{'form.name_filter_type'})) ? $env{'form.name_filter_type'}
                                                   : 'substring';
       my $name_filter = {'type'  => $name_filter_type,
          'value' => $env{'form.name_filter_value'},};
   
       
       #deleted slot filtering
       #default to hide if no value
       $env{'form.deleted'} ||= 'hide';
     my $hide_radio =       my $hide_radio = 
  &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'hide');   &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'hide');
     my $show_radio =       my $show_radio = 
  &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'show');   &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'show');
   
     $r->print('<form method="POST" action="/adm/slotrequest">      $r->print('<form method="post" action="/adm/slotrequest">
 <input type="hidden" name="command" value="showslots" />');  <input type="hidden" name="command" value="showslots" />');
     $r->print('<div>');      $r->print('<div>');
     $r->print('<table class="inline">      $r->print('<table class="inline">
       <tr><th>'.&mt('Show').'</th>        <tr><th>'.&mt('Show').'</th>
           <th>'.&mt('Student Display').'</th>            <th>'.&mt('Student Display').'</th>
           <th>'.&mt('Open').'</th>            <th>'.&mt('Open').'</th>
             <th>'.&mt('Slot Name Filter').'</th>
           <th>'.&mt('Options').'</th>            <th>'.&mt('Options').'</th>
       </tr>        </tr>
       <tr><td>'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order).        <tr><td>'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order).
Line 805  sub show_table { Line 1087  sub show_table {
            </td>             </td>
            <td>'.&Apache::loncommon::select_form($when,'when',%when_fields).             <td>'.&Apache::loncommon::select_form($when,'when',%when_fields).
           '</td>            '</td>
              <td>'.&Apache::loncommon::select_form($name_filter_type,
    'name_filter_type',
    %name_filter_type_fields).
         '<br />'.
         &Apache::lonhtmlcommon::textbox('name_filter_value',
         $env{'form.name_filter_value'},
         15).
             '</td>
            <td>             <td>
             <table>              <table>
               <tr>                <tr>
Line 821  sub show_table { Line 1111  sub show_table {
     $r->print('</div>');      $r->print('</div>');
     $r->print('<p><input type="submit" name="start" value="'.&mt('Update Display').'" /></p>');      $r->print('<p><input type="submit" name="start" value="'.&mt('Update Display').'" /></p>');
     my $linkstart='<a href="/adm/slotrequest?command=showslots&amp;order=';      my $linkstart='<a href="/adm/slotrequest?command=showslots&amp;order=';
     $r->print('<table class="thinborder">      $r->print(&Apache::loncommon::start_data_table().
 <tr>        &Apache::loncommon::start_data_table_header_row().'
   <th></th>');         <th></th>');
     foreach my $which (@show_order) {      foreach my $which (@show_order) {
  if ($which ne 'proctor' && exists($show{$which})) {   if ($which ne 'proctor' && exists($show{$which})) {
     $r->print('<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>');      $r->print('<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>');
  }   }
     }      }
       $r->print(&Apache::loncommon::end_data_table_header_row());
   
     my %name_cache;      my %name_cache;
     my $slotsort = sub {      my $slotsort = sub {
  if ($env{'form.order'}=~/^(type|description|endtime|startreserve|maxspace|ip|symb)$/) {   if ($env{'form.order'}=~/^(type|description|endtime|startreserve|ip|symb|allowedsections|allowedusers)$/) {
     if (lc($slots{$a}->{$env{'form.order'}})      if (lc($slots{$a}->{$env{'form.order'}})
  ne lc($slots{$b}->{$env{'form.order'}})) {   ne lc($slots{$b}->{$env{'form.order'}})) {
  return (lc($slots{$a}->{$env{'form.order'}})    return (lc($slots{$a}->{$env{'form.order'}}) 
  cmp lc($slots{$b}->{$env{'form.order'}}));   cmp lc($slots{$b}->{$env{'form.order'}}));
     }      }
    } elsif ($env{'form.order'} eq 'space') {
       if ($slots{$a}{'maxspace'} ne $slots{$b}{'maxspace'}) {
    return ($slots{$a}{'maxspace'} cmp $slots{$b}{'maxspace'});
       }
  } elsif ($env{'form.order'} eq 'name') {   } elsif ($env{'form.order'} eq 'name') {
     if (lc($a) cmp lc($b)) {      if (lc($a) cmp lc($b)) {
  return lc($a) cmp lc($b);   return lc($a) cmp lc($b);
Line 857  sub show_table { Line 1152  sub show_table {
  }   }
  return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'};   return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'};
     };      };
   
       my %consumed;
       if (exists($show{'scheduled'}) || exists($show{'space'}) ) {
    %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum);
    my ($tmp)=%consumed;
    if ($tmp =~ /^error: /) { undef(%consumed); }
       }
   
     foreach my $slot (sort $slotsort (keys(%slots)))  {      foreach my $slot (sort $slotsort (keys(%slots)))  {
  if (!&to_show($slots{$slot},$when,$env{'form.deleted'})) { next; }   if (!&to_show($slot,$slots{$slot},$when,
         $env{'form.deleted'},$name_filter)) { next; }
  if (defined($slots{$slot}->{'type'})   if (defined($slots{$slot}->{'type'})
     && $slots{$slot}->{'type'} ne 'schedulable_student') {      && $slots{$slot}->{'type'} ne 'schedulable_student') {
     #next;      #next;
  }   }
  my $description=&get_description($slot,$slots{$slot});   my $description=&get_description($slot,$slots{$slot});
  my $ids;   my ($id_count,$ids);
  if (exists($show{'scheduled'})) {      
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,   if (exists($show{'scheduled'}) || exists($show{'space'}) ) {
        "^$slot\0");      my $re_str = "$slot\0";
     my ($tmp)=%consumed;      my @this_slot = grep(/^\Q$re_str\E/,keys(%consumed));
     if ($tmp !~ /^error: /) {      $id_count = scalar(@this_slot);
  foreach my $entry (sort(keys(%consumed))) {      if (exists($show{'scheduled'})) {
    foreach my $entry (sort { $consumed{$a}{name} cmp 
         $consumed{$b}{name} }
      (@this_slot)) {
     my (undef,$id)=split("\0",$entry);      my (undef,$id)=split("\0",$entry);
     my ($uname,$udom) = split('@',$consumed{$entry}{'name'});      my ($uname,$udom) = split(':',$consumed{$entry}{'name'});
     $ids.= '<nobr>';      $ids.= '<span class="LC_nobreak">';
     foreach my $item (@stu_display_order) {      foreach my $item (@stu_display_order) {
  if ($stu_display{$item}) {   if ($stu_display{$item}) {
     if ($item eq 'fullname') {      if ($item eq 'fullname') {
  $ids.=$fullname->{"$uname:$udom"}.' ';   $ids.=$fullname->{"$uname:$udom"}.' ';
     } elsif ($item eq 'username') {      } elsif ($item eq 'username') {
  $ids.="<tt>$uname\@$udom</tt> ";   $ids.="<tt>$uname:$udom</tt> ";
     }      }
  }   }
     }      }
     $ids.=&remove_link($slot,$entry,$uname,$udom,      $ids.=&remove_link($slot,$entry,$uname,$udom,
        $consumed{$entry}{'symb'}).'</nobr><br />';         $consumed{$entry}{'symb'}).'</span><br />';
  }   }
     }      }
  }   }
Line 898  sub show_table { Line 1205  sub show_table {
   
  my $unique;   my $unique;
  if (ref($slots{$slot}{'uniqueperiod'})) {   if (ref($slots{$slot}{'uniqueperiod'})) {
     $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).','.      $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).', '.
  localtime($slots{$slot}{'uniqueperiod'}[1]);   localtime($slots{$slot}{'uniqueperiod'}[1]);
  }   }
   
Line 911  sub show_table { Line 1218  sub show_table {
     $title='<a href="'.$res.'?symb='.$slots{$slot}{'symb'}.'">'.$title.'</a>';      $title='<a href="'.$res.'?symb='.$slots{$slot}{'symb'}.'">'.$title.'</a>';
  }   }
   
    my $allowedsections;
    if (exists($show{'allowedsections'})) {
       $allowedsections = 
    join(', ',sort(split(/\s*,\s*/,
        $slots{$slot}->{'allowedsections'})));
    }
   
    my @allowedusers;
    if (exists($show{'allowedusers'})) {
       @allowedusers= map {
    my ($uname,$udom)=split(/:/,$_);
    my $fullname=$name_cache{$_};
    if (!defined($fullname)) {
       $fullname = &Apache::loncommon::plainname($uname,$udom);
       $fullname =~s/\s/&nbsp;/g;
       $name_cache{$_} = $fullname;
    }
    &Apache::loncommon::aboutmewrapper($fullname,$uname,$udom);
       } (sort(split(/\s*,\s*/,$slots{$slot}->{'allowedusers'})));
    }
    my $allowedusers=join(', ',@allowedusers);
   
  my @proctors;   my @proctors;
  my $rowspan=1;   my $rowspan=1;
  my $colspan=1;   my $colspan=1;
  if (exists($show{'proctor'})) {   if (exists($show{'proctor'})) {
     $rowspan=2;      $rowspan=2;
     @proctors= map {      @proctors= map {
  my ($uname,$udom)=split(/@/,$_);   my ($uname,$udom)=split(/:/,$_);
  my $fullname=$name_cache{$_};   my $fullname=$name_cache{$_};
  if (!defined($fullname)) {   if (!defined($fullname)) {
     &Apache::lonnet::logthis("Gettign $uname $udom");  
     $fullname = &Apache::loncommon::plainname($uname,$udom);      $fullname = &Apache::loncommon::plainname($uname,$udom);
     $fullname =~s/\s/&nbsp;/g;      $fullname =~s/\s/&nbsp;/g;
     $name_cache{$_} = $fullname;      $name_cache{$_} = $fullname;
Line 935  sub show_table { Line 1263  sub show_table {
 EDITLINK  EDITLINK
   
  my $delete=(<<"DELETELINK");   my $delete=(<<"DELETELINK");
 <a href="/adm/slotrequest?command=delete&slotname=$slot">Delete</a>  <a href="/adm/slotrequest?command=delete&amp;slotname=$slot">Delete</a>
 DELETELINK  DELETELINK
   
           my $remove_all=&remove_link($slot,'remove all').'<br />';
   
         if ($ids ne '') { undef($delete); }          if ($ids ne '') { undef($delete); }
    if ($slots{$slot}{'type'} ne 'schedulable_student' 
       || $ids eq '') { 
       undef($remove_all);
    }
   
         $r->print("<tr>\n<td rowspan=\"$rowspan\">$edit $delete</td>\n");   my $row_start=&Apache::loncommon::start_data_table_row();
    my $row_end=&Apache::loncommon::end_data_table_row();
           $r->print($row_start.
     "\n<td rowspan=\"$rowspan\">$edit $delete</td>\n");
  if (exists($show{'name'})) {   if (exists($show{'name'})) {
     $colspan++;$r->print("<td>$slot</td>");      $colspan++;$r->print("<td>$slot</td>");
  }   }
Line 961  DELETELINK Line 1299  DELETELINK
  if (exists($show{'secret'})) {   if (exists($show{'secret'})) {
     $colspan++;$r->print("<td>$slots{$slot}{'secret'}</td>\n");      $colspan++;$r->print("<td>$slots{$slot}{'secret'}</td>\n");
  }   }
  if (exists($show{'maxspace'})) {   if (exists($show{'space'})) {
     $colspan++;$r->print("<td>$slots{$slot}{'maxspace'}</td>\n");      my $display = $id_count;
       if ($slots{$slot}{'maxspace'}>0) {
    $display.='/'.$slots{$slot}{'maxspace'};
    if ($slots{$slot}{'maxspace'} <= $id_count) {
       $display = '<strong>'.$display.' (full) </strong>';
    }
       }
       $colspan++;$r->print("<td>$display</td>\n");
  }   }
  if (exists($show{'ip'})) {   if (exists($show{'ip'})) {
     $colspan++;$r->print("<td>$slots{$slot}{'ip'}</td>\n");      $colspan++;$r->print("<td>$slots{$slot}{'ip'}</td>\n");
Line 970  DELETELINK Line 1315  DELETELINK
  if (exists($show{'symb'})) {   if (exists($show{'symb'})) {
     $colspan++;$r->print("<td>$title</td>\n");      $colspan++;$r->print("<td>$title</td>\n");
  }   }
    if (exists($show{'allowedsections'})) {
       $colspan++;$r->print("<td>$allowedsections</td>\n");
    }
    if (exists($show{'allowedusers'})) {
       $colspan++;$r->print("<td>$allowedusers</td>\n");
    }
  if (exists($show{'uniqueperiod'})) {   if (exists($show{'uniqueperiod'})) {
     $colspan++;$r->print("<td>$unique</td>\n");      $colspan++;$r->print("<td>$unique</td>\n");
  }   }
  if (exists($show{'scheduled'})) {   if (exists($show{'scheduled'})) {
     $colspan++;$r->print("<td>$ids</td>\n</tr>\n");      $colspan++;$r->print("<td>$remove_all $ids</td>\n");
  }   }
    $r->print("$row_end\n");
  if (exists($show{'proctor'})) {   if (exists($show{'proctor'})) {
     $r->print(<<STUFF);      $r->print(<<STUFF);
 <tr>  $row_start
  <td colspan="$colspan">$proctors</td>   <td colspan="$colspan">$proctors</td>
 </tr>  $row_end
 STUFF  STUFF
         }          }
     }      }
     $r->print('</table>');      $r->print('</table></form>');
 }  }
   
 sub upload_start {  sub upload_start {
Line 1021  sub csvuploadmap_header { Line 1373  sub csvuploadmap_header {
   
     my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');      my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
     my $ignore=&mt('Ignore First Line');      my $ignore=&mt('Ignore First Line');
    my $help_field = &Apache::loncommon::help_open_topic('Slot SelectingField');
   
     $r->print(<<ENDPICK);      $r->print(<<ENDPICK);
 <form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">  <form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">
 <h3>Identify fields</h3>  <h3>Identify fields $help_field</h3>
 Total number of records found in file: $distotal <hr />  Total number of records found in file: $distotal <hr />
 Enter as many fields as you can. The system will inform you and bring you back  Enter as many fields as you can. The system will inform you and bring you back
 to this page if the data selected is insufficient to create the slots.<hr />  to this page if the data selected is insufficient to create the slots.<hr />
Line 1156  sub csvupload_fields { Line 1510  sub csvupload_fields {
     ['maxspace','Maximum number of reservations'],      ['maxspace','Maximum number of reservations'],
     ['symb','Resource Restriction'],      ['symb','Resource Restriction'],
     ['uniqueperiod','Date range of slot exclusion'],      ['uniqueperiod','Date range of slot exclusion'],
     ['secret','Secret word proctor uses to validate']);      ['secret','Secret word proctor uses to validate'],
       ['allowedsections','Sections slot is restricted to'],
       ['allowedusers','Users slot is restricted to'],
       );
 }  }
   
 sub csv_upload_assign {  sub csv_upload_assign {
Line 1203  sub csv_upload_assign { Line 1560  sub csv_upload_assign {
  if ($entries{$fields{'endtime'}}) {   if ($entries{$fields{'endtime'}}) {
     $slot{'endtime'}=&UnixDate($entries{$fields{'endtime'}},"%s");      $slot{'endtime'}=&UnixDate($entries{$fields{'endtime'}},"%s");
  }   }
   
    # start/endtime must be defined and greater than zero
    if (!$slot{'starttime'}) {
       push(@errors,"$name not created -- Invalid start time");
       next;
    }
    if (!$slot{'endtime'}) {
       push(@errors,"$name not created -- Invalid end time");
       next;
    }
    if ($slot{'starttime'} > $slot{'endtime'}) {
       push(@errors,"$name not created -- Slot starts after it ends");
       next;
    }
   
  if ($entries{$fields{'startreserve'}}) {   if ($entries{$fields{'startreserve'}}) {
     $slot{'startreserve'}=      $slot{'startreserve'}=
  &UnixDate($entries{$fields{'startreserve'}},"%s");   &UnixDate($entries{$fields{'startreserve'}},"%s");
  }   }
    if (defined($slot{'startreserve'})
       && $slot{'startreserve'} > $slot{'starttime'}) {
       push(@errors,"$name not created -- Slot's reservation start time is after the slot's start time.");
       next;
    }
   
  foreach my $key ('ip','proctor','description','maxspace',   foreach my $key ('ip','proctor','description','maxspace',
  'secret','symb') {   'secret','symb') {
     if ($entries{$fields{$key}}) {      if ($entries{$fields{$key}}) {
  $slot{$key}=$entries{$fields{$key}};   $slot{$key}=$entries{$fields{$key}};
     }      }
  }   }
   
  if ($entries{$fields{'uniqueperiod'}}) {   if ($entries{$fields{'uniqueperiod'}}) {
     my ($start,$end)=split(',',$entries{$fields{'uniqueperiod'}});      my ($start,$end)=split(',',$entries{$fields{'uniqueperiod'}});
     my @times=(&UnixDate($start,"%s"),      my @times=(&UnixDate($start,"%s"),
        &UnixDate($end,"%s"));         &UnixDate($end,"%s"));
     $slot{'uniqueperiod'}=\@times;      $slot{'uniqueperiod'}=\@times;
  }   }
    if (defined($slot{'uniqueperiod'})
       && $slot{'uniqueperiod'}[0] > $slot{'uniqueperiod'}[1]) {
       push(@errors,"$name not created -- Slot's unique period start time is later than the unique period's end time.");
       next;
    }
   
  &Apache::lonnet::cput('slots',{$name=>\%slot},$cdom,$cname);   &Apache::lonnet::cput('slots',{$name=>\%slot},$cdom,$cname);
  $r->print('.');   $r->print('.');
Line 1227  sub csv_upload_assign { Line 1611  sub csv_upload_assign {
     }      }
     $r->print("<p>Created $countdone slots\n</p>");      $r->print("<p>Created $countdone slots\n</p>");
     foreach my $error (@errors) {      foreach my $error (@errors) {
  $r->print("<p>$error\n</p>");   $r->print("<p><span class=\"LC_warning\">$error</span></p>\n");
     }      }
     &show_table($r,$mgr);      &show_table($r,$mgr);
     return '';      return '';
Line 1258  sub handler { Line 1642  sub handler {
     } elsif ($env{'form.command'} eq 'remove_registration' && $mgr eq 'F') {      } elsif ($env{'form.command'} eq 'remove_registration' && $mgr eq 'F') {
  &remove_registration($r);   &remove_registration($r);
     } elsif ($env{'form.command'} eq 'release' && $mgr eq 'F') {      } elsif ($env{'form.command'} eq 'release' && $mgr eq 'F') {
  &release_slot($r,undef,undef,undef,$mgr);   if ($env{'form.entry'} eq 'remove all') {
       &release_all_slot($r,$mgr);
    } else {
       &release_slot($r,undef,undef,undef,$mgr);
    }
     } elsif ($env{'form.command'} eq 'delete' && $mgr eq 'F') {      } elsif ($env{'form.command'} eq 'delete' && $mgr eq 'F') {
  &delete_slot($r);   &delete_slot($r);
     } elsif ($env{'form.command'} eq 'uploadstart' && $mgr eq 'F') {      } elsif ($env{'form.command'} eq 'uploadstart' && $mgr eq 'F') {
Line 1277  sub handler { Line 1665  sub handler {
     &csv_upload_map($r);      &csv_upload_map($r);
  }   }
     } else {      } else {
  my $symb=&Apache::lonnet::unescape($env{'form.symb'});   my $symb=&unescape($env{'form.symb'});
    if (!defined($symb)) {
       &fail($r,'not_valid');
       return OK;
    }
  my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);   my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);
  my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);   my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
  if ($useslots ne 'resource') {   if ($useslots ne 'resource' 
     &fail($r,'not_valid');      && $useslots ne 'map' 
       && $useslots ne 'map_map') {
       &fail($r,'not_available');
     return OK;      return OK;
  }   }
  $env{'request.symb'}=$symb;   $env{'request.symb'}=$symb;
Line 1301  sub handler { Line 1695  sub handler {
  } elsif ($env{'form.command'} eq 'get') {   } elsif ($env{'form.command'} eq 'get') {
     &get_slot($r,$symb);      &get_slot($r,$symb);
  } elsif ($env{'form.command'} eq 'change') {   } elsif ($env{'form.command'} eq 'change') {
     if (&release_slot($r,$symb,$env{'form.releaseslot'},1)) {      if (&get_slot($r,$symb,$env{'form.releaseslot'},1)) {
  &get_slot($r,$symb);   &release_slot($r,$symb,$env{'form.releaseslot'});
     }      }
  } else {   } else {
     $r->print("<p>Unknown command: ".$env{'form.command'}."</p>");      $r->print("<p>Unknown command: ".$env{'form.command'}."</p>");

Removed from v.1.48  
changed lines
  Added in v.1.85


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