version 1.1, 2005/05/31 17:42:11
|
version 1.2, 2005/05/31 21:13:01
|
Line 37 use Apache::lonnet;
|
Line 37 use Apache::lonnet;
|
|
|
sub fail { |
sub fail { |
my ($r,$code)=@_; |
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); |
&end_page($r); |
} |
} |
|
|
Line 54 sub end_page {
|
Line 59 sub end_page {
|
$r->print(&Apache::loncommon::endbodytag().'</html>'); |
$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 { |
sub handler { |
my $r=shift; |
my $r=shift; |
|
|
&start_page($r); |
&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); |
my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb); |
if ($symb !~ /\.task$/) { |
if ($res !~ /\.task$/) { |
&fail($r,'not_valid'); |
&fail($r,'not_valid'); |
return OK; |
return OK; |
} |
} |
|
|
|
if ($env{'form.requestattempt'}) { |
|
&show_choices($r,$symb); |
|
} |
|
|
&end_page($r); |
&end_page($r); |
return OK; |
return OK; |