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

albertel lon-capa-cvs@mail.lon-capa.org
Tue, 31 May 2005 21:13:03 -0000


albertel		Tue May 31 17:13:03 2005 EDT

  Modified files:              
    /loncom/interface	slotrequest.pm 
  Log:
  - can display the slots now
  - code for making a reservation written but untested
  
  
  
Index: loncom/interface/slotrequest.pm
diff -u loncom/interface/slotrequest.pm:1.1 loncom/interface/slotrequest.pm:1.2
--- loncom/interface/slotrequest.pm:1.1	Tue May 31 13:42:11 2005
+++ loncom/interface/slotrequest.pm	Tue May 31 17:13:01 2005
@@ -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.1 2005/05/31 17:42:11 albertel Exp $
+# $Id: slotrequest.pm,v 1.2 2005/05/31 21:13:01 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -37,7 +37,12 @@
 
 sub fail {
     my ($r,$code)=@_;
-    $r->print();
+    if ($code eq 'not_valid') {
+	$r->print('<p>'.&mt('Unable to understand what resource you wanted to sign up for.').'</p>'.$env{'form.symb'});
+
+    }
+    $r->print('<p><a href="/adm/flip?postdata=return:">'.
+	      &mt('Return to last resource').'</a></p>');
     &end_page($r);
 }
 
@@ -54,16 +59,139 @@
     $r->print(&Apache::loncommon::endbodytag().'</html>');
 }
 
+=pod
+
+ slot_reservations db
+   - keys are 
+    - slotname\0id -> value is an hashref of
+                         name -> user@domain of holder
+                         timestamp -> timestamp of reservation
+                         symb -> symb of resource that it is reserved for
+
+=cut
+
+sub get_course {
+    (undef,my $courseid)=&Apache::lonxml::whichuser();
+    my $cdom=$env{'course.'.$courseid.'.domain'};
+    my $cnum=$env{'course.'.$courseid.'.num'};
+    return ($cnum,$cdom);
+}
+
+sub get_reservation_ids {
+    my ($slot_name)=@_;
+    
+    my ($cnum,$cdom)=&get_course();
+
+    my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
+				       "^$slot_name\0");
+    
+    my ($tmp)=%consumed;
+    if ($tmp=~/^error: 2 / ) {
+	return 0;
+    }
+    return keys(%consumed);
+}
+
+sub space_available {
+    my ($slot_name,$slot)=@_;
+    my $max=$slot->{'maxspace'};
+
+    if (!defined($max)) { return 1; }
+
+    my $consumed=scalar(&get_reservation_ids($slot_name));
+    if ($consumed < $max) {
+	return 1
+    }
+    return 0;
+}
+ 
+sub make_reservation {
+    my ($slot_name,$slot,$symb)=@_;
+    my $max=$slot->{'maxspace'};
+
+    if (!defined($max)) { return 1; }
+
+    my (@ids)=&get_reservation_ids($slot_name);
+
+    # FIXME we could end up having holes... 
+    my $last=0;
+    foreach my $id (@ids) {
+	my $num=(split('\0',$id))[1];
+	if ($num > $last) { $last=$num; }
+    }
+    
+    my $wanted=$last+1;
+    if ($wanted >= $max) {
+	# full up
+	return -1;
+    }
+    
+    my %reservation=('name'      => $env{'user.name'}.'@'.$env{'user.domain'},
+		     'timestamp' => time,
+		     'symb'      => $symb);
+
+    my ($cnum,$cdom)=&get_course();
+    my $success=&Apache::lonnet::newput('slot_reservations',
+					{"$slot_name\0$wanted" =>
+					     \%reservation},
+					$cdom,$cnum);
+    if ($success eq 'ok') {
+	return $wanted;
+    }
+    # someone else got it
+    return -1;
+}
+
+
+sub show_choices {
+    my ($r,$symb)=@_;
+
+    my ($cnum,$cdom)=&get_course();
+    my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
+    $r->print('<table border="1">');
+    foreach my $slot (sort 
+		      { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }
+		      (keys(%slots)))  {
+	my $description=$slots{$slot}->{'description'};
+	if (!defined($description)) {
+	    $description=&mt('[_1] From [_2] to [_3]',$slot,
+			     &Apache::lonlocal::locallocaltime($slots{$slot}->{'starttime'}),
+			     &Apache::lonlocal::locallocaltime($slots{$slot}->{'endtime'}));
+	}
+
+	my $form=&mt('Unavailable');
+	if (&space_available($slot,$slots{$slot})) {
+	    $form=<<STUFF;
+   <form>
+     <input type="submit" name="Select" value="Select" />
+     <!-- FIXME needs to send data -->
+   </form>
+STUFF
+	}
+	$r->print(<<STUFF);
+<tr>
+ <td>$form</td>
+ <td>$description</td>
+</tr>
+STUFF
+    }
+    $r->print('</table>');
+}
+
 sub handler {
     my $r=shift;
 
     &start_page($r);
-    my $symb=$env{'form.symb'};
+    my $symb=&Apache::lonnet::unescape($env{'form.symb'});
     my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);
-    if ($symb !~ /\.task$/) {
+    if ($res !~ /\.task$/) {
 	&fail($r,'not_valid');
 	return OK;
     }
+    
+    if ($env{'form.requestattempt'}) {
+	&show_choices($r,$symb);
+    }
 
     &end_page($r);
     return OK;