--- loncom/interface/slotrequest.pm 2006/04/24 23:23:02 1.58 +++ loncom/interface/slotrequest.pm 2021/01/18 21:46:09 1.143 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler for requesting to have slots added to a students record # -# $Id: slotrequest.pm,v 1.58 2006/04/24 23:23:02 albertel Exp $ +# $Id: slotrequest.pm,v 1.143 2021/01/18 21:46:09 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,12 +36,15 @@ use Apache::lonlocal; use Apache::lonnet; use Apache::lonnavmaps(); use Date::Manip; +use lib '/home/httpd/lib/perl/'; +use LONCAPA qw(:DEFAULT :match); sub fail { my ($r,$code)=@_; if ($code eq 'not_valid') { $r->print('
'.&mt('Unable to understand what resource you wanted to sign up for.').'
'); - + } elsif ($code eq 'not_available') { + $r->print(''.&mt('No slots are available.').'
'); } elsif ($code eq 'not_allowed') { $r->print(''.&mt('Not allowed to sign up or change reservations at this time.').'
'); } else { @@ -53,8 +56,25 @@ sub fail { } sub start_page { - my ($r,$title)=@_; - $r->print(&Apache::loncommon::start_page($title)); + my ($r,$title,$brcrum,$bread_crumbs_component,$js)=@_; + my $args; + if (ref($brcrum) eq 'ARRAY') { + $args = {bread_crumbs => $brcrum}; + if ($bread_crumbs_component) { + $args->{bread_crumbs_component} = $bread_crumbs_component; + } + } + if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) { + my %loaditems = ( + onload => 'javascript:uncheckSlotRadio();', + ); + if (ref($args) eq 'HASH') { + $args->{'add_entries'} = \%loaditems; + } else { + $args = { 'add_entries' => \%loaditems }; + } + } + $r->print(&Apache::loncommon::start_page($title,$js,$args)); } sub end_page { @@ -62,6 +82,291 @@ sub end_page { $r->print(&Apache::loncommon::end_page()); } +sub reservation_js { + my ($slots,$consumed_uniqueperiods,$available,$got_slots,$symb) = @_; + return unless ((ref($slots) eq 'HASH') && (ref($available) eq 'ARRAY')); + my $toskip; + if ($symb eq '') { + $toskip = { symb => 1, }; + } + my ($i,$j) = (0,0); + my $js; + foreach my $slot (sort + { return $slots->{$a}->{'starttime'} <=> $slots->{$b}->{'starttime'} } + (keys(%{$slots}))) { + + next if (!&allowed_slot($slot,$slots->{$slot},$symb,$slots, + $consumed_uniqueperiods,$toskip)); + $js .= " slotstart[$i]='$slots->{$slot}->{'starttime'}';\n". + " slotend[$i]='$slots->{$slot}->{'endtime'}';\n". + " slotname[$i]='$slot';\n"; + if (($symb) && (ref($got_slots) eq 'ARRAY')) { + if (grep(/^\Q$slot\E$/,@{$got_slots})) { + $js .= " currslot[$j]='$slot';\n"; + $j++; + } + } + $i++; + push(@{$available},$slot); + } + if ($j) { + $js = " var currslot = new Array($j);\n\n$js"; + } + my %alerts = &Apache::lonlocal::texthash ( + none => 'No reservable time slots found', + invalid => 'Invalid date format', + ); + return <<"ENDSCRIPT"; + +ENDSCRIPT + +} + + =pod slot_reservations db @@ -74,7 +379,7 @@ sub end_page { =cut sub get_course { - (undef,my $courseid)=&Apache::lonxml::whichuser(); + (undef,my $courseid)=&Apache::lonnet::whichuser(); my $cdom=$env{'course.'.$courseid.'.domain'}; my $cnum=$env{'course.'.$courseid.'.num'}; return ($cnum,$cdom); @@ -87,7 +392,7 @@ sub get_reservation_ids { my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum, "^$slot_name\0"); - if (&network_error(%consumed)) { + if (&Apache::lonnet::error(%consumed)) { return 'error: Unable to determine current status'; } my ($tmp)=%consumed; @@ -114,7 +419,6 @@ sub check_for_reservation { my ($symb,$mode)=@_; my $student = &Apache::lonnet::EXT("resource.0.availablestudent", $symb, $env{'user.domain'}, $env{'user.name'}); - my $course = &Apache::lonnet::EXT("resource.0.available", $symb, $env{'user.domain'}, $env{'user.name'}); my @slots = (split(/:/,$student), split(/:/, $course)); @@ -124,27 +428,26 @@ sub check_for_reservation { my ($cnum,$cdom)=&get_course(); my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum); - if (&network_error($student) || &network_error($course) || - &network_error(%slots)) { + if (&Apache::lonnet::error($student) + || &Apache::lonnet::error($course) + || &Apache::lonnet::error(%slots)) { return 'error: Unable to determine current status'; } my @got; - foreach my $slot_name (sort { - if (ref($slots{$a}) && ref($slots{$b})) { - return $slots{$a}{'starttime'} <=> $slots{$b}{'starttime'} - } - if (ref($slots{$a})) { return -1;} - if (ref($slots{$b})) { return 1;} - return 0; - } @slots) { + my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); + foreach my $slot_name (@sorted_slots) { next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); &Apache::lonxml::debug(time." $slot_name ". $slots{$slot_name}->{'starttime'}." -- ". - $slots{$slot_name}->{'startreserve'}); - if ($slots{$slot_name}->{'endtime'} > time && - $slots{$slot_name}->{'startreserve'} < time) { - # between start of reservation times and end of slot + $slots{$slot_name}->{'startreserve'}." -- ". + $slots{$slot_name}->{'endreserve'}); + if (($slots{$slot_name}->{'endtime'} > time) && + ($slots{$slot_name}->{'startreserve'} < time) && + ((!$slots{$slot_name}->{'endreserve'}) || + ($slots{$slot_name}->{'endreserve'} > time))) { + # between start of reservation time and end of reservation time + # and before end of slot if ($mode eq 'allslots') { push(@got,$slot_name); } else { @@ -161,8 +464,11 @@ sub check_for_reservation { sub get_consumed_uniqueperiods { my ($slots) = @_; my $navmap=Apache::lonnavmaps::navmap->new; + if (!defined($navmap)) { + return 'error: Unable to determine current status'; + } my @problems = $navmap->retrieveResources(undef, - sub { $_[0]->is_problem() },1,0); + sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0); my %used_slots; foreach my $problem (@problems) { my $symb = $problem->symb(); @@ -172,7 +478,8 @@ sub get_consumed_uniqueperiods { my $course = &Apache::lonnet::EXT("resource.0.available", $symb, $env{'user.domain'}, $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'; } foreach my $slot (split(/:/,$student), split(/:/, $course)) { @@ -183,7 +490,7 @@ sub get_consumed_uniqueperiods { if (!ref($slots)) { my ($cnum,$cdom)=&get_course(); 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'; } $slots = \%slots; @@ -208,12 +515,19 @@ sub check_for_conflict { if (!defined($new_slot->{'uniqueperiod'})) { return undef; } if (!ref($consumed_uniqueperiods)) { - $consumed_uniqueperiods = &get_consumed_uniqueperiods($slots); - if (&network_error(%$consumed_uniqueperiods)) { - return 'error: Unable to determine current status'; - } - } - + if ($consumed_uniqueperiods =~ /^error: /) { + return $consumed_uniqueperiods; + } else { + $consumed_uniqueperiods = &get_consumed_uniqueperiods($slots); + if (ref($consumed_uniqueperiods) eq 'HASH') { + 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'}}; foreach my $slot_name (keys(%$consumed_uniqueperiods)) { my ($start,$end)=@{$consumed_uniqueperiods->{$slot_name}}; @@ -224,34 +538,37 @@ sub check_for_conflict { } } return undef; - -} - -sub network_error { - my ($result) = @_; - if ($result =~ /^(con_lost|no_such_host|error: [^2])/) { - return 1; - } - return 0; } sub make_reservation { - my ($slot_name,$slot,$symb)=@_; - - my ($cnum,$cdom)=&get_course(); + my ($slot_name,$slot,$symb,$cnum,$cdom)=@_; my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb, $env{'user.domain'},$env{'user.name'}); &Apache::lonxml::debug("value is $value".&mt('A network error has occured.').'
'); + if (&Apache::lonnet::error(%consumed)) { + $r->print("".&mt('A network error has occurred.').'
'); return; } if (!%consumed) { - $r->print("".&mt('Slot [_1] has no reservations.', - $slot_name)."
"); + $r->print(''.&mt('Slot [_1] has no reservations.', + ''.$slot_name.'').'
'); return; } @@ -336,7 +674,7 @@ sub remove_registration { my $names = join(' ',@names); my $msg = &mt('Remove all of [_1] from slot [_2]?',$names,$slot_name); - &remove_registration_confirmation($r,$msg,['entry','slotname']); + &remove_registration_confirmation($r,$msg,['entry','slotname','context']); } sub remove_registration_user { @@ -353,7 +691,7 @@ sub remove_registration_user { $name,$slot_name,$title); &remove_registration_confirmation($r,$msg,['uname','udom','slotname', - 'entry','symb']); + 'entry','symb','context']); } sub remove_registration_confirmation { @@ -365,17 +703,19 @@ sub remove_registration_confirmation { '&\'').'" />'."\n"; } - my %lt = &Apache::lonlocal::texthash('yes' => 'Yes', - 'no' => 'No',); + my %lt = &Apache::lonlocal::texthash( + 'yes' => 'Yes', + 'no' => 'No', + ); $r->print(<<"END_CONFIRM");$msg
- - @@ -401,7 +741,11 @@ sub release_all_slot { my ($result,$msg) = &release_reservation($slot_name,$uname,$udom, $consumed{$entry}{'symb'},$mgr); - $r->print("$msg
"); + if (!$result) { + $r->print(''.&mt($msg).'
'); + } else { + $r->print("$msg
"); + } $r->rflush(); } $r->print(''.
@@ -422,12 +766,16 @@ sub release_slot {
if ($mgr eq 'F'
&& defined($env{'form.symb'})) {
- $symb = $env{'form.symb'};
+ $symb = &unescape($env{'form.symb'});
}
my ($result,$msg) =
&release_reservation($slot_name,$uname,$udom,$symb,$mgr);
- $r->print(" $msg '.&mt($msg).' $msg '.
@@ -442,48 +790,317 @@ sub release_reservation {
my ($slot_name,$uname,$udom,$symb,$mgr) = @_;
my %slot=&Apache::lonnet::get_slot($slot_name);
my $description=&get_description($slot_name,\%slot);
+ my $msg;
if ($mgr ne 'F') {
if ($slot{'starttime'} < time) {
- return (0,&mt('Not allowed to release Reservation: [_1], as it has already ended.',$description));
+ return (0,&mt('Not allowed to release Reservation: [_1], as it has already started.',$description));
}
}
- # get parameter string, check for existance, rebuild string with the slot
- my @slots = split(/:/,&Apache::lonnet::EXT("resource.0.availablestudent",
- $symb,$udom,$uname));
+ my $context = $env{'form.context'};
- my @new_slots;
- foreach my $exist_slot (@slots) {
- if ($exist_slot eq $slot_name) { next; }
- push(@new_slots,$exist_slot);
+ # get navmap object
+ my $navmap=Apache::lonnavmaps::navmap->new;
+ if (!defined($navmap)) {
+ return (0,'error: Unable to determine current status');
}
- 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 reservation
my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
- "^$slot_name\0");
- foreach my $entry (keys(%consumed)) {
- if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
- &Apache::lonnet::del('slot_reservations',[$entry],
- $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 = ''.
+ &mt('Released Reservation: [_1]',$description).' '.
+ &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 .= ' Slot $slot_name marked as deleted. '.&mt('Slot [_1] marked as deleted.',''.$slot_name.'').' An error ($ret) occurse when attempting to delete Slot $slot_name. '.&mt('An error occurred when attempting to delete slot: [_1]',''.$slot_name.'')." ($ret) Slot $slot_name has active reservations. '.&mt('Slot [_1] has active reservations.',''.$slot_name.'').' Slot $slot_name does not exist. '.&mt('Slot [_1] does not exist.',''.$slot_name.'').' '.
@@ -521,103 +1138,142 @@ sub delete_slot {
sub return_link {
my ($r) = @_;
- $r->print(' '.
- &mt('Return to last resource').' '.
+ &mt('Return to reservations'));
+ } else {
+ $r->print(' '.
+ &mt('Return to last resource').' An error occured while attempting to make a reservation. ($1) '
+ .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
+ .' Already have a reservation: $description1 '.&mt('You already have a reservation: "[_1]", assigned by your instructor.',
+ $description1).' '.&mt('Your instructor must unassign it before you can make a new reservation.').
+ '
-
-or
-';
+ if (keys(%folders)) {
+ $msg .= '
';
+ }
+ $msg .= '';
+ 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);
+ }
}
- # store new parameter string
- my $result=&Apache::lonparmset::storeparm_by_symb($symb,
- '0_availablestudent',
- 1, $new_param, 'string',
- $uname,$udom);
+ my $map_symb;
+ my $parm_symb = $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 ($passed_resource->is_map()) {
+ my ($a_resource) =
+ $navmap->retrieveResources($passed_resource,
+ sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1);
+ $parm_symb = $a_resource->symb();
+ }
+ } else {
+ unless ($mgr eq 'F') {
+ return (0,'error: Unable to determine current status');
+ }
+ }
- my $msg;
- if ($mgr eq 'F') {
- $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
+ # 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',
+ $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);
+ if ($parm_level == 2) {
+ $symb_to_check = $map_symb;
+ } else {
+ $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").'';
+ foreach my $key (sort { $container{$b}{'title'} cmp $container{$a}{'title'} } (keys(%container))) {
+ if (ref($container{$key}{'resources'}) eq 'HASH') {
+ $msg .= '
'.
+ &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 = ''.&mt('Released reservation: [_1]',$description).'
';
+ 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('Released Reservation: [_1]',$description);
+ $msg = &mt('Release failed for: [_1]',$description);
+ return (0,$msg);
}
- return (1,$msg);
+}
+
+sub update_selectable {
+ 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
+ # to check slot parameters on
+ if ($passed_resource->is_map()) {
+ my ($a_resource) =
+ $navmap->retrieveResources($passed_resource,
+ sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1);
+ $symb_for_parm = $a_resource->symb();
+ }
+ # 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',
+ $symb_for_parm,$udom,$uname);
+ &Apache::lonxml::debug("use_slots is $use_slots
");
+
+ if (&Apache::lonnet::error($use_slots)) {
+ return 'error: Unable to determine current status';
+ }
+
+ my $parm_level = 1;
+ if ($use_slots eq 'map' || $use_slots eq 'map_map') {
+ $parm_level = 2;
+ }
+
+ my @slots = split(/:/,$student);
+
+ my @new_slots;
+ foreach my $exist_slot (@slots) {
+ next if ($exist_slot eq $slot_name);
+ push(@new_slots,$exist_slot);
+ }
+ my $new_value = join(':',@new_slots);
+
+ 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 {
@@ -503,15 +1120,15 @@ sub delete_slot {
my $ret = &Apache::lonnet::cput('slots', {$slot_name => \%slot},
$cdom, $cnum);
if ($ret eq 'ok') {
- $r->print("
' + .&mt('No slots have been created in this '.lc($crstype).'.') + .'
' + ); + return; + } my %Saveable_Parameters = ('show' => 'array', 'when' => 'scalar', @@ -894,18 +1711,26 @@ sub show_table { 'starttime' => 'Start time', 'endtime' => 'End Time', 'startreserve' => 'Time students can start reserving', + 'endreserve' => 'Time students can no longer reserve', + 'reservationmsg' => 'Message triggered by reservation', 'secret' => 'Secret Word', - 'maxspace' => 'Maximum # of students', + 'space' => '# of students/max', 'ip' => 'IP or DNS restrictions', - 'symb' => 'Resource slot is restricted to.', + 'symb' => 'Resource(s)/Map(s) slot is restricted to.', 'allowedsections' => 'Sections slot is restricted to.', 'allowedusers' => 'Users slot is restricted to.', 'uniqueperiod' => 'Period of time slot is unique', 'scheduled' => 'Scheduled Students', - 'proctor' => 'List of proctors'); + 'proctor' => 'List of proctors', + 'iptied' => 'Unique IP each student',); + if ($crstype eq 'Community') { + $show_fields{'startreserve'} = &mt('Time members can start reserving'); + $show_fields{'endreserve'} = &mt('Time members can no longer reserve'); + $show_fields{'scheduled'} = &mt('Scheduled Members'); + } my @show_order=('name','description','type','starttime','endtime', - 'startreserve','secret','maxspace','ip','symb', - 'allowedsections','allowedusers','uniqueperiod', + 'startreserve','endreserve','reservationmsg','secret','space', + 'ip','iptied','symb','allowedsections','allowedusers','uniqueperiod', 'scheduled','proctor'); my @show = (exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show') @@ -952,13 +1777,16 @@ sub show_table { 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 = &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'hide'); my $show_radio = &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'show'); - $r->print('