--- loncom/interface/slotrequest.pm 2005/09/13 07:33:59 1.16
+++ loncom/interface/slotrequest.pm 2006/03/07 16:15:48 1.49
@@ -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.16 2005/09/13 07:33:59 albertel Exp $
+# $Id: slotrequest.pm,v 1.49 2006/03/07 16:15:48 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -34,6 +34,7 @@ use Apache::Constants qw(:common :http :
use Apache::loncommon();
use Apache::lonlocal;
use Apache::lonnet;
+use Apache::lonnavmaps();
use Date::Manip;
sub fail {
@@ -47,18 +48,15 @@ sub fail {
$r->print('
');
+ &return_link($r);
&end_page($r);
}
sub start_page {
- my ($r)=@_;
+ my ($r,$title)=@_;
my $html=&Apache::lonxml::xmlbegin();
- $r->print($html.''.
- &mt('Request another Worktime').'');
- $r->print(&Apache::loncommon::bodytag('Requesting another Worktime'));
- $r->print('
'.$env{'form.command'}.'
');
+ $r->print($html.''.&mt($title).'');
+ $r->print(&Apache::loncommon::bodytag($title));
}
sub end_page {
@@ -91,7 +89,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;
@@ -113,7 +113,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'});
@@ -126,7 +126,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 ".
@@ -135,29 +147,81 @@ 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 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;
+ }
+ }
+
+ if (!ref($slots)) {
+ 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;
+ }
+
+ 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'}));
+ $consumed_uniqueperiods{$slot_name} =
+ $slots->{$slot_name}{'uniqueperiod'};
+ }
+ return \%consumed_uniqueperiods;
+}
+
sub check_for_conflict {
- my ($symb,$new_slot_name)=@_;
- 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();
- my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);
- foreach my $slot_name (@slots) {
- next if (!defined($slots{$slot_name}) ||
- !ref($slots{$slot_name}));
+ my ($symb,$new_slot_name,$new_slot,$slots,$consumed_uniqueperiods)=@_;
+
+ if (!defined($new_slot->{'uniqueperiod'})) { return undef; }
- next if (!defined($slots{$slot_name}->{'uniqueperiod'}) ||
- !ref($slots{$slot_name}->{'uniqueperiod'}));
- my ($start,$end)=@{$slots{$slot_name}->{'uniqueperiod'}};
- if ($start