--- loncom/interface/slotrequest.pm 2015/05/10 03:58:12 1.122
+++ loncom/interface/slotrequest.pm 2021/01/18 21:58:57 1.125.2.10
@@ -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.122 2015/05/10 03:58:12 raeburn Exp $
+# $Id: slotrequest.pm,v 1.125.2.10 2021/01/18 21:58:57 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -37,7 +37,7 @@ use Apache::lonnet;
use Apache::lonnavmaps();
use Date::Manip;
use lib '/home/httpd/lib/perl/';
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
sub fail {
my ($r,$code)=@_;
@@ -56,10 +56,13 @@ sub fail {
}
sub start_page {
- my ($r,$title,$brcrum,$js)=@_;
+ 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 = (
@@ -162,9 +165,24 @@ $js
var startdate = startm+"/"+startd+"/"+starty;
var starttime = new Date(startdate).getTime();
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 endtime = new Date(enddate).getTime();
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;
for (var i=0; i<$i; i++) {
if ((slotstart[i] >= starttime) && (slotend[i] <= endtime)) {
@@ -237,7 +255,7 @@ function uncheckSlotRadio() {
if (document.getElementsByClassName) {
slotpicks = document.getElementsByClassName('LC_slotpick_radio');
} else {
- sloctpicks = getElementsByClassName(document.body,'LC_slotpick_radio');
+ slotpicks = getElementsByClassName(document.body,'LC_slotpick_radio');
}
if (slotpicks.length) {
for (var i=0; i '.&mt($msg).' '.&mt($msg).' $msg '.&mt($msg).' '.&mt($msg).' $msg '.&mt('Slot [_1] marked as deleted.',''.$slot_name.'').' '.&mt('An error occurred when attempting to delete slot: [_1]',''.$slot_name.'')." ($ret) '.&mt('An error occurred when attempting to delete slot: [_1]',''.$slot_name.'')." ($ret) '
+ $r->print(' '
.&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
- .'';
+ 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);
+ }
+ }
+
+ my $map_symb;
+ my $parm_symb = $symb;
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();
+
+ # 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,1);
+ $parm_symb = $a_resource->symb();
+ }
+ } else {
+ unless ($mgr eq 'F') {
+ return (0,'error: Unable to determine current status');
+ }
}
- # get parameter string, check for existance, rebuild string with the slot
- my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
- $symb,$udom,$uname);
- my @slots = split(/:/,$student);
+ # 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 @new_slots;
- foreach my $exist_slot (@slots) {
- if ($exist_slot eq $slot_name) { next; }
- push(@new_slots,$exist_slot);
+ 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);
+ }
}
- my $new_param = join(':',@new_slots);
- my ($cnum,$cdom)=&get_course();
+ #
+ # 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.
+ #
- # get slot reservations, check if user has one, if so remove reservation
- my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
- "^$slot_name\0");
+ 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) ) {
- &Apache::lonnet::del('slot_reservations',[$entry],
- $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);
- }
+ 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('Release failed for: [_1]',$description);
+ return (0,$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,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,$udom,$uname);
+ 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 (0,'error: Unable to determine current status');
+ 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;
+ $parm_level = 2;
}
- # store new parameter string
- my $result=&Apache::lonparmset::storeparm_by_symb($symb,
- '0_availablestudent',
- $parm_level, $new_param,
- 'string', $uname, $udom);
- my $msg;
- 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');
+
+ my @slots = split(/:/,$student);
+
+ my @new_slots;
+ foreach my $exist_slot (@slots) {
+ next if ($exist_slot eq $slot_name);
+ push(@new_slots,$exist_slot);
}
- return (1,$msg);
+ 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 {
@@ -779,7 +1025,7 @@ sub delete_slot {
if ($ret eq 'ok') {
$r->print('
'.&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.'). + '
'); + } elsif ($slot_name ne $env{'form.slotname'}) { $r->print(<'
+ $r->print(' '
.&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
- .'
'.&mt('Successfully signed up: [_1]',$description).'
'); $retvalue = 1; @@ -1289,10 +1541,6 @@ sub show_table { } my $available; if ($mgr eq 'F') { - # FIXME: This line should be deleted once Slots uses breadcrumbs - $r->print(''.&mt('No slots meet the criteria for display').'
'); + } + $r->print(''); return; } @@ -2060,14 +2323,16 @@ sub show_reservations { if ($showntablehdr) { $r->print(&Apache::loncommon::end_data_table().''.&mt('Previous [_1] changes',$curr{'show'}).' | '); + $r->print(''); } if ($more_records) { - $r->print(''.&mt('Next [_1] changes',$curr{'show'}).' | '); + $r->print(''); } - $r->print('