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

albertel lon-capa-cvs@mail.lon-capa.org
Sun, 26 Feb 2006 19:40:16 -0000


albertel		Sun Feb 26 14:40:16 2006 EDT

  Modified files:              
    /loncom/interface	slotrequest.pm 
  Log:
  - unique periods need tobe check across the whole course
  
  
Index: loncom/interface/slotrequest.pm
diff -u loncom/interface/slotrequest.pm:1.47 loncom/interface/slotrequest.pm:1.48
--- loncom/interface/slotrequest.pm:1.47	Thu Feb  9 13:04:51 2006
+++ loncom/interface/slotrequest.pm	Sun Feb 26 14:40:14 2006
@@ -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.47 2006/02/09 18:04:51 albertel Exp $
+# $Id: slotrequest.pm,v 1.48 2006/02/26 19:40:14 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -34,6 +34,7 @@
 use Apache::loncommon();
 use Apache::lonlocal;
 use Apache::lonnet;
+use Apache::lonnavmaps();
 use Date::Manip;
 
 sub fail {
@@ -159,35 +160,65 @@
     return (undef,undef);
 }
 
-sub check_for_conflict {
-    my ($symb,$new_slot_name,$new_slot,$slots)=@_;
-
-    if (!defined($new_slot->{'uniqueperiod'})) { return undef; }
+sub get_consumed_uniqueperiods {
+    my ($slots) = @_;
+    my $navmap=Apache::lonnavmaps::navmap->new;
+    my @problems = $navmap->retrieveResources(undef,
+					      sub { $_[0]->is_problem() },1,0);
+    my %used_slots;
+    foreach my $problem (@problems) {
+	my $symb = $problem->symb();
+	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'});
+	if (&network_error($student) || &network_error($course)) {
+	    return 'error: Unable to determine current status';
+	}
+	foreach my $slot (split(/:/,$student), split(/:/, $course)) {
+	    $used_slots{$slot}=1;
+	}
+    }
 
-    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 @slots = (split(/:/,$student), split(/:/, $course));
-    my ($cnum,$cdom)=&get_course();
     if (!ref($slots)) {
-	my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);
+	my ($cnum,$cdom)=&get_course();
+	my %slots=&Apache::lonnet::get('slots', [keys(%used_slots)], $cdom, $cnum);
+	if (&network_error(%slots)) {
+	    return 'error: Unable to determine current status';
+	}
 	$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) {
+    my %consumed_uniqueperiods;
+    foreach my $slot_name (keys(%used_slots)) {
 	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'}};
+	$consumed_uniqueperiods{$slot_name} = 
+	    $slots->{$slot_name}{'uniqueperiod'};
+    }
+    return \%consumed_uniqueperiods;
+}
+
+sub check_for_conflict {
+    my ($symb,$new_slot_name,$new_slot,$slots,$consumed_uniqueperiods)=@_;
+
+    if (!defined($new_slot->{'uniqueperiod'})) { return undef; }
+
+    if (!ref($consumed_uniqueperiods)) {
+	$consumed_uniqueperiods = &get_consumed_uniqueperiods($slots);
+	if (&network_error(%$consumed_uniqueperiods)) {
+	    return 'error: Unable to determine current status';
+	}
+    }
+    
+    my ($new_uniq_start,$new_uniq_end) = @{$new_slot->{'uniqueperiod'}};
+    foreach my $slot_name (keys(%$consumed_uniqueperiods)) {
+	my ($start,$end)=@{$consumed_uniqueperiods->{$slot_name}};
 	if (!
 	    ($start < $new_uniq_start &&  $end < $new_uniq_start) ||
 	    ($start > $new_uniq_end   &&  $end > $new_uniq_end  )) {
@@ -497,7 +528,7 @@
 }
 
 sub allowed_slot {
-    my ($slot_name,$slot,$symb,$slots)=@_;
+    my ($slot_name,$slot,$symb,$slots,$consumed_uniqueperiods)=@_;
     #already started
     if ($slot->{'starttime'} < time) {
 	# all open slot to be schedulable
@@ -520,7 +551,8 @@
 	&& $slot->{'symb'} ne $symb) {
 	return 0;
     }
-    my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots);
+    my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots,
+				       $consumed_uniqueperiods);
     if ($conflict) {
 	if ($slots->{$conflict}{'starttime'} < time) {
 	    return 0;
@@ -546,6 +578,7 @@
 
     my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
+    my $consumed_uniqueperiods = &get_consumed_uniqueperiods(\%slots);
     my $available;
     $r->print('<table border="1">');
     &Apache::lonxml::debug("Checking Slots");
@@ -555,7 +588,8 @@
 		      (keys(%slots)))  {
 
 	&Apache::lonxml::debug("Checking Slot $slot");
-	next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots));
+	next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots,
+				$consumed_uniqueperiods));
 
 	$available++;
 
@@ -571,7 +605,8 @@
 		$command='release';
 	    } else {
 		my $conflict = &check_for_conflict($symb,$slot,$slots{$slot},
-						   \%slots);
+						   \%slots,
+						   $consumed_uniqueperiods);
 		if ($conflict) {
 		    $text=&mt('Change Reservation');
 		    $command='get';