--- loncom/interface/lonnavmaps.pm 2011/12/18 17:15:03 1.472 +++ loncom/interface/lonnavmaps.pm 2011/12/20 22:41:31 1.473 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.472 2011/12/18 17:15:03 raeburn Exp $ +# $Id: lonnavmaps.pm,v 1.473 2011/12/20 22:41:31 raeburn Exp $ # # Copyright Michigan State University Board of Trustees @@ -542,9 +542,6 @@ my %colormap = # is not yet done and due in less than 24 hours my $hurryUpColor = "#FF0000"; -my $future_slots_checked = 0; -my $future_slots = 0; - sub addToFilter { my $hashIn = shift; my $addition = shift; @@ -5090,12 +5087,13 @@ sub status { } # Otherwise, it's untried and open - return OPEN; + return OPEN; } sub check_for_slot { my $self = shift; my $part = shift; + my $symb = $self->symb(); my ($use_slots,$available,$availablestudent) = $self->slot_control($part); if (($use_slots ne '') && ($use_slots !~ /^\s*no\s*$/i)) { my @slots = (split(/:/,$availablestudent),split(/:/,$available)); @@ -5103,53 +5101,49 @@ sub check_for_slot { my $cdom=$env{'course.'.$cid.'.domain'}; my $cnum=$env{'course.'.$cid.'.num'}; my $now = time; + my $num_usable_slots = 0; if (@slots > 0) { my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum); if (&Apache::lonnet::error(%slots)) { return (UNKNOWN); } - my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots); + my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); my ($checkedin,$checkedinslot); foreach my $slot_name (@sorted_slots) { - next if (!defined($slots{$slot_name}) || - !ref($slots{$slot_name})); + next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name})); my $end = $slots{$slot_name}->{'endtime'}; my $start = $slots{$slot_name}->{'starttime'}; my $ip = $slots{$slot_name}->{'ip'}; if ($self->simpleStatus() == OPEN) { - my $startreserve = $slots{$slot_name}->{'startreserve'}; - my $endreserve = $slots{$slot_name}->{'endreserve'}; my @proctors; if ($slots{$slot_name}->{'proctor'} ne '') { @proctors = split(',',$slots{$slot_name}->{'proctor'}); } if ($end > $now) { - ($checkedin,$checkedinslot) = $self->checkedin(); - if ($startreserve < $now) { - if ($start > $now) { - return (RESERVED_LATER,$start,$slot_name); - } else { - if ($ip ne '') { - if (!&Apache::loncommon::check_ip_acc($ip)) { - return (RESERVED_LOCATION,$ip,$slot_name); - } - } - if (@proctors > 0) { - unless ((grep(/^\Q$checkedin\E/,@proctors)) && - ($checkedinslot eq $slot_name)) { - return (NEEDS_CHECKIN,undef,$slot_name); - } + if ($start > $now) { + return (RESERVED_LATER,$start,$slot_name); + } else { + if ($ip ne '') { + if (!&Apache::loncommon::check_ip_acc($ip)) { + return (RESERVED_LOCATION,$ip,$slot_name); } - return (RESERVED,$end,$slot_name); } - } else { - if ($start > $now) { - if (!$endreserve || $endreserve > $now) { - return (RESERVABLE,$startreserve,$slot_name); + my @proctors; + if ($slots{$slot_name}->{'proctor'} ne '') { + @proctors = split(',',$slots{$slot_name}->{'proctor'}); + } + if (@proctors > 0) { + ($checkedin,$checkedinslot) = $self->checkedin(); + unless ((grep(/^\Q$checkedin\E/,@proctors)) && + ($checkedinslot eq $slot_name)) { + return (NEEDS_CHECKIN,undef,$slot_name); } } + return (RESERVED,$end,$slot_name); } } + } elsif ($end > $now) { + $num_usable_slots ++; } } my ($is_correct,$got_grade); @@ -5170,32 +5164,33 @@ sub check_for_slot { return (CORRECT); } } - return(NOT_IN_A_SLOT); - } else { - if (!$future_slots_checked) { - $future_slots = &get_future_slots($cdom,$cnum,$now); - $future_slots_checked = 1; - } - if ($future_slots) { + if ($num_usable_slots) { return(NOT_IN_A_SLOT); } - return(NOTRESERVABLE); } - } - return; -} - -sub get_future_slots { - my ($cdom,$cnum,$now) = @_; - my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum); - my $future_slots = 0; - foreach my $slot (keys(%slots)) { - if (($slots{$slot}->{'starttime'} > $now) && - ($slots{$slot}->{'endtime'} > $now)) { - $future_slots ++; + my $reservable = &Apache::lonnet::get_reservable_slots($cnum,$cdom,$env{'user.name'}, + $env{'user.domain'}); + if (ref($reservable) eq 'HASH') { + if ((ref($reservable->{'now_order'}) eq 'ARRAY') && (ref($reservable->{'now'}) eq 'HASH')) { + foreach my $slot (@{$reservable->{'now_order'}}) { + if (($reservable->{'now'}{$slot}{'symb'} eq '') || + ($reservable->{'now'}{$slot}{'symb'} eq $symb)) { + return(RESERVABLE,$reservable->{'now'}{$slot}{'endreserve'}); + } + } + } + if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) { + foreach my $slot (reverse (@{$reservable->{'future_order'}})) { + if (($reservable->{'future'}{$slot}{'symb'} eq '') || + ($reservable->{'future'}{$slot}{'symb'} eq $symb)) { + return(RESERVABLE_LATER,$reservable->{'future'}{$slot}{'startreserve'}); + } + } + } } + return(NOTRESERVABLE); } - return $future_slots; + return; } sub CLOSED { return 23; }