--- loncom/interface/slotrequest.pm 2009/08/05 13:40:10 1.100
+++ loncom/interface/slotrequest.pm 2011/12/18 17:15:03 1.111
@@ -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.111 2011/12/18 17:15:03 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -143,10 +143,14 @@ sub check_for_reservation {
!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 {
@@ -562,7 +566,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 +637,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(<'
- .&mt('You can either [_1]Change[_2] your reservation from [_3] to [_4] or'
- ,''
- ,''.$description1.''
- ,''.$description2.'')
- .'
'.&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(<'.&mt('Already have a reservation: [_1].',$description1).'
'); &return_link($r); } return 0; @@ -667,8 +679,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).'
'); } @@ -741,6 +760,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; @@ -847,7 +871,7 @@ sub show_choices { (keys(%slots))) { &Apache::lonxml::debug("Checking Slot $slot"); - next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots, + next if (!&allowed_slot($slot,$slots{$slot},$symb,\%slots, $consumed_uniqueperiods)); push(@available,$slot); @@ -1026,6 +1050,7 @@ sub show_table { my ($r,$mgr)=@_; my ($cnum,$cdom)=&get_course(); + my $crstype=&Apache::loncommon::course_type($cdom.'_'.$cnum); my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum); if ( (keys(%slots))[0] =~ /^error: 2 /) { undef(%slots); @@ -1049,7 +1074,11 @@ sub show_table { } if (!keys(%slots)) { - $r->print(''
.&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.')
.'
'
.&mt('One example is for management of laboratory space, which is only available at certain times, and has a limited number of seats.')
- .'
' - .&mt('Your reservation status for any such assignments is listed below:') .'
' ); if (!defined($navmap)) { - $r->print(''."\n"); for (my $i=0; $i<$depth; $i++) { $r->print(''); @@ -1585,11 +1646,19 @@ sub manage_reservations { } } } + if ($shownheader) { + $r->print(' |
'.
+ $r->print(' '.
&mt('Reservation History').'
Enter as many fields as you can. The system will inform you and bring you back
to this page if the data selected is insufficient to create the slots.
-
+
@@ -2129,7 +2264,7 @@ sub csvuploadmap_footer {
-
+
ENDPICK
}
@@ -2228,6 +2363,8 @@ sub csvupload_fields {
['starttime','Start Time of slot'],
['endtime','End Time of slot'],
['startreserve','Reservation Start Time'],
+ ['endreserve','Reservation End Time'],
+ ['reservationmsg','Message when reservation changed'],
['ip','IP or DNS restriction'],
['proctor','List of proctor ids'],
['description','Slot Description'],
@@ -2309,6 +2446,30 @@ sub csv_upload_assign {
next;
}
+ if ($entries{$fields{'endreserve'}}) {
+ $slot{'endreserve'}=
+ &UnixDate($entries{$fields{'endreserve'}},"%s");
+ }
+ if (defined($slot{'endreserve'})
+ && $slot{'endreserve'} > $slot{'starttime'}) {
+ push(@errors,"$name not created -- Slot's reservation end time is after the slot's start time.");
+ next;
+ }
+
+ if ($slot{'type'} eq 'schedulable_student') {
+ if ($entries{$fields{'reservationmsg'}}) {
+ if (($entries{$fields{'reservationmsg'}} eq 'only_student') ||
+ ($entries{$fields{'reservationmsg'}} eq 'student_and_user_notes_screen')) {
+ $slot{'reservationmsg'}=$entries{$fields{'reservationmsg'}};
+ } else {
+ unless (($entries{$fields{'reservationmsg'}} eq 'none') ||
+ ($entries{$fields{'reservationmsg'}} eq '')) {
+ push(@errors,"$name -- Slot's reservationmsg setting ignored - not one of: 'only_student', 'student_and_user_notes_screen', 'none' or ''");
+ }
+ }
+ }
+ }
+
foreach my $key ('ip','proctor','description','maxspace',
'secret','symb') {
if ($entries{$fields{$key}}) {
@@ -2358,6 +2519,15 @@ sub slot_command_titles {
return %titles;
}
+sub slot_reservationmsg_options {
+ my %options = &Apache::lonlocal::texthash (
+ only_student => 'Sent to student',
+ student_and_user_notes_screen => 'Sent to student and added to user notes',
+ none => 'None sent and no record in user notes',
+ );
+ return %options;
+}
+
sub handler {
my $r=shift;
@@ -2487,7 +2657,26 @@ sub handler {
} elsif ($env{'form.command'} eq 'get') {
&get_slot($r,$symb);
} elsif ($env{'form.command'} eq 'change') {
- if (&get_slot($r,$symb,$env{'form.releaseslot'},1)) {
+ if ($env{'form.nochange'}) {
+ my $slot_name = $env{'form.releaseslot'};
+ my @slots = &check_for_reservation($symb,'allslots');
+ my $msg;
+ if (($slot_name ne '') && (grep(/^\Q$slot_name\E/,@slots))) {
+ my %slot=&Apache::lonnet::get_slot($env{'form.releaseslot'});
+ my $description=&get_description($slot_name,\%slot);
+ $msg = ''.
+ &mt('Unchanged reservation: [_1]',$description).'
';
+ my $person =
+ &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
+ my $subject = &mt('Reservation unchanged: [_1]',$description);
+ my $msgbody = &mt('No change to existing registration by [_1] for [_2].',$person,$description);
+ $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'nochange');
+ } else {
+ $msg = ''.&mt('Reservation no longer reported as available.').'';
+ }
+ $r->print($msg);
+ &return_link($r);
+ } elsif (&get_slot($r,$symb,$env{'form.releaseslot'},1)) {
&release_slot($r,$symb,$env{'form.releaseslot'});
}
} else {