[LON-CAPA-cvs] cvs: loncom /interface lonnavmaps.pm

raeburn raeburn at source.lon-capa.org
Tue Dec 20 17:41:31 EST 2011


raeburn		Tue Dec 20 22:41:31 2011 EDT

  Modified files:              
    /loncom/interface	lonnavmaps.pm 
  Log:
  - More information about reserving slots for items with access controlled by slots.
    - Distinguish two types of "future" schedulable slots on Course Contents page:
      (a) reservation available now; (b) reservation available in the future.
    - &get_future_slots() moved to loncommon.pm
    - $future_slots variable eliminated (&lonnet::get_reservable_slots() used instead.
  
  
Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.472 loncom/interface/lonnavmaps.pm:1.473
--- loncom/interface/lonnavmaps.pm:1.472	Sun Dec 18 17:15:03 2011
+++ loncom/interface/lonnavmaps.pm	Tue Dec 20 22:41:31 2011
@@ -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 @@
 # 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 @@
     }
 
     # 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 @@
         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/, at 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/, at 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 @@
                     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; }




More information about the LON-CAPA-cvs mailing list