--- loncom/interface/slotrequest.pm 2006/04/24 23:23:02 1.58 +++ loncom/interface/slotrequest.pm 2009/08/13 10:24:29 1.102 @@ -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.102 2009/08/13 10:24:29 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; 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,12 @@ sub fail { } sub start_page { - my ($r,$title)=@_; - $r->print(&Apache::loncommon::start_page($title)); + my ($r,$title,$brcrum)=@_; + my $args; + if (ref($brcrum) eq 'ARRAY') { + $args = {bread_crumbs => $brcrum}; + } + $r->print(&Apache::loncommon::start_page($title,undef,$args)); } sub end_page { @@ -74,7 +81,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 +94,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; @@ -124,19 +131,14 @@ 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); + foreach my $slot_name (@sorted_slots) { next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); &Apache::lonxml::debug(time." $slot_name ". @@ -161,6 +163,9 @@ 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); my %used_slots; @@ -172,7 +177,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 +189,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; @@ -209,9 +215,13 @@ sub check_for_conflict { if (!ref($consumed_uniqueperiods)) { $consumed_uniqueperiods = &get_consumed_uniqueperiods($slots); - if (&network_error(%$consumed_uniqueperiods)) { - return 'error: Unable to determine current status'; - } + 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'}}; @@ -224,34 +234,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 +370,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 +387,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 +399,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 +437,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 +462,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 '.
@@ -448,9 +492,25 @@ sub release_reservation {
return (0,&mt('Not allowed to release Reservation: [_1], as it has already ended.',$description));
}
}
+
+ # if the reservation symb is for a map get a resource in that map
+ # to check slot parameters on
+ my $navmap=Apache::lonnavmaps::navmap->new;
+ if (!defined($navmap)) {
+ 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();
+ }
+
# get parameter string, check for existance, rebuild string with the slot
- my @slots = split(/:/,&Apache::lonnet::EXT("resource.0.availablestudent",
- $symb,$udom,$uname));
+ my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
+ $symb,$udom,$uname);
+ my @slots = split(/:/,$student);
my @new_slots;
foreach my $exist_slot (@slots) {
@@ -468,15 +528,36 @@ sub release_reservation {
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::instructor_log('slotreservationslog',\%storehash,
+ 1,$uname,$udom,$cnum,$cdom);
+ &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
+ 1,$uname,$udom,$uname,$udom);
}
}
+ my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",
+ $symb,$udom,$uname);
+ &Apache::lonxml::debug("use_slots is $use_slots 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,42 +602,50 @@ 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('Already have a reservation: [_1].',$description1).'
-
-or
-
");
+
+ 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;
+ }
# store new parameter string
my $result=&Apache::lonparmset::storeparm_by_symb($symb,
'0_availablestudent',
- 1, $new_param, 'string',
- $uname,$udom);
-
+ $parm_level, $new_param,
+ 'string', $uname, $udom);
my $msg;
if ($mgr eq 'F') {
$msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
@@ -503,15 +584,15 @@ sub delete_slot {
my $ret = &Apache::lonnet::cput('slots', {$slot_name => \%slot},
$cdom, $cnum);
if ($ret eq 'ok') {
- $r->print("
$form | -$description | -$description | \n"; + if ($env{'form.command'} eq 'manageresv') { + $output .= ''; + } else { + $output .= &Apache::loncommon::end_data_table_row(); + } } - - if (!$available) { - $r->print('
No available times. '. - &mt('Return to last resource').' |