--- loncom/interface/slotrequest.pm 2009/08/05 13:40:10 1.100
+++ loncom/interface/slotrequest.pm 2016/10/12 14:16:09 1.133
@@ -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.100 2009/08/05 13:40:10 bisitz Exp $
+# $Id: slotrequest.pm,v 1.133 2016/10/12 14:16:09 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,12 +56,22 @@ sub fail {
}
sub start_page {
- my ($r,$title,$brcrum)=@_;
+ my ($r,$title,$brcrum,$js)=@_;
my $args;
if (ref($brcrum) eq 'ARRAY') {
$args = {bread_crumbs => $brcrum};
}
- $r->print(&Apache::loncommon::start_page($title,undef,$args));
+ 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 {
@@ -69,6 +79,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
@@ -121,7 +416,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));
@@ -137,16 +431,20 @@ sub check_for_reservation {
return 'error: Unable to determine current status';
}
my @got;
- my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%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 {
@@ -214,16 +512,19 @@ sub check_for_conflict {
if (!defined($new_slot->{'uniqueperiod'})) { return undef; }
if (!ref($consumed_uniqueperiods)) {
- $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';
- }
+ if ($consumed_uniqueperiods =~ /^error: /) {
+ return $consumed_uniqueperiods;
} else {
- return 'error: Unable to determine current status';
+ $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}};
@@ -335,12 +636,12 @@ sub store_slot_parm {
context => $env{'form.context'},
);
- &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
- '',$env{'user.name'},$env{'user.domain'},
- $cnum,$cdom);
- &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
- 1,$env{'user.name'},$env{'user.domain'},
- $env{'user.name'},$env{'user.domain'});
+ &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
+ '',$env{'user.name'},$env{'user.domain'},
+ $cnum,$cdom);
+ &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
+ 1,$env{'user.name'},$env{'user.domain'},
+ $env{'user.name'},$env{'user.domain'});
return;
}
@@ -500,14 +801,20 @@ sub release_reservation {
return (0,'error: Unable to determine current status');
}
my $passed_resource = $navmap->getBySymb($symb);
- if ($passed_resource->is_map()) {
- my ($a_resource) =
- $navmap->retrieveResources($passed_resource,
- sub {$_[0]->is_problem()},0,1);
- $symb = $a_resource->symb();
+ if (ref($passed_resource)) {
+ if ($passed_resource->is_map()) {
+ my ($a_resource) =
+ $navmap->retrieveResources($passed_resource,
+ sub {$_[0]->is_problem()},0,1);
+ $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
+ # 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);
@@ -534,10 +841,10 @@ sub release_reservation {
action => 'release',
context => $env{'form.context'},
);
- &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
- 1,$uname,$udom,$cnum,$cdom);
- &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
- 1,$uname,$udom,$uname,$udom);
+ &Apache::lonnet::write_log('slotreservationslog',\%storehash,
+ 1,$uname,$udom,$cnum,$cdom);
+ &Apache::lonnet::write_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
+ 1,$uname,$udom,$uname,$udom);
}
}
@@ -562,7 +869,11 @@ sub release_reservation {
if ($mgr eq 'F') {
$msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
} else {
- $msg = &mt('Released Reservation: [_1]',$description);
+ $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);
}
@@ -629,7 +940,6 @@ sub get_slot {
my $description1=&get_description($slot_name,\%slot);
%slot=&Apache::lonnet::get_slot($env{'form.slotname'});
my $description2=&get_description($env{'form.slotname'},\%slot);
- $r->print('
'.&mt('Already have a reservation: [_1].',$description1).'
');
if ($slot_name ne $env{'form.slotname'}) {
$r->print(<
@@ -638,19 +948,24 @@ sub get_slot {
STUFF
- $r->print('
'
- .&mt('You can either [_1]Change[_2] your reservation from [_3] to [_4] or'
- ,''
- ,''.$description1.''
- ,''.$description2.'')
- .'
'
- );
- &return_link($r);
+ $r->print('
'.&mt('Reservation currently unchanged').'
');
+ if ($slot_name ne '') {
+ $r->print('
'.&mt('To complete the transaction you [_1]must confirm[_2] you want to [_3]process the change[_4] to [_5].'
+ ,'','','','',''.$description2.'')
+ .' '
+ .&mt('Or you can choose to [_1]make no change[_2] and continue[_2] with the reservation you already had: [_3].'
+ ,'','',''.$description1.'')
+ .'
'
+ .''
+ .(' 'x3)
+ .''
+ .'
');
+ }
$r->print(<
STUFF
} else {
+ $r->print('
'.&mt('Already have a reservation: [_1].',$description1).'
');
&return_link($r);
}
return 0;
@@ -667,8 +982,15 @@ STUFF
.&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
.'');
} elsif ($reserved > -1) {
- $r->print('
'.&mt('Success: [_1]',$description).'
');
+ $r->print('
'.&mt('Successfully signed up: [_1]',$description).'
');
$retvalue = 1;
+ my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
+ my $subject = &mt('Reservation change: [_1]',$description);
+ my $msgbody = &mt('Successful reservation by [_1] for [_2].',$person,$description);
+ my $msg = &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'reserve');
+ if ($msg) {
+ $r->print($msg);
+ }
} elsif ($reserved < 0) {
$r->print('
'.&mt('Already reserved: [_1]',$description).'
');
}
@@ -677,7 +999,7 @@ STUFF
}
my %lt = &Apache::lonlocal::texthash(
- 'request' => 'Availibility list',
+ 'request' => 'Availability list',
'try' => 'Try again?',
'or' => 'or',
);
@@ -716,7 +1038,7 @@ STUFF
}
sub allowed_slot {
- my ($slot_name,$slot,$symb,$slots,$consumed_uniqueperiods)=@_;
+ my ($slot_name,$slot,$symb,$slots,$consumed_uniqueperiods,$toskip)=@_;
#already started
if ($slot->{'starttime'} < time) {
@@ -741,6 +1063,11 @@ sub allowed_slot {
if ($slot->{'startreserve'} > time) {
return 0;
}
+ # reserve time ended
+ if (($slot->{'endreserve'}) &&
+ ($slot->{'endreserve'} < time)) {
+ return 0;
+ }
&Apache::lonxml::debug("$slot_name reserve good");
my $userallowed=0;
@@ -785,9 +1112,33 @@ sub allowed_slot {
return 0 if (!$userallowed);
# not allowed for this resource
- if (defined($slot->{'symb'})
- && $slot->{'symb'} ne $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;
+ }
+ }
}
my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots,
@@ -815,76 +1166,119 @@ sub get_description {
}
sub show_choices {
- my ($r,$symb,$formname)=@_;
-
- my ($cnum,$cdom)=&get_course();
- my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
- my $consumed_uniqueperiods = &get_consumed_uniqueperiods(\%slots);
- if (ref($consumed_uniqueperiods) eq 'HASH') {
- if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {
- $r->print(''.
- &mt('An error occurred determining slot availability').
- '');
- return;
- }
- } elsif ($consumed_uniqueperiods =~ /^error: /) {
- $r->print(''.
- &mt('An error occurred determining slot availability').
- '');
- return;
- }
- my (@available,$output);
+ my ($symb,$formname,$num,$class,$slots,$consumed_uniqueperiods,$available,$got_slots)=@_;
+ my $output;
&Apache::lonxml::debug("Checking Slots");
- my @got_slots=&check_for_reservation($symb,'allslots');
- if ($got_slots[0] =~ /^error: /) {
- $r->print(''.
- &mt('An error occurred determining slot availability').
- '');
+ if (!ref($available) eq 'ARRAY') {
return;
}
- foreach my $slot (sort
- { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }
- (keys(%slots))) {
-
- &Apache::lonxml::debug("Checking Slot $slot");
- next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots,
- $consumed_uniqueperiods));
-
- push(@available,$slot);
- }
- if (!@available) {
- $output = &mt('No available times.');
+ if (!@{$available}) {
+ $output = ''.&mt('No available times.').'';
if ($env{'form.command'} ne 'manageresv') {
$output .= ' '.
&mt('Return to last resource').'';
}
- $r->print($output);
- return;
+ if ($class) {
+ return '