Diff for /loncom/interface/slotrequest.pm between versions 1.125.2.10.2.2 and 1.126

version 1.125.2.10.2.2, 2023/07/10 01:49:09 version 1.126, 2015/09/23 23:04:53
Line 56  sub fail { Line 56  sub fail {
 }  }
   
 sub start_page {  sub start_page {
     my ($r,$title,$brcrum,$bread_crumbs_component,$js,$mgr)=@_;      my ($r,$title,$brcrum,$js)=@_;
     my $args;      my $args;
     if (ref($brcrum) eq 'ARRAY') {      if (ref($brcrum) eq 'ARRAY') {
         $args = {bread_crumbs => $brcrum};          $args = {bread_crumbs => $brcrum};
         if ($bread_crumbs_component) {      
             $args->{bread_crumbs_component} = $bread_crumbs_component;      
         }  
     }      }
     if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) {      if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) {
         my %loaditems = (          my %loaditems = (
Line 74  sub start_page { Line 71  sub start_page {
             $args = { 'add_entries' => \%loaditems };              $args = { 'add_entries' => \%loaditems };
         }          }
     }      }
     unless (($env{'form.context'} eq 'usermanage') || (($mgr eq 'F') &&  
             (($env{'form.command'} eq 'release') ||  
              ($env{'form.command'} eq 'remove_registration')))) {  
         if ($env{'form.symb'}) {  
             my $symb=&unescape($env{'form.symb'});  
             my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb);  
             if ($resurl =~ /ext\.tool$/) {  
                 my $target;  
                 my ($marker,$exttool) = (split(m{/},$resurl))[3,4];  
                 $marker=~s/\D//g;  
                 if (($marker) && ($exttool) && ($env{'request.course.id'})) {  
                     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
                     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
                     my ($idx,$crstool,$is_tool,%toolhash,%toolsettings);  
                     if ($resurl eq "adm/$cdom/$cnum/$marker/$exttool") {  
                         my %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum);  
                         $target = $toolsettings{'target'};  
                     }  
                 }  
                 if ($target eq 'iframe') {  
                     $args->{'only_body'} = 1;  
                 }  
             }  
         }  
     }  
     $r->print(&Apache::loncommon::start_page($title,$js,$args));      $r->print(&Apache::loncommon::start_page($title,$js,$args));
 }  }
   
