[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;