--- loncom/interface/slotrequest.pm 2020/03/07 22:20:22 1.125.2.9
+++ loncom/interface/slotrequest.pm 2016/05/21 21:13:58 1.132
@@ -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.125.2.9 2020/03/07 22:20:22 raeburn Exp $
+# $Id: slotrequest.pm,v 1.132 2016/05/21 21:13:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -260,6 +260,103 @@ function uncheckSlotRadio() {
}
}
}
+
+function toggleSlotMap(maprownum,rownum) {
+ if (document.getElementById('arrow'+maprownum)) {
+ var img = document.getElementById('arrow'+maprownum);
+ var rowdisplay;
+ var celldisplay = '';
+ if (img.src.indexOf('arrow.open.gif')!=-1) {
+ img.src = '/adm/lonIcons/arrow.closed.gif';
+ rowdisplay = 'none';
+ }
+ else {
+ img.src = '/adm/lonIcons/arrow.open.gif';
+ rowdisplay = 'table-row';
+ celldisplay = 'none';
+ }
+ var resrows;
+ var maptext;
+ if (document.getElementsByClassName) {
+ resrows = document.getElementsByClassName('LC_slotresrow_'+maprownum);
+ maptext = document.getElementsByClassName('LC_slotmaptext_'+maprownum);
+ } else {
+ resrows = getElementsByClassName(document.body,'LC_slotresrow_'+maprownum);
+ maptext = getElementsByClassName(document.body,'LC_slotmaptext_'+maprownum);
+ }
+ if (maptext.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 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();
+ $symb = $a_resource->symb();
}
} else {
unless ($mgr eq 'F') {
@@ -875,132 +814,68 @@ sub release_reservation {
}
}
- # 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.
- #
+ # get parameter string, check for existence, rebuild string with the slot
+ my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
+ $symb,$udom,$uname);
+ my @slots = split(/:/,$student);
- 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('Release failed for: [_1]',$description);
- return (0,$msg);
+ my @new_slots;
+ foreach my $exist_slot (@slots) {
+ if ($exist_slot eq $slot_name) { next; }
+ push(@new_slots,$exist_slot);
}
-}
+ my $new_param = join(':',@new_slots);
-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));
+ my ($cnum,$cdom)=&get_course();
- # 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 slot reservations, check if user has one, if so remove 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);
+ 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',
- $symb_for_parm,$udom,$uname);
+ my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",
+ $symb,$udom,$uname);
&Apache::lonxml::debug("use_slots is $use_slots
");
- if (&Apache::lonnet::error($use_slots)) {
- return 'error: Unable to determine current status';
+ 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;
+ $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);
+ # 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 $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;
+ return (1,$msg);
}
sub delete_slot {
@@ -1022,7 +897,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'}) { + if ($slot_name ne $env{'form.slotname'}) { $r->print(<' + $r->print('
' .&mt('An error occurred while attempting to make a reservation. ([_1])',$1) - .'
'); + .''); } elsif ($reserved > -1) { $r->print(''.&mt('Successfully signed up: [_1]',$description).'
'); $retvalue = 1; @@ -1243,10 +1112,32 @@ sub allowed_slot { return 0 if (!$userallowed); # not allowed for this resource - if (defined($slot->{'symb'}) - && $slot->{'symb'} ne $symb) { - unless ((ref($toskip) eq 'HASH') && ($toskip->{'symb'})) { - return 0; + if (defined($slot->{'symb'})) { + my $exclude = 1; + my @symbs; + if ($slot->{'symb'} =~ /,/) { + @symbs = split(/\s*,\s*/,$slot->{'symb'}); + } else { + @symbs = ($slot->{'symb'}); + } + my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb); + foreach my $reqsymb (@symbs) { + next if ($reqsymb eq ''); + my ($slotmap,$slotid,$sloturl) = &Apache::lonnet::decode_symb($reqsymb); + if ($sloturl=~/\.(page|sequence)$/) { + if (($map ne '') && ($map eq $sloturl)) { + $exclude = 0; + last; + } + } elsif ($reqsymb eq $symb) { + $exclude = 0; + last; + } + } + if ($exclude) { + unless ((ref($toskip) eq 'HASH') && ($toskip->{'symb'})) { + return 0; + } } } @@ -1275,7 +1166,7 @@ sub get_description { } sub show_choices { - my ($r,$symb,$formname,$num,$slots,$consumed_uniqueperiods,$available,$got_slots)=@_; + my ($symb,$formname,$num,$class,$slots,$consumed_uniqueperiods,$available,$got_slots)=@_; my $output; &Apache::lonxml::debug("Checking Slots"); if (!ref($available) eq 'ARRAY') { @@ -1287,8 +1178,11 @@ sub show_choices { $output .= ' '. &mt('Return to last resource').''; } - $r->print($output); - return; + if ($class) { + return ''.&mt('No slots meet the criteria for display').'
'); - } - $r->print(''); + $r->print(&Apache::loncommon::end_data_table().''); return; } @@ -2006,16 +1907,19 @@ sub manage_reservations { return; } my (%parent,%shownparent,%container,%container_title,%contents); - my ($depth,$count,$reservable,$lastcontainer,$rownum) = (0,0,0,0,0); + my ($depth,$count,$reservable,$lastcontainer,$rownum,$shown) = (0,0,0,0,0,0); my @backgrounds = ("LC_odd_row","LC_even_row"); my $numcolors = scalar(@backgrounds); my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif"); my $slotheader = ''. &mt('Your reservation status for any such assignments is listed below:'). '
'. - ''. + $output{$repsymb}{'msg'}. + ' | '. + &slot_chooser($repsymb,$class,$formnum,$allavailable,$slots, + $consumed_uniqueperiods). + ' | '; + + } else { + $mapitem .= ''. + $output{$repsymb}{'msg'}. + ' | '; + } + } + my $counter = 0; + foreach my $symb (@ordered) { + if (ref($output{$symb}) eq 'HASH') { + $counter ++; + my $bgcolor = $backgrounds[($output{$symb}{'shown'} + $counter) % $numcolors]; + $currmapoutput .= $output{$symb}{'header'}. + ' '."\n"; + } + } + } else { + my $counter = 0; + foreach my $symb (@ordered) { + if (ref($output{$symb}) eq 'HASH') { + $counter ++; + my $bgcolor = $backgrounds[($output{$symb}{'shown'} + $counter) % $numcolors]; + $currmapoutput .= $output{$symb}{'header'}. + '|||||||
'.join('',@{$maprows[$i]}).' | '. + '|||||||||
'.$maprows[$i][0].
+ '![]() | '."\n";
+ }
+ }
}
+ $output{$symb}{'mapnum'} = $mapnum;
}
$rownum ++;
- my $bgcolor = $backgrounds[$rownum % $numcolors];
+ $output{$symb}{'rownum'} = $rownum;
+ $output{$symb}{'shown'} = $shown;
if (!$shownheader) {
- $r->print($slotheader);
+ $output{$symb}{'header'} = $slotheader;
$shownheader = 1;
}
- $r->print('|||||||||
'."\n"); + $output{$symb}{'info'} = ' | ';
for (my $i=0; $i<$depth; $i++) {
- $r->print('![]() | ';
+ $output{$symb}{'info'} .= '" />'.$title.''.(' ' x6).'';
+
my $hasaction;
if ($status == $resource->OPEN) {
if ($get_choices) {
$hasaction = 1;
+ $output{$symb}{'hasaction'} = $hasaction;
}
}
+ my $class = 'LC_slottext_'.$mapnum;
if ($hasaction) {
- $result .= ''.$msg.' | '. - ''; + $output{$symb}{'data'} = ' | '.$msg.' | '. + ''. + &slot_chooser($symb,$class,$reservable,$allavailable,$slots, + $consumed_uniqueperiods).' | '; } else { - $result .= ''.$msg.' | '; + $output{$symb}{'data'} = ''. + ''.$msg.''. + ' | '; } - $r->print($result); - if ($hasaction) { - my @got_slots=&check_for_reservation($symb,'allslots'); - if ($got_slots[0] =~ /^error: /) { - $r->print(''. - &mt('An error occurred determining slot availability.'). - ''); - } else { - my $formname = 'manageres_'.$reservable; - if (ref($allavailable) eq 'ARRAY') { - my @available; - if (ref($slots) eq 'HASH') { - foreach my $slot (@{$allavailable}) { - # not allowed for this resource - if (ref($slots->{$slot}) eq 'HASH') { - if ((defined($slots->{$slot}->{'symb'})) && - ($slots->{$slot}->{'symb'} ne $symb)) { - next; - } - } - push(@available,$slot); - } - } - &show_choices($r,$symb,$formname,$reservable,$slots,$consumed_uniqueperiods, - \@available,\@got_slots); - } - } - $r->print(''); - } - $r->print('';
- for (my $i=0; $i<$depth-1; $i++) {
- $output .= '![]() ![]() ![]() ![]() | '."\n"; - unshift (@{$maprows},$output); + $icon .= $title; + unshift (@{$maprows},[$spacers,$icon]); return; } +sub slot_chooser { + my ($symb,$class,$formnum,$allavailable,$slots,$consumed_uniqueperiods) = @_; + my $output; + my @got_slots=&check_for_reservation($symb,'allslots'); + if ($got_slots[0] =~ /^error: /) { + $output = ''. + &mt('An error occurred determining slot availability.'). + ''; + } else { + my $formname = 'manageres_'.$formnum; + if (ref($allavailable) eq 'ARRAY') { + my @available; + if (ref($slots) eq 'HASH') { + foreach my $slot (@{$allavailable}) { + # not allowed for this resource + if (ref($slots->{$slot}) eq 'HASH') { + if ($slots->{$slot}->{'symb'} ne '') { + my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb); + my $exclude = 1; + my @reqsymbs = split(/\s*,\s*/,$slots->{$slot}->{'symb'}); + if (@reqsymbs) { + if (grep(/^\Q$symb\E$/,@reqsymbs)) { + $exclude = 0; + } else { + foreach my $reqsymb (@reqsymbs) { + my (undef,undef,$sloturl) = &Apache::lonnet::decode_symb($reqsymb); + if ($sloturl=~/\.(page|sequence)$/) { + if (($map ne '') && ($map eq $sloturl)) { + $exclude = 0; + last; + } + } + } + } + next if ($exclude); + } + } + } + push(@available,$slot); + } + } + $output .= &show_choices($symb,$formname,$formnum,$class, + $slots,$consumed_uniqueperiods, + \@available,\@got_slots); + } + } + return $output; +} + sub show_reservations { my ($r,$uname,$udom) = @_; if (!defined($uname)) { @@ -2324,16 +2360,14 @@ sub show_reservations { if ($showntablehdr) { $r->print(&Apache::loncommon::end_data_table().' |
'.&mt('Previous [_1] changes',$curr{'show'}).' | '); } if ($more_records) { - $r->print(''); + $r->print(''.&mt('Next [_1] changes',$curr{'show'}).' | '); } - $r->print(''); + $r->print('