Line 190  $js Line 162  $js
                 var startdate = startm+"/"+startd+"/"+starty;                  var startdate = startm+"/"+startd+"/"+starty;
                 var starttime = new Date(startdate).getTime();                  var starttime = new Date(startdate).getTime();
                 starttime = starttime/1000;                  starttime = starttime/1000;
                 var starth = form.start_hour.options[form.start_hour.selectedIndex].value;  
                 if (numberRegExp.test(starth)) {  
                     starth = parseInt(starth);  
                     if (starth > 0 && starth <= 23) {  
                         starttime += 3600 * starth;  
                     }  
                 }  
                 var enddate = endm+"/"+endd+"/"+endy;                  var enddate = endm+"/"+endd+"/"+endy;
                 var endtime = new Date(enddate).getTime();                  var endtime = new Date(enddate).getTime();
                 endtime = endtime/1000;                  endtime = endtime/1000;
                 var endh = form.end_hour.options[form.end_hour.selectedIndex].value;  
                 if (numberRegExp.test(endh)) {  
                     endh = parseInt(endh);  
                     if (endh > 0 && endh <= 23) {  
                         endtime += 3600 * endh;  
                     }  
                 }  
   
                 var shown = 0;                  var shown = 0;
                 for (var i=0; i<$i; i++) {                  for (var i=0; i<$i; i++) {
                     if ((slotstart[i] >= starttime) && (slotend[i] <= endtime)) {                      if ((slotstart[i] >= starttime) && (slotend[i] <= endtime)) {
Line 396  sub get_consumed_uniqueperiods { Line 353  sub get_consumed_uniqueperiods {
         return 'error: Unable to determine current status';          return 'error: Unable to determine current status';
     }      }
     my @problems = $navmap->retrieveResources(undef,      my @problems = $navmap->retrieveResources(undef,
       sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0);        sub { $_[0]->is_problem() },1,0);
     my %used_slots;      my %used_slots;
     foreach my $problem (@problems) {      foreach my $problem (@problems) {
  my $symb = $problem->symb();   my $symb = $problem->symb();
Line 484  sub make_reservation { Line 441  sub make_reservation {
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }      }
   
     my $symb_for_db = $symb;      my $parm_symb  = $symb;
     my $parm_level = 1;      my $parm_level = 1;
     if ($use_slots eq 'map' || $use_slots eq 'map_map') {      if ($use_slots eq 'map' || $use_slots eq 'map_map') {
  my ($map) = &Apache::lonnet::decode_symb($symb);   my ($map) = &Apache::lonnet::decode_symb($symb);
  $symb_for_db = &Apache::lonnet::symbread($map);   $parm_symb = &Apache::lonnet::symbread($map);
  $parm_level = 2;   $parm_level = 2;
     }      }
   
Line 531  sub make_reservation { Line 488  sub make_reservation {
           
     my %reservation=('name'      => $env{'user.name'}.':'.$env{'user.domain'},      my %reservation=('name'      => $env{'user.name'}.':'.$env{'user.domain'},
      'timestamp' => time,       'timestamp' => time,
      'symb'      => $symb_for_db);       '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 543  sub make_reservation { Line 500  sub make_reservation {
  if ($value) {   if ($value) {
     $new_value=$value.':'.$new_value;      $new_value=$value.':'.$new_value;
  }   }
         my $result = &store_slot_parm($symb,$symb_for_db,$slot_name,$parm_level,          &store_slot_parm($symb,$slot_name,$parm_level,$new_value,$cnum,$cdom);
                                       $new_value,$cnum,$cdom,$env{'user.name'},  
                                       $env{'user.domain'},'reserve',$env{'form.context'});  
  return $wanted;   return $wanted;
     }      }
   
Line 554  sub make_reservation { Line 509  sub make_reservation {
 }  }
   
 sub store_slot_parm {  sub store_slot_parm {
     my ($symb_for_parm,$symb_for_db,$slot_name,$parm_level,$new_value,      my ($symb,$slot_name,$parm_level,$new_value,$cnum,$cdom) = @_;
         $cnum,$cdom,$uname,$udom,$action,$context,$delflag) = @_;      my $result=&Apache::lonparmset::storeparm_by_symb($symb,
                                                     '0_availablestudent',
     # store new parameter string                                                     $parm_level, $new_value,
     my $result=&Apache::lonparmset::storeparm_by_symb($symb_for_parm,                                                     'string',
                                                       '0_availablestudent',                                                     $env{'user.name'},
                                                       $parm_level,$new_value,                                                     $env{'user.domain'});
                                                       'string',$uname,$udom);  
     &Apache::lonxml::debug("hrrm $result");      &Apache::lonxml::debug("hrrm $result");
     my %storehash = (      my %storehash = (
                        symb    => $symb_for_db,                         symb    => $symb,
                        slot    => $slot_name,                         slot    => $slot_name,
                        action  => $action,                         action  => 'reserve',
                        context => $context,                         context => $env{'form.context'},
                     );                      );
   
     &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,      &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
                                $delflag,$uname,$udom,$cnum,$cdom);                                 '',$env{'user.name'},$env{'user.domain'},
                                  $cnum,$cdom);
     &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,      &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
                                $delflag,$uname,$udom,$uname,$udom);                                 1,$env{'user.name'},$env{'user.domain'},
     return $result;                                 $env{'user.name'},$env{'user.domain'});
   
       return;
 }  }
   
 sub remove_registration {  sub remove_registration {
Line 670  sub release_all_slot { Line 627  sub release_all_slot {
     &release_reservation($slot_name,$uname,$udom,      &release_reservation($slot_name,$uname,$udom,
  $consumed{$entry}{'symb'},$mgr);   $consumed{$entry}{'symb'},$mgr);
         if (!$result) {          if (!$result) {
             $r->print('<p class="LC_error">'.&mt($msg).'</p>');              $r->print('<p><span class="LC_error">'.&mt($msg).'</span></p>');
         } else {          } else {
     $r->print("<p>$msg</p>");      $r->print("<p>$msg</p>");
         }          }
Line 700  sub release_slot { Line 657  sub release_slot {
     my ($result,$msg) =      my ($result,$msg) =
  &release_reservation($slot_name,$uname,$udom,$symb,$mgr);   &release_reservation($slot_name,$uname,$udom,$symb,$mgr);
     if (!$result) {      if (!$result) {
         $r->print('<p class="LC_error">'.&mt($msg).'</p>');          $r->print('<p><span class="LC_error">'.&mt($msg).'</span></p>');
     } else {      } else {
         $r->print("<p>$msg</p>");          $r->print("<p>$msg</p>");
     }      }
Line 718  sub release_reservation { Line 675  sub release_reservation {
     my ($slot_name,$uname,$udom,$symb,$mgr) = @_;      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($slot_name,\%slot);      my $description=&get_description($slot_name,\%slot);
     my $msg;  
   
     if ($mgr ne 'F') {      if ($mgr ne 'F') {
  if ($slot{'starttime'} < time) {   if ($slot{'starttime'} < time) {
     return (0,&mt('Not allowed to release Reservation: [_1], as it has already started.',$description));      return (0,&mt('Not allowed to release Reservation: [_1], as it has already ended.',$description));
  }   }
     }      }
     my $context = $env{'form.context'};  
   
     # get navmap object      # 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;      my $navmap=Apache::lonnavmaps::navmap->new;
     if (!defined($navmap)) {      if (!defined($navmap)) {
         return (0,'error: Unable to determine current status');          return (0,'error: Unable to determine current status');
     }      }
   
     my ($cnum,$cdom)=&get_course();  
   
     # get slot reservations, check if user has reservation  
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,  
                                        "^$slot_name\0");  
   
     #  
     # If release is because of a reservation *change*, symb(s) associated with reservation  
     # being dropped may differ from the current symb.  
     #  
     # We need to get symb(s) from slot_reservations.db, and for each symb, update  
     # the value of the availablestudent parameter, at the appropriate level  
     # (as dictated by the value of the useslots parameter for the symb and user).  
     #  
     # We also delete all entries for the slot being released, for the specific user.  
     #  
   
     my $conflict;  
   
     if (($env{'form.command'} eq 'change') && ($slot_name eq $env{'form.releaseslot'}) &&  
         ($env{'form.slotname'} ne $slot_name)) {  
         my %changedto = &Apache::lonnet::get_slot($env{'form.slotname'});  
   
         # check for conflicts  
         my ($to_uniq_start,$to_uniq_end,$from_uniq_start,$from_uniq_end);  
         if (ref($changedto{'uniqueperiod'}) eq 'ARRAY') {  
             ($to_uniq_start,$to_uniq_end) = @{$changedto{'uniqueperiod'}};  
         }  
         if (ref($slot{'uniqueperiod'}) eq 'ARRAY') {  
             ($from_uniq_start,$from_uniq_end) = @{$slot{'uniqueperiod'}};  
         }  
         my $to_start = $changedto{'starttime'};  
         my $to_end = $changedto{'endtime'};  
         my $from_start = $slot{'starttime'};  
         my $from_end = $slot{'endtime'};  
   
         if (!  
              ($from_start < $to_uniq_start && $from_end < $to_uniq_start) ||  
              ($from_start > $to_uniq_end   && $from_end > $to_uniq_end  )) {  
             $conflict = 1;  
         }  
         if (!  
              ($to_start < $from_uniq_start && $to_end < $from_uniq_start) ||  
              ($to_start > $from_uniq_end   && $to_end > $from_uniq_end  )) {  
             $conflict = 1;  
         }  
   
         if ($conflict) {  
             my %symbs_for_slot;  
             my (%to_delete,%failed,%released);  
             foreach my $entry (keys(%consumed)) {  
                 if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {  
                     $symbs_for_slot{$consumed{$entry}->{'symb'}} = 1;  
                     $to_delete{$entry} = 1;  
                 }  
             }  
             if (keys(%to_delete)) {  
                 my @removals = keys(%to_delete);  
                 if (&Apache::lonnet::del('slot_reservations',\@removals,  
                                      $cdom,$cnum) eq 'ok') {  
                     foreach my $item (keys(%symbs_for_slot)) {  
                         my $result = &update_selectable($navmap,$slot_name,$item,$cdom,  
                                                         $cnum,$udom,$uname,$context);  
                         if ($result =~ /^error/) {  
                             $failed{$item} = 1;  
                         } else {  
                             $released{$item} = 1;  
                         }  
                     }  
                 }  
             }  
             if (keys(%released)) {  
                 $msg = '<span style="font-weight: bold;">'.  
                        &mt('Released Reservation: [_1]',$description).'</span>&nbsp;&nbsp;'.  
                        &mt('The following items had their reservation status change').':';  
                 my (%folders,%pages,%container,%titles);  
                 foreach my $item (keys(%released)) {  
                     my $res = $navmap->getBySymb($item);  
                     if (ref($res)) {  
                         $titles{$item} = $res->title();  
                         if ($res->is_map()) {  
                             $folders{$item}{'title'} = $titles{$item};  
                             if ($res->is_page()) {  
                                 $pages{$item}{'title'} = $titles{$item};  
                             } else {  
                                 $folders{$item}{'title'} = $titles{$item};  
                             }  
                         } else {  
                             my $mapsrc = $res->enclosing_map_src();  
                             my $map = $navmap->getResourceByUrl($mapsrc);  
                             if (ref($map)) {  
                                 if ($map->id() eq '0.0') {  
                                     $container{$mapsrc}{'title'} &mt('Top level of course');  
                                 } else {  
                                     $container{$mapsrc}{'title'} = $map->title();  
                                     if ($map->is_page()) {  
                                         $container{$mapsrc}{'page'} = 1;  
                                     }  
                                 }  
                             }  
                             $container{$mapsrc}{'resources'}{$item} = 1;  
                         }  
                     }  
                 }  
                 $msg .= '<ul>';  
                 if (keys(%folders)) {  
                     $msg .= '<li>'.&mt('Folders').': '.  
                             join(', ', map { $folders{$_}{'title'} } (sort { $folders{$b}{'title'} cmp $folders{$a}{'title'} } (keys(%folders)))).  
                             '</li>';  
                 }  
                 if (keys(%pages)) {  
                     $msg .= '<li>'.&mt('Composite Pages').': '.  
                             join(', ', map { $pages{$_}{'title'} } (sort { $pages{$b}{'title'} cmp $pages{$a}{'title'} } (keys(%pages)))).  
                             '</li>';  
                 }  
                 if (keys(%container)) {  
                     $msg .= '<li>'.&mt('Resources').':<ul>';  
                     foreach my $key (sort { $container{$b}{'title'} cmp $container{$a}{'title'} } (keys(%container))) {  
                         if (ref($container{$key}{'resources'}) eq 'HASH') {  
                             $msg .= '<li>'.  
                                     join(', ', map { $titles{$_} } (sort(keys(%{$container{$key}{'resources'}}))));  
                             if ($container{$key}{'page'}) {  
                                 $msg .= ' '.&mt('(in composite page [_1])',$container{$key}{'title'}).'</li>';  
                             } else {  
                                 $msg .= ' '.&mt('(in folder [_1])',$container{$key}{'title'}).'</li>';  
                             }  
                         }  
                     }  
                     $msg .= '</ul></li>';  
                 }  
                 $msg .= '</ul>';  
                 my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});  
                 my $subject = &mt('Reservation change: [_1]',$description);  
                 my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);  
                 $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');  
                 return (1,$msg);  
             } else {  
                 if (keys(%to_delete)) {  
                     $msg = &mt('Reservation release partially complete for [_1]',$description);  
                 } else {  
                     $msg = &mt('No entries found for this user to release for [_1].',$description);  
                 }  
                 return (0,$msg);  
             }  
         } else {  
             $msg = &mt('No conflict found; not releasing: [_1].',$description);  
             return (0,$msg);  
         }  
     }  
   
     my $map_symb;  
     my $parm_symb = $symb;  
     my $passed_resource = $navmap->getBySymb($symb);      my $passed_resource = $navmap->getBySymb($symb);
   
     # if the reservation symb is for a map get a resource in that map  
     # to check slot parameters on  
     my $parm_level = 1;  
     if (ref($passed_resource)) {      if (ref($passed_resource)) {
         if ($passed_resource->is_map()) {          if ($passed_resource->is_map()) {
     my ($a_resource) =       my ($a_resource) = 
                 $navmap->retrieveResources($passed_resource,                   $navmap->retrieveResources($passed_resource, 
                     sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1);                                             sub {$_[0]->is_problem()},0,1);
             $parm_symb = $a_resource->symb();              $symb = $a_resource->symb();
         }          }
     } else {      } else {
         unless ($mgr eq 'F') {          unless ($mgr eq 'F') {
Line 903  sub release_reservation { Line 702  sub release_reservation {
         }          }
     }      }
   
     # Get value of useslots parameter in effect for this user.      # get parameter string, check for existence, rebuild string with the slot
     # If value is map or map_map, then the parm level is 2 (i.e.,      my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
     # non-recursive enclosing map/folder level for specific user)                                         $symb,$udom,$uname);
     # and the symb for this reservation in slot_reservations.db      my @slots = split(/:/,$student);
     # will be the symb of the map itself.  
   
     my $use_slots = &Apache::lonnet::EXT('resource.0.useslots',  
                                          $parm_symb,$udom,$uname);  
     if (&Apache::lonnet::error($use_slots)) {  
         return (0,'error: Unable to determine current status');  
     }  
     if ($use_slots eq 'map' || $use_slots eq 'map_map') {  
         $parm_level = 2;  
         if ($passed_resource->is_map()) {  
             $map_symb = $passed_resource->symb();  
         } else {  
             my ($map) = &Apache::lonnet::decode_symb($symb);  
             $map_symb = &Apache::lonnet::symbread($map);  
         }  
     }  
   
     #  
     # If release is *not* because of a reservation change, i.e., this is a "drop"  
     # by a student, or a removal for a single student by an instructor then  
     # only remove one entry from slot_reservations.db, where both the user  
     # and the symb match the current context.  If useslots was set to map or  
     # map_map, then the symb to match in slot_reservations.db is the symb of  
     # the enclosing map/folder, not the symb of the resource.  
     #  
   
     my ($match,$symb_to_check);      my @new_slots;
     if ($parm_level == 2) {      foreach my $exist_slot (@slots) {
         $symb_to_check = $map_symb;   if ($exist_slot eq $slot_name) { next; }
     } else {   push(@new_slots,$exist_slot);
         $symb_to_check = $parm_symb;  
     }  
     foreach my $entry (keys(%consumed)) {  
         if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {  
             if ($consumed{$entry}->{'symb'} eq $symb_to_check) {  
                 if (&Apache::lonnet::del('slot_reservations',[$entry],  
                                          $cdom,$cnum) eq 'ok') {  
                     $match = $symb_to_check;  
                 }  
                 last;  
             }  
         }  
     }  
     if ($match) {  
         if (&update_selectable($navmap,$slot_name,$symb,$cdom,  
                                $cnum,$udom,$uname,$context) =~ /^error/) {  
             if ($mgr eq 'F') {  
                 $msg = &mt('Reservation release partially complete for: [_1]',"$uname:$udom").'<br />'.  
                        &mt('Update of availablestudent parameter for [_1] was not completed.',"$uname:$udom");  
             } else {  
                 $msg = &mt('Release partially complete for: [_1]',$description);  
             }  
             return (0,$msg);  
         } else {  
             if ($mgr eq 'F') {  
                 $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");  
             } else {  
                 $msg = '<span style="font-weight: bold;">'.&mt('Released reservation: [_1]',$description).'</span><br /><br />';  
                 my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});  
                 my $subject = &mt('Reservation change: [_1]',$description);  
                 my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);  
                 $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');  
             }  
             return (1,$msg);  
         }  
     } else {  
         $msg = &mt('Release failed for: [_1]',$description);  
         return (0,$msg);  
     }      }
 }      my $new_param = join(':',@new_slots);
   
 sub update_selectable {      my ($cnum,$cdom)=&get_course();
     my ($navmap,$slot_name,$symb,$cdom,$cnum,$udom,$uname,$context) = @_;  
     return 'error: ' unless (ref($navmap));  
     my $symb_for_parm = $symb;  
     my $passed_resource = $navmap->getBySymb($symb);  
     return 'error: invalid symb' unless (ref($passed_resource));  
   
     # if the reservation symb is for a map get a resource in that map      # get slot reservations, check if user has one, if so remove reservation
     # to check slot parameters on      my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
     if ($passed_resource->is_map()) {         "^$slot_name\0");
         my ($a_resource) =      foreach my $entry (keys(%consumed)) {
             $navmap->retrieveResources($passed_resource,   if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
                                        sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1);      &Apache::lonnet::del('slot_reservations',[$entry],
         $symb_for_parm = $a_resource->symb();   $cdom,$cnum);
               my %storehash = (
                                  symb    => $symb,
                                  slot    => $slot_name,
                                  action  => 'release',
                                  context => $env{'form.context'},
                           );
               &Apache::lonnet::write_log('slotreservationslog',\%storehash,
                                          1,$uname,$udom,$cnum,$cdom);
               &Apache::lonnet::write_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                          1,$uname,$udom,$uname,$udom);
    }
     }      }
     # get parameter string, check for existence, rebuild string with the slot  
     my $student = &Apache::lonnet::EXT('resource.0.availablestudent',  
                                        $symb_for_parm,$udom,$uname);  
   
     # Get value of useslots parameter in effect for this user.  
     # If value is map or map_map, then the parm level is 2 (i.e.,  
     # non-recursive enclosing map/folder level for specific user)  
     # and the symb for this reservation in slot_reservations.db  
     # will be the symb of the map itself.  
   
     my $use_slots = &Apache::lonnet::EXT('resource.0.useslots',      my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",
                                          $symb_for_parm,$udom,$uname);   $symb,$udom,$uname);
     &Apache::lonxml::debug("use_slots is  $use_slots<br />");      &Apache::lonxml::debug("use_slots is  $use_slots<br />");
   
     if (&Apache::lonnet::error($use_slots)) {      if (&Apache::lonnet::error($use_slots)) { 
         return 'error: Unable to determine current status';   return (0,'error: Unable to determine current status');
     }      }
   
     my $parm_level = 1;      my $parm_level = 1;
     if ($use_slots eq 'map' || $use_slots eq 'map_map') {      if ($use_slots eq 'map' || $use_slots eq 'map_map') {
         $parm_level = 2;   $parm_level = 2;
     }      }
       # store new parameter string
     my @slots = split(/:/,$student);      my $result=&Apache::lonparmset::storeparm_by_symb($symb,
         '0_availablestudent',
     my @new_slots;        $parm_level, $new_param,
     foreach my $exist_slot (@slots) {        'string', $uname, $udom);
         next if ($exist_slot eq $slot_name);      my $msg;
         push(@new_slots,$exist_slot);      if ($mgr eq 'F') {
    $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
       } else {
    $msg = '<span style="font-weight: bold;">'.&mt('Released reservation: [_1]',$description).'</span><br /><br />';
           my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
           my $subject = &mt('Reservation change: [_1]',$description);
           my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);
           $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');
     }      }
     my $new_value = join(':',@new_slots);      return (1,$msg);
   
     my $result = &store_slot_parm($symb_for_parm,$symb,$slot_name,$parm_level,  
                                   $new_value,$cnum,$cdom,$uname,$udom,'release',  
                                   $context,1);  
     return $result;  
 }  }
   
 sub delete_slot {  sub delete_slot {
Line 1050  sub delete_slot { Line 785  sub delete_slot {
  if ($ret eq 'ok') {   if ($ret eq 'ok') {
     $r->print('<p>'.&mt('Slot [_1] marked as deleted.','<tt>'.$slot_name.'</tt>').'</p>');      $r->print('<p>'.&mt('Slot [_1] marked as deleted.','<tt>'.$slot_name.'</tt>').'</p>');
  } else {   } else {
     $r->print('<p class="LC_error">'.&mt('An error occurred when attempting to delete slot: [_1]','<tt>'.$slot_name.'</tt>')." ($ret)</p>");      $r->print('<p><span class="LC_error">'.&mt('An error occurred when attempting to delete slot: [_1]','<tt>'.$slot_name.'</tt>')." ($ret)</span></p>");
  }   }
     } else {      } else {
  if (%consumed) {   if (%consumed) {
Line 1066  sub delete_slot { Line 801  sub delete_slot {
   
 sub return_link {  sub return_link {
     my ($r) = @_;      my ($r) = @_;
     my $target = &return_target();  
     if (($env{'form.command'} eq 'manageresv') || ($env{'form.context'} eq 'usermanage')) {      if (($env{'form.command'} eq 'manageresv') || ($env{'form.context'} eq 'usermanage')) {
  $r->print('<p><a href="/adm/slotrequest?command=manageresv" target="'.$target.'">'.   $r->print('<p><a href="/adm/slotrequest?command=manageresv">'.
                   &mt('Return to reservations'));                      &mt('Return to reservations'));  
     } else {      } else {
         $r->print('<p><a href="/adm/flip?postdata=return:" target="'.$target.'">'.          $r->print('<p><a href="/adm/flip?postdata=return:">'.
           &mt('Return to last resource').'</a></p>');            &mt('Return to last resource').'</a></p>');
     }      }
 }  }
   
 sub return_target {  
     my ($target,$ltitarget,$deeplinktarget);  
     if ($env{'request.lti.login'}) {  
          $ltitarget = $env{'request.lti.target'};  
     }  
     if ($env{'request.deeplink.login'}) {  
         $deeplinktarget = $env{'request.deeplink.target'};  
     }  
     if (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) {  
         $target = '_self';  
     } else {  
         $target = '_top';  
     }  
     return $target;  
 }  
   
 sub get_slot {  sub get_slot {
     my ($r,$symb,$conflictable_slot,$inhibit_return_link)=@_;      my ($r,$symb,$conflictable_slot,$inhibit_return_link)=@_;
   
Line 1099  sub get_slot { Line 817  sub get_slot {
     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 class="LC_error">'   $r->print('<p><span class="LC_error">'
                  .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)                   .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
                  .'</p>');                   .'</span></p>');
  &return_link($r);   &return_link($r);
  return 0;   return 0;
     }      }
     if ($slot_name && $slot_name ne $conflictable_slot) {      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);
         my $slottype1=$slot{'type'};  
  %slot=&Apache::lonnet::get_slot($env{'form.slotname'});   %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
  my $description2=&get_description($env{'form.slotname'},\%slot);   my $description2=&get_description($env{'form.slotname'},\%slot);
         if ($slottype1 eq 'preassigned') {   if ($slot_name ne $env{'form.slotname'}) {
             $r->print('<p>'.&mt('You already have a reservation: "[_1]", assigned by your instructor.',  
                                 $description1).'</p>'.  
                       '<p>'.&mt('Your instructor must unassign it before you can make a new reservation.').  
                       '</p>');  
         } elsif ($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'}" />
Line 1154  STUFF Line 866  STUFF
     if (defined($reserved)) {      if (defined($reserved)) {
  my $retvalue = 0;   my $retvalue = 0;
  if ($slot_name =~ /^error: (.*)/) {   if ($slot_name =~ /^error: (.*)/) {
     $r->print('<p class="LC_error">'      $r->print('<p><span class="LC_error">'
                      .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)                       .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
                      .'</p>');                       .'</span></p>');
  } elsif ($reserved > -1) {   } elsif ($reserved > -1) {
     $r->print('<p style="font-weight: bold;">'.&mt('Successfully signed up:  [_1]',$description).'</p>');      $r->print('<p style="font-weight: bold;">'.&mt('Successfully signed up:  [_1]',$description).'</p>');
     $retvalue = 1;      $retvalue = 1;
Line 1288  sub allowed_slot { Line 1000  sub allowed_slot {
     return 0 if (!$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) {          my $exclude = 1;
         unless ((ref($toskip) eq 'HASH') && ($toskip->{'symb'})) {          my ($slotmap,$slotid,$sloturl) = &Apache::lonnet::decode_symb($slot->{'symb'});
     return 0;          if ($sloturl=~/\.(page|sequence)$/) {
               my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb);
               if (($map ne '') && ($map eq $slotmap)) {
                   $exclude = 0;
               }
           } elsif ($slot->{'symb'} eq $symb) {
               $exclude = 0;
           }
           if ($exclude) {
               unless ((ref($toskip) eq 'HASH') && ($toskip->{'symb'})) {
           return 0;
               }
         }          }
     }      }
   
Line 1329  sub show_choices { Line 1052  sub show_choices {
     if (!@{$available}) {      if (!@{$available}) {
         $output = '<span class="LC_info">'.&mt('No available times.').'</span>';          $output = '<span class="LC_info">'.&mt('No available times.').'</span>';
         if ($env{'form.command'} ne 'manageresv') {          if ($env{'form.command'} ne 'manageresv') {
             my $target = &return_target();              $output .= ' <a href="/adm/flip?postdata=return:">'.
             $output .= ' <a href="/adm/flip?postdata=return:" target="'.$target.'">'.  
                        &mt('Return to last resource').'</a>';                         &mt('Return to last resource').'</a>';
         }          }
         $r->print($output);          $r->print($output);
Line 1584  sub show_table { Line 1306  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('<br />'.&Apache::loncommon::help_open_topic(
           'Slot About', &mt('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" />
Line 1593  sub show_table { Line 1319  sub show_table {
  $r->print('<form method="post" action="/adm/helper/newslot.helper">   $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 About'));   $r->print(&Apache::loncommon::help_open_topic('Slot AddInterface'));
  $r->print('</div>');   $r->print('</div>');
     }      }
   
Line 1634  sub show_table { Line 1360  sub show_table {
      'secret'          => 'Secret Word',       'secret'          => 'Secret Word',
      'space'           => '# of students/max',       'space'           => '# of students/max',
      'ip'              => 'IP or DNS restrictions',       'ip'              => 'IP or DNS restrictions',
      'symb'            => 'Resource slot is restricted to.',       'symb'            => 'Resource/Map slot is restricted to.',
      'allowedsections' => 'Sections slot is restricted to.',       'allowedsections' => 'Sections slot is restricted to.',
      'allowedusers'    => 'Users slot is restricted to.',       'allowedusers'    => 'Users slot is restricted to.',
      'uniqueperiod'    => 'Period of time slot is unique',       'uniqueperiod'    => 'Period of time slot is unique',
Line 1746  sub show_table { Line 1472  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=';
     my $tableheader = &Apache::loncommon::start_data_table().      $r->print(&Apache::loncommon::start_data_table().
                       &Apache::loncommon::start_data_table_header_row().'        &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})) {
     $tableheader .= '<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>';      $r->print('<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>');
  }   }
     }      }
     $tableheader .= &Apache::loncommon::end_data_table_header_row();      $r->print(&Apache::loncommon::end_data_table_header_row());
     my $shownheader = 0;  
   
     my %name_cache;      my %name_cache;
     my $slotsort = sub {      my $slotsort = sub {
Line 1904  sub show_table { Line 1629  sub show_table {
                                                delete => 'Delete',                                                 delete => 'Delete',
                                                slotlog => 'History',                                                 slotlog => 'History',
         );          );
         my ($edit,$delete,$showlog,$remove_all);   my $edit=(<<"EDITLINK");
         if ($mgr) {  
     $edit=(<<"EDITLINK");  
 <a href="/adm/helper/newslot.helper?name=$slot">$lt{'edit'}</a>  <a href="/adm/helper/newslot.helper?name=$slot">$lt{'edit'}</a>
 EDITLINK  EDITLINK
   
     $delete=(<<"DELETELINK");   my $delete=(<<"DELETELINK");
 <a href="/adm/slotrequest?command=delete&amp;slotname=$slot">$lt{'delete'}</a>  <a href="/adm/slotrequest?command=delete&amp;slotname=$slot">$lt{'delete'}</a>
 DELETELINK  DELETELINK
   
             $remove_all=&remove_link($slot,'remove all').'<br />';          my $showlog=(<<"LOGLINK");
   
             if ($ids eq '') {  
                 undef($remove_all);  
             } else {  
                 undef($delete);  
             }  
         }  
   
         $showlog=(<<"LOGLINK");  
 <a href="/adm/slotrequest?command=slotlog&amp;slotname=$slot">$lt{'slotlog'}</a>  <a href="/adm/slotrequest?command=slotlog&amp;slotname=$slot">$lt{'slotlog'}</a>
 LOGLINK  LOGLINK
   
           my $remove_all=&remove_link($slot,'remove all').'<br />';
   
           if ($ids eq '') {
               undef($remove_all);
           } else {
               undef($delete);
           }
  if ($slots{$slot}{'type'} ne 'schedulable_student') {   if ($slots{$slot}{'type'} ne 'schedulable_student') {
             undef($showlog);               undef($showlog); 
     undef($remove_all);      undef($remove_all);
  }   }
   
         unless ($shownheader) {  
             $r->print($tableheader);  
             $shownheader = 1;  
         }  
   
  my $row_start=&Apache::loncommon::start_data_table_row();   my $row_start=&Apache::loncommon::start_data_table_row();
  my $row_end=&Apache::loncommon::end_data_table_row();   my $row_end=&Apache::loncommon::end_data_table_row();
         $r->print($row_start.          $r->print($row_start.
Line 2005  $row_end Line 1721  $row_end
 STUFF  STUFF
         }          }
     }      }
     if ($shownheader) {      $r->print(&Apache::loncommon::end_data_table().'</form>');
         $r->print(&Apache::loncommon::end_data_table());  
     } else {  
         $r->print('<p>'.&mt('No slots meet the criteria for display').'</p>');  
     }  
     $r->print('</form>');  
     return;      return;
 }  }
   
Line 2071  sub manage_reservations { Line 1782  sub manage_reservations {
             my $symb = $resource->symb();              my $symb = $resource->symb();
             my $ressymb = $symb;              my $ressymb = $symb;
             $contents{$lastcontainer} ++;              $contents{$lastcontainer} ++;
             next if (!$resource->is_problem() && !$resource->is_tool() &&              next if (!$resource->is_problem() && !$resource->is_sequence() && 
                       !$resource->is_sequence() && !$resource->is_page());                        !$resource->is_page());
             $count ++;              $count ++;
             if (($resource->is_sequence()) || ($resource->is_page())) {              if (($resource->is_sequence()) || ($resource->is_page())) {
                 $lastcontainer = $count;                  $lastcontainer = $count;
                 $container{$lastcontainer} = $resource;                  $container{$lastcontainer} = $resource;
                 $container_title{$lastcontainer} = $resource->compTitle();                  $container_title{$lastcontainer} = $resource->compTitle();
             }              }
             if ($resource->is_problem() || $resource->is_tool()) {              if ($resource->is_problem()) {
                 my ($useslots) = $resource->slot_control();                  my ($useslots) = $resource->slot_control();
                 next if (($useslots eq '') || ($useslots =~ /^\s*no\s*$/i));                  next if (($useslots eq '') || ($useslots =~ /^\s*no\s*$/i));
                 my ($msg,$get_choices,$slotdescription);                  my ($msg,$get_choices,$slotdescription);
Line 2366  sub show_reservations { Line 2077  sub show_reservations {
     if ($showntablehdr) {      if ($showntablehdr) {
         $r->print(&Apache::loncommon::end_data_table().'<br />');          $r->print(&Apache::loncommon::end_data_table().'<br />');
         if (($curr{'page'} > 1) || ($more_records)) {          if (($curr{'page'} > 1) || ($more_records)) {
             $r->print('<p>');              $r->print('<table><tr>');
             if ($curr{'page'} > 1) {              if ($curr{'page'} > 1) {
                 $r->print('<input type="button" onclick="javascript:chgPage('."'previous'".');" value="'.                  $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
                           &mt('Previous [_1] changes',$curr{'show'}).'" />');  
             }              }
             if ($more_records) {              if ($more_records) {
                 $r->print('<input type="button" onclick="javascript:chgPage('."'next'".');" value="'.                  $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
                           &mt('Next [_1] changes',$curr{'show'}).'" />');  
             }              }
             $r->print('</p>');              $r->print('</tr></table>');
             $r->print(<<"ENDSCRIPT");              $r->print(<<"ENDSCRIPT");
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 2579  sub show_reservations_log { Line 2288  sub show_reservations_log {
     if ($showntablehdr) {      if ($showntablehdr) {
         $r->print(&Apache::loncommon::end_data_table().'<br />');          $r->print(&Apache::loncommon::end_data_table().'<br />');
         if (($curr{'page'} > 1) || ($more_records)) {          if (($curr{'page'} > 1) || ($more_records)) {
             $r->print('<p>');              $r->print('<table><tr>');
             if ($curr{'page'} > 1) {              if ($curr{'page'} > 1) {
                 $r->print('<input type="button" onclick="javascript:chgPage('."'previous'".');" value="'.                  $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
                           &mt('Previous [_1] changes',$curr{'show'}).'" />');  
             }              }
             if ($more_records) {              if ($more_records) {
                 $r->print('<input type="button" onclick="javascript:chgPage('."'next'".');" value="'.                  $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
                           &mt('Next [_1] changes',$curr{'show'}).'" />');  
             }              }
             $r->print('</p>');              $r->print('</tr></table>');
             $r->print(<<"ENDSCRIPT");              $r->print(<<"ENDSCRIPT");
 <script type="text/javascript">  <script type="text/javascript">
 function chgPage(caller) {  function chgPage(caller) {
Line 2728  sub display_filter { Line 2435  sub display_filter {
         }          }
         $output .= '</select></td>';          $output .= '</select></td>';
     }      }
     $output .= '<td>&nbsp;&nbsp;</td></tr></table>'.      $output .= '<td>&nbsp;&nbsp;</td><td valign="middle"><input type="submit" value="'.
                '<p><input type="submit" value="'.                 &mt('Update Display').'" /></tr></table>'.
                &mt('Update Display').'" /></p>'.  
                '<p class="LC_info">'.                 '<p class="LC_info">'.
                &mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'                 &mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
                   ,'2.9.0');                    ,'2.9.0');
Line 2936  sub csv_upload_map { Line 2642  sub csv_upload_map {
     if (!$env{'form.datatoken'}) {      if (!$env{'form.datatoken'}) {
  $datatoken=&Apache::loncommon::upfile_store($r);   $datatoken=&Apache::loncommon::upfile_store($r);
     } else {      } else {
         $datatoken=&Apache::loncommon::valid_datatoken($env{'form.datatoken'});   $datatoken=$env{'form.datatoken'};
         if ($datatoken ne '') {   &Apache::loncommon::load_tmp_file($r);
             &Apache::loncommon::load_tmp_file($r,$datatoken);  
         }  
     }      }
     my @records=&Apache::loncommon::upfile_record_sep();      my @records=&Apache::loncommon::upfile_record_sep();
     if ($env{'form.noFirstLine'}) { shift(@records); }      if ($env{'form.noFirstLine'}) { shift(@records); }
Line 2979  sub csvupload_fields { Line 2683  sub csvupload_fields {
     ['proctor','List of proctor ids'],      ['proctor','List of proctor ids'],
     ['description','Slot Description'],      ['description','Slot Description'],
     ['maxspace','Maximum number of reservations'],      ['maxspace','Maximum number of reservations'],
     ['symb','Resource Restriction'],      ['symb','Resource/Map 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'],      ['allowedsections','Sections slot is restricted to'],
Line 2989  sub csvupload_fields { Line 2693  sub csvupload_fields {
   
 sub csv_upload_assign {  sub csv_upload_assign {
     my ($r,$mgr)= @_;      my ($r,$mgr)= @_;
     my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'});      &Apache::loncommon::load_tmp_file($r);
     if ($datatoken ne '') {  
         &Apache::loncommon::load_tmp_file($r,$datatoken);  
     }  
     my @slotdata = &Apache::loncommon::upfile_record_sep();      my @slotdata = &Apache::loncommon::upfile_record_sep();
     if ($env{'form.noFirstLine'}) { shift(@slotdata); }      if ($env{'form.noFirstLine'}) { shift(@slotdata); }
     my %fields=&Apache::grades::get_fields();      my %fields=&Apache::grades::get_fields();
Line 3050  sub csv_upload_assign { Line 2751  sub csv_upload_assign {
  }   }
   
  if ($entries{$fields{'startreserve'}}) {   if ($entries{$fields{'startreserve'}}) {
             my $date = &UnixDate($entries{$fields{'startreserve'}},"%s");      $slot{'startreserve'}=
             if ($date eq '') {   &UnixDate($entries{$fields{'startreserve'}},"%s");
                 push(@errors,"$name -- No reservation start time set for slot -- value provided had invalid format");  
             } else {  
                 $slot{'startreserve'} = $date;  
             }  
  }   }
  if (defined($slot{'startreserve'})   if (defined($slot{'startreserve'})
     && $slot{'startreserve'} > $slot{'starttime'}) {      && $slot{'startreserve'} > $slot{'starttime'}) {
Line 3064  sub csv_upload_assign { Line 2761  sub csv_upload_assign {
  }   }
   
         if ($entries{$fields{'endreserve'}}) {          if ($entries{$fields{'endreserve'}}) {
             my $date = &UnixDate($entries{$fields{'endreserve'}},"%s");              $slot{'endreserve'}=
             if ($date eq '') {                  &UnixDate($entries{$fields{'endreserve'}},"%s");
                 push(@errors,"$name -- No reservation end time set for slot -- value provided had invalid format");  
             } else {  
                 $slot{'endreserve'} = $date;  
             }  
         }          }
         if (defined($slot{'endreserve'})          if (defined($slot{'endreserve'})
             && $slot{'endreserve'} > $slot{'starttime'}) {              && $slot{'endreserve'} > $slot{'starttime'}) {
Line 3095  sub csv_upload_assign { Line 2788  sub csv_upload_assign {
  'secret','symb') {   'secret','symb') {
     if ($entries{$fields{$key}}) {      if ($entries{$fields{$key}}) {
  $slot{$key}=$entries{$fields{$key}};   $slot{$key}=$entries{$fields{$key}};
                 if ($key eq 'maxspace') {  
                     $slot{$key} =~ s/\D+//g;  
                 }  
     }      }
  }   }
         if ($entries{$fields{'allowedusers'}}) {          if ($entries{$fields{'allowedusers'}}) {
Line 3132  sub csv_upload_assign { Line 2822  sub csv_upload_assign {
             }              }
         }          }
  if ($entries{$fields{'uniqueperiod'}}) {   if ($entries{$fields{'uniqueperiod'}}) {
             my ($start,$end)= map { &UnixDate($_,"%s"); } split(',',$entries{$fields{'uniqueperiod'}});      my ($start,$end)=split(',',$entries{$fields{'uniqueperiod'}});
             if (($start ne '') && ($end ne '')) {      my @times=(&UnixDate($start,"%s"),
                 $slot{'uniqueperiod'}=[$start,$end];         &UnixDate($end,"%s"));
             } else {      $slot{'uniqueperiod'}=\@times;
                 push(@errors,"$name -- Slot's unique period ignored -- one or both of the comma separated values for start and end had an invalid format");  
             }  
  }   }
  if (ref($slot{'uniqueperiod'}) eq 'ARRAY'    if (defined($slot{'uniqueperiod'})
     && $slot{'uniqueperiod'}[0] > $slot{'uniqueperiod'}[1]) {      && $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.");      push(@errors,"$name not created -- Slot's unique period start time is later than the unique period's end time.");
     next;      next;
Line 3200  sub handler { Line 2888  sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
   
     my %crumb_titles = &slot_command_titles();      my %crumb_titles = &slot_command_titles();
     my ($brcrum,$bread_crumbs_component);      my $brcrum;
   
     my $vgr=&Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $vgr=&Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     my $mgr=&Apache::lonnet::allowed('mgr',$env{'request.course.id'});      my $mgr=&Apache::lonnet::allowed('mgr',$env{'request.course.id'});
Line 3236  sub handler { Line 2924  sub handler {
     } elsif ($vgr eq 'F') {      } elsif ($vgr eq 'F') {
         if ($env{'form.command'} =~ /^(slotlog|showslots|uploadstart|csvuploadmap|csvuploadassign|delete|release|remove_registration)$/) {          if ($env{'form.command'} =~ /^(slotlog|showslots|uploadstart|csvuploadmap|csvuploadassign|delete|release|remove_registration)$/) {
             $brcrum =[{href=>"/adm/slotrequest?command=showslots",              $brcrum =[{href=>"/adm/slotrequest?command=showslots",
                        text=>$crumb_titles{'showslots'},                         text=>$crumb_titles{'showslots'}}];
                        help=>'Slot_Use'}];  
     $title = 'Managing Slots';      $title = 'Managing Slots';
             $bread_crumbs_component = 'Slots';  
             unless ($env{'form.command'} eq 'showslots') {              unless ($env{'form.command'} eq 'showslots') {
                 if (ref($brcrum) eq 'ARRAY') {                  if (ref($brcrum) eq 'ARRAY') {
                     push(@{$brcrum},{href=>"/adm/slotrequest?command=$env{'form.command'}",text=>$crumb_titles{$env{'form.command'}}});                      push(@{$brcrum},{href=>"/adm/slotrequest?command=$env{'form.command'}",text=>$crumb_titles{$env{'form.command'}}});
Line 3267  sub handler { Line 2953  sub handler {
     if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) {      if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) {
         $js = &reservation_js(\%slots,$consumed_uniqueperiods,$available,$got_slots,$symb);          $js = &reservation_js(\%slots,$consumed_uniqueperiods,$available,$got_slots,$symb);
     }      }
     &start_page($r,$title,$brcrum,$bread_crumbs_component,$js,$mgr);      &start_page($r,$title,$brcrum,$js);
   
     if ($env{'form.command'} eq 'manageresv') {      if ($env{'form.command'} eq 'manageresv') {
         $allavailable = $available;          $allavailable = $available;
Line 3304  sub handler { Line 2990  sub handler {
     }      }
     &csv_upload_map($r);      &csv_upload_map($r);
  }   }
     } elsif (($env{'form.command'} eq 'slotlog') && ($vgr eq 'F')) {      } elsif ($env{'form.command'} eq 'slotlog' && $mgr eq 'F') {
         &show_reservations_log($r);          &show_reservations_log($r);
     } else {      } else {
  my $symb=&unescape($env{'form.symb'});   my $symb=&unescape($env{'form.symb'});

Removed from v.1.125.2.10.2.2  
changed lines
  Added in v.1.126


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