# The LearningOnline Network with CAPA # Handler for requesting to have slots added to a students record # # $Id: slotrequest.pm,v 1.2 2005/05/31 21:13:01 albertel Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # ### package Apache::slotrequest; use strict; use Apache::Constants qw(:common :http :methods); use Apache::loncommon(); use Apache::lonlocal; use Apache::lonnet; sub fail { my ($r,$code)=@_; if ($code eq 'not_valid') { $r->print('

'.&mt('Unable to understand what resource you wanted to sign up for.').'

'.$env{'form.symb'}); } $r->print('

'. &mt('Return to last resource').'

'); &end_page($r); } sub start_page { my ($r)=@_; my $html=&Apache::lonxml::xmlbegin(); $r->print($html.''. &mt('Request another Worktime').''); $r->print(&Apache::loncommon::bodytag('Requesting another Worktime')); } sub end_page { my ($r)=@_; $r->print(&Apache::loncommon::endbodytag().''); } =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(''); 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 } $r->print(< STUFF } $r->print('
$form $description
'); } sub handler { my $r=shift; &start_page($r); my $symb=&Apache::lonnet::unescape($env{'form.symb'}); my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb); if ($res !~ /\.task$/) { &fail($r,'not_valid'); return OK; } if ($env{'form.requestattempt'}) { &show_choices($r,$symb); } &end_page($r); return OK; }