--- loncom/interface/slotrequest.pm 2006/02/03 17:07:20 1.39 +++ loncom/interface/slotrequest.pm 2006/02/09 17:59:57 1.46 @@ -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.39 2006/02/03 17:07:20 albertel Exp $ +# $Id: slotrequest.pm,v 1.46 2006/02/09 17:59:57 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,8 +47,7 @@ sub fail { $r->print('<p>'.&mt('Failed.').'</p>'); } - $r->print('<p><a href="/adm/flip?postdata=return:">'. - &mt('Return to last resource').'</a></p>'); + &return_link($r); &end_page($r); } @@ -89,7 +88,9 @@ sub get_reservation_ids { my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum, "^$slot_name\0"); - + if (&network_error(%consumed)) { + return 'error: Unable to determine current status'; + } my ($tmp)=%consumed; if ($tmp=~/^error: 2 / ) { return 0; @@ -111,7 +112,7 @@ sub space_available { } sub check_for_reservation { - my ($symb)=@_; + my ($symb,$mode)=@_; my $student = &Apache::lonnet::EXT("resource.0.availablestudent", $symb, $env{'user.domain'}, $env{'user.name'}); @@ -124,7 +125,19 @@ sub check_for_reservation { my ($cnum,$cdom)=&get_course(); my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum); - foreach my $slot_name (@slots) { + if (&network_error($student) || &network_error($course) || + &network_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) { next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); &Apache::lonxml::debug(time." $slot_name ". @@ -133,29 +146,51 @@ sub check_for_reservation { if ($slots{$slot_name}->{'endtime'} > time && $slots{$slot_name}->{'startreserve'} < time) { # between start of reservation times and end of slot - return($slot_name, $slots{$slot_name}); + if ($mode eq 'allslots') { + push(@got,$slot_name); + } else { + return($slot_name, $slots{$slot_name}); + } } } + if ($mode eq 'allslots' && @got) { + return @got; + } return (undef,undef); } sub check_for_conflict { - my ($symb,$new_slot_name)=@_; + my ($symb,$new_slot_name,$new_slot,$slots)=@_; + + if (!defined($new_slot->{'uniqueperiod'})) { return undef; } + 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 $course = &Apache::lonnet::EXT("resource.0.available", $symb, + $env{'user.domain'}, $env{'user.name'}); my @slots = (split(/:/,$student), split(/:/, $course)); my ($cnum,$cdom)=&get_course(); - my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum); + if (!ref($slots)) { + my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum); + $slots = \%slots; + } + + if (&network_error($student) || &network_error($course) || + &network_error(%$slots)) { + return 'error: Unable to determine current status'; + } + + my ($new_uniq_start,$new_uniq_end) = @{$new_slot->{'uniqueperiod'}}; foreach my $slot_name (@slots) { - next if (!defined($slots{$slot_name}) || - !ref($slots{$slot_name})); + next if (!defined($slots->{$slot_name}) || + !ref($slots->{$slot_name})); - next if (!defined($slots{$slot_name}->{'uniqueperiod'}) || - !ref($slots{$slot_name}->{'uniqueperiod'})); - my ($start,$end)=@{$slots{$slot_name}->{'uniqueperiod'}}; - if ($start<time && time < $end) { + next if (!defined($slots->{$slot_name}{'uniqueperiod'}) || + !ref($slots->{$slot_name}{'uniqueperiod'})); + my ($start,$end)=@{$slots->{$slot_name}{'uniqueperiod'}}; + if (! + ($start < $new_uniq_start && $end < $new_uniq_start) || + ($start > $new_uniq_end && $end > $new_uniq_end )) { return $slot_name; } } @@ -163,6 +198,14 @@ sub check_for_conflict { } +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)=@_; @@ -171,11 +214,17 @@ sub make_reservation { my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb, $env{'user.domain'},$env{'user.name'}); &Apache::lonxml::debug("value is $value<br />"); + if (&network_error($value)) { + return 'error: Unable to determine current status'; + } + foreach my $other_slot (split(/:/, $value)) { if ($other_slot eq $slot_name) { my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom, $cnum, "^$slot_name\0"); - + if (&network_error($value)) { + return 'error: Unable to determine current status'; + } my $me=$env{'user.name'}.'@'.$env{'user.domain'}; foreach my $key (keys(%consumed)) { if ($consumed{$key}->{'name'} eq $me) { @@ -190,7 +239,9 @@ sub make_reservation { if (!defined($max)) { $max=99999; } my (@ids)=&get_reservation_ids($slot_name); - + if (&network_error(@ids)) { + return 'error: Unable to determine current status'; + } my $last=0; foreach my $id (@ids) { my $num=(split('\0',$id))[1]; @@ -279,10 +330,9 @@ sub release_slot { my $description=&get_description($env{'form.slotname'},\%slot); if ($mgr ne 'F') { - if ($slot{$slot_name}{'starttime'} < time) { - $r->print("<p>Not allowed to release Reservation: $description, as it has already ended.</p>"); - $r->print('<p><a href="/adm/flip?postdata=return:">'. - &mt('Return to last resource').'</a></p>'); + if ($slot{'starttime'} < time) { + $r->print("<p>Not allowed to release Reservation: $description, as it has already ended. </p>"); + &return_link($r); return 0; } } @@ -312,16 +362,12 @@ sub release_slot { '0_availablestudent', 1, $new_param, 'string', $uname,$udom); - my $description=&get_description($env{'form.slotname'},\%slot); $r->print("<p>Released Reservation: $description</p>"); if ($mgr eq 'F') { $r->print('<p><a href="/adm/slotrequest?command=showslots">'. &mt('Return to slot list').'</a></p>'); } - if (!$inhibit_return_link) { - $r->print('<p><a href="/adm/flip?postdata=return:">'. - &mt('Return to last resource').'</a></p>'); - } + if (!$inhibit_return_link) { &return_link($r); } return 1; } @@ -355,6 +401,11 @@ sub delete_slot { } $r->print('<p><a href="/adm/slotrequest?command=showslots">'. &mt('Return to slot list').'</a></p>'); + &return_link($r); +} + +sub return_link { + my ($r) = @_; $r->print('<p><a href="/adm/flip?postdata=return:">'. &mt('Return to last resource').'</a></p>'); } @@ -362,7 +413,14 @@ sub delete_slot { sub get_slot { my ($r,$symb)=@_; - my $slot_name=&check_for_conflict($symb,$env{'form.slotname'}); + my %slot=&Apache::lonnet::get_slot($env{'form.slotname'}); + my $slot_name=&check_for_conflict($symb,$env{'form.slotname'},\%slot); + + if ($slot_name =~ /^error: (.*)/) { + $r->print("<p>An error occured while attempting to make a reservation. ($1)</p>"); + &return_link($r); + return; + } if ($slot_name) { my %slot=&Apache::lonnet::get_slot($slot_name); my $description1=&get_description($slot_name,\%slot); @@ -383,33 +441,30 @@ STUFF STUFF $r->print(' your reservation from <b>'.$description1.'</b> to <b>'. $description2. - '</b> <br />or <a href="/adm/flip?postdata=return:">'. - &mt('Return to last resource').'</a></p>'); + '</b> <br />or </p>'); + &return_link($r); $r->print(<<STUFF); </form> STUFF } else { - $r->print('<p><a href="/adm/flip?postdata=return:">'. - &mt('Return to last resource').'</a></p>'); + &return_link($r); } return; } - my %slot=&Apache::lonnet::get_slot($env{'form.slotname'}); + my $reserved=&make_reservation($env{'form.slotname'}, \%slot,$symb); my $description=&get_description($env{'form.slotname'},\%slot); if (defined($reserved)) { - if ($reserved > -1) { + if ($slot_name =~ /^error: (.*)/) { + $r->print("<p>An error occured while attempting to make a reservation. ($1)</p>"); + } elsif ($reserved > -1) { $r->print("<p>Success: $description</p>"); - $r->print('<p><a href="/adm/flip?postdata=return:">'. - &mt('Return to last resource').'</a></p>'); - return; } elsif ($reserved < 0) { $r->print("<p>Already reserved: $description</p>"); - $r->print('<p><a href="/adm/flip?postdata=return:">'. - &mt('Return to last resource').'</a></p>'); - return; } + &return_link($r); + return; } my %lt=('request'=>"Availibility list", @@ -436,13 +491,13 @@ or </p> or STUFF - $r->print('<p><a href="/adm/flip?postdata=return:">'. - &mt('Return to last resource').'</a></p>'); + + &return_link($r); return; } sub allowed_slot { - my ($slot_name,$slot,$symb)=@_; + my ($slot_name,$slot,$symb,$slots)=@_; #already started if ($slot->{'starttime'} < time) { # all open slot to be schedulable @@ -465,6 +520,12 @@ sub allowed_slot { && $slot->{'symb'} ne $symb) { return 0; } + my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots); + if ($conflict) { + if ($slots->{$conflict}{'starttime'} < time) { + return 0; + } + } &Apache::lonxml::debug("$slot_name symb good"); return 1; } @@ -488,26 +549,33 @@ sub show_choices { my $available; $r->print('<table border="1">'); &Apache::lonxml::debug("Checking Slots"); - my ($got_slot)=&check_for_reservation($symb); + my @got_slots=&check_for_reservation($symb,'allslots'); 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})); + next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots)); $available++; my $description=&get_description($slot,$slots{$slot}); my $form=&mt('Unavailable'); - if (($slot eq $got_slot) || + if ((grep(/^\Q$slot\E$/,@got_slots)) || &space_available($slot,$slots{$slot},$symb)) { my $text=&mt('Select'); my $command='get'; - if ($slot eq $got_slot) { + if (grep(/^\Q$slot\E$/,@got_slots)) { $text=&mt('Free Reservation'); $command='release'; + } else { + my $conflict = &check_for_conflict($symb,$slot,$slots{$slot}, + \%slots); + if ($conflict) { + $text=&mt('Change Reservation'); + $command='get'; + } } my $escsymb=&Apache::lonnet::escape($symb); $form=<<STUFF; @@ -626,8 +694,13 @@ sub show_table { 'order' => 'scalar', 'deleted' => 'scalar', ); - &Apache::loncommon::store_course_settings('slotrequest',\%Saveable_Parameters); - &Apache::loncommon::restore_course_settings('slotrequest',\%Saveable_Parameters); + &Apache::loncommon::store_course_settings('slotrequest', + \%Saveable_Parameters); + &Apache::loncommon::restore_course_settings('slotrequest', + \%Saveable_Parameters); + &Apache::grades::init_perm(); + my ($classlist,$section,$fullname)=&Apache::grades::getclasslist('all'); + &Apache::grades::reset_perm(); my %show_fields=&Apache::lonlocal::texthash( 'name' => 'Slot Name', @@ -663,6 +736,16 @@ sub show_table { my $when = (exists($env{'form.when'})) ? $env{'form.when'} : 'now'; + my %stu_display_fields= + &Apache::lonlocal::texthash('username' => 'User name', + 'fullname' => 'Full name', + ); + my @stu_display_order=('fullname','username'); + my @stu_display = + (exists($env{'form.studisplay'})) ? &Apache::loncommon::get_env_multiple('form.studisplay') + : keys(%stu_display_fields); + my %stu_display = map { $_ => 1 } (@stu_display); + my $hide_radio = &Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'hide'); my $show_radio = @@ -673,11 +756,17 @@ sub show_table { $r->print('<div>'); $r->print('<table class="inline"> <tr><th>'.&mt('Show').'</th> + <th>'.&mt('Student Display').'</th> <th>'.&mt('Open').'</th> <th>'.&mt('Options').'</th> </tr> <tr><td>'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order). '</td> + <td> + '.&Apache::loncommon::multiple_select_form('studisplay',\@stu_display, + 6,\%stu_display_fields, + \@stu_display_order).' + </td> <td>'.&Apache::loncommon::select_form($when,'when',%when_fields). '</td> <td> @@ -749,10 +838,18 @@ sub show_table { foreach my $entry (sort(keys(%consumed))) { my (undef,$id)=split("\0",$entry); my ($uname,$udom) = split('@',$consumed{$entry}{'name'}); - my $name = &Apache::loncommon::plainname($uname,$udom); - $ids.= '<nobr>'.$name.&remove_link($slot,$entry,$uname,$udom, - $consumed{$entry}{'symb'}) - .'</nobr><br />'; + $ids.= '<nobr>'; + foreach my $item (@stu_display_order) { + if ($stu_display{$item}) { + if ($item eq 'fullname') { + $ids.=$fullname->{"$uname:$udom"}.' '; + } elsif ($item eq 'username') { + $ids.="<tt>$uname\@$udom</tt> "; + } + } + } + $ids.=&remove_link($slot,$entry,$uname,$udom, + $consumed{$entry}{'symb'}).'</nobr><br />'; } }