OPTIONAL if (!exists($helper->{'VARS'}{'name'}) || $helper->{'VARS'}{'name'} !~ /\S/) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); if (exists($env{'form.name'}) || $env{'form.name'} =~ /\S/) { $helper->{'VARS'}{'name'}=$env{'form.name'}; $helper->{VARS}{'origname'}=$env{'form.name'}; $helper->{DATA}{copy} = 1; } } $helper->{DATA}{origslot} = sub { my ($which,$default)=@_; if (!exists($helper->{'VARS'}{'name'}) || $helper->{'VARS'}{'name'} !~ /\S/) { return $default; } my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $name=$helper->{VARS}{'origname'}; my %slot=&Apache::lonnet::get('slots', [$name], $cdom, $cnum); if (!ref($slot{$name})) { return $default; } if (($which eq 'ipdeny') || ($which eq 'ipallow')) { if (!exists($slot{$name}{'ip'})) { return $default; } } else { if (!exists($slot{$name}{$which})) { return $default; } } if (($which eq 'ipdeny') || ($which eq 'ipallow')) { my @allows; my @denies; foreach my $item (split(',',$slot{$name}{'ip'})) { $item =~ s/^\s*//; $item =~ s/\s*$//; if ($item =~ /^\!(.+)$/) { push(@denies,$1); } else { push(@allows,$item); } } if ($which eq 'ipdeny') { return join(',',@denies); } if ($which eq 'ipallow') { return join(',',@allows); } } else { return $slot{$name}{$which}; } }
Name:
   
if ($val=~/^\s*$/) { return 'Must specify a name'; } if ($val=~/\s/) { return 'Must not contain spaces'; } if ($val=~/\W/) { return 'Must contain only letters, numbers and _'; } return undef; return $helper->{'VARS'}{'name'}; $helper->{DATA}{copy}

Changing the Name will create a new slot with the new name, and not rename the existing slot.


Start time:
   
return &{$helper->{DATA}{origslot}}('starttime');
End time:
   
return &{$helper->{DATA}{origslot}}('endtime'); if ($val < $helper->{'VARS'}{'starttime'}) { return 'End time must be later than the start time.'; } return undef;
Type:
Instructor assignable. Student selectable. return &{$helper->{DATA}{origslot}}('type','preassigned');

Description:
    return &{$helper->{DATA}{origslot}}('description'); $helper->{'VARS'}{'type'} eq 'schedulable_student'

Time students can start reserving:
    return &{$helper->{DATA}{origslot}}('startreserve','anytime'); if (defined($val) && $val > $helper->{'VARS'}{'starttime'}) { return 'Reservation time must come before the slot has started.'; } return undef;

Time students can no longer reserve:
    return &{$helper->{DATA}{origslot}}('endreserve','anytime'); if (defined($val) && $val > $helper->{'VARS'}{'starttime'}) { return 'Reservation end time must come before the slot has started.'; } return undef;

Maximum number of students allowed in this slot:
    if ($val ne '' && $val=~/\D/) { return 'Must be numeric.'; } return undef; return &{$helper->{DATA}{origslot}}('maxspace');

Period of time when this slot can only be uniquely chosen:
   Start: my $default=&{$helper->{DATA}{origslot}}('uniqueperiod','anytime'); if ($default eq 'anytime') { return 'anytime' }; if (ref($default)) { return $default->[0]; } return 'anytime';
   End:
my $default=&{$helper->{DATA}{origslot}}('uniqueperiod','anytime'); if ($default eq 'anytime') { return 'anytime' }; if (ref($default)) { return $default->[1]; } return 'anytime'; if (defined($val) && $val < $helper->{'VARS'}{'startunique'}) { return 'End time must be later than the start time.'; } return undef;

Message(s) triggered by reservation change by student Sent to student Sent to student and added to user notes None sent and no record in user notes my $default=&{$helper->{DATA}{origslot}}('reservationmsg'); if ($default eq 'only_student') { return $default; } if ($default eq 'student_and_user_notes_screen') { return $default; } return 'none'; $helper->{'VARS'}{'type'} eq 'preassigned' delete($helper->{'VARS'}{'startreserve'}); delete($helper->{'VARS'}{'endreserve'}); delete($helper->{'VARS'}{'maxspace'});

Period of time when this slot can only be uniquely assigned:
   Start: my $default=&{$helper->{DATA}{origslot}}('uniqueperiod','anytime'); if ($default eq 'anytime') { return 'anytime' }; if (ref($default)) { return $default->[0]; } return 'anytime';
   End:
my $default=&{$helper->{DATA}{origslot}}('uniqueperiod','anytime'); if ($default eq 'anytime') { return 'anytime' }; if (ref($default)) { return $default->[1]; } return 'anytime'; if (defined($val) && $val < $helper->{'VARS'}{'startunique'}) { return 'End time must be later than the start time.'; } return undef;

Proctored access: No proctor checkin required for access. Require proctored checkin for access. my $default=&{$helper->{DATA}{origslot}}('proctor'); if ($default) { return 'yes'; } return 'no';

Secret word proctors use to checkin users:
    return undef; return &{$helper->{DATA}{origslot}}('secret');

Slot is: usable for any resource. restricted to a specific resource. my $default=&{$helper->{DATA}{origslot}}('symb'); if ($default) { return 'resource'; } return 'any';

IP restrictions -- allow from all except:
    return undef; return &{$helper->{DATA}{origslot}}('ipdeny');

IP restrictions -- deny from all except:
    return undef; return &{$helper->{DATA}{origslot}}('ipallow');

PROCTOR return $res->is_problem() return $res->symb() return &{$helper->{DATA}{origslot}}('symb'); $helper->{'VARS'}{'useproctor'} eq 'no' RESTRICTUSER RESTRICTUSER my @defaults; my $default=&{$helper->{DATA}{origslot}}('proctor'); if ($default) { @defaults=(split(',',$default)); } return @defaults; $helper->{'VARS'}{'type'} ne 'schedulable_student' FINISH FINISH

Slots are by default available to all users in a course, if you would like this slot to be restricted to a subset of users you can specify restrictions.

Select sections to limit slot availability to:
   
return join('|||', split(',',&{$helper->{DATA}{origslot}}('allowedsections')));
Select users to limit slot availability to:
   
return split(',',&{$helper->{DATA}{origslot}}('allowedusers'));
Created Slot my $result; if ($helper->{'STATE'} ne 'FINISH') { return; } my %slot; foreach my $which ('type','starttime','endtime') { $slot{$which} = $helper->{'VARS'}{$which}; } foreach my $which ('description','maxspace','secret','symb') { if ( $helper->{'VARS'}{$which} =~/\S/ ) { $slot{$which} = $helper->{'VARS'}{$which}; } } if ($helper->{'VARS'}{'ipdeny'} =~/\S/ ) { foreach my $item (split(',',$helper->{'VARS'}{'ipdeny'})) { $item =~ s/^\s*//; $item =~ s/\s*$//; $slot{'ip'} .= '!'.$item.','; } } if ($helper->{'VARS'}{'ipallow'} =~/\S/ ) { foreach my $item (split(',',$helper->{'VARS'}{'ipallow'})) { $item =~ s/^\s*//; $item =~ s/\s*$//; $slot{'ip'} .= $item.','; } } if ($slot{'ip'} ne '') { $slot{'ip'} =~s /,$//; } if ($helper->{'VARS'}{'type'} eq 'schedulable_student') { if (($helper->{'VARS'}{'reservationmsg'} eq 'only_student') || ($helper->{'VARS'}{'reservationmsg'} eq 'student_and_user_notes_screen')) { $slot{'reservationmsg'} = $helper->{'VARS'}{'reservationmsg'}; } else { $slot{'reservationmsg'} = 'none'; } } if ( $helper->{'VARS'}{'startreserve'} > 0) { $slot{'startreserve'} = $helper->{'VARS'}{'startreserve'}; } if ( $helper->{'VARS'}{'endreserve'} > 0) { $slot{'endreserve'} = $helper->{'VARS'}{'endreserve'}; } if ( $helper->{'VARS'}{'startunique'} > 0 && $helper->{'VARS'}{'endunique'} > 0 ) { $slot{'uniqueperiod'} = [$helper->{'VARS'}{'startunique'}, $helper->{'VARS'}{'endunique'}]; } if ( $helper->{'VARS'}{'useproctor'} eq 'yes' && $helper->{'VARS'}{'proctor'} =~/\S/ ) { my @names; # just need the username/domain throw away the other data # that returns foreach my $user (split(/\|\|\|/, $helper->{'VARS'}{'proctor'})) { my ($uname,$udomain)=split(/:/,$user); push(@names,"$uname:$udomain"); } # make sure the usernmaes are unique my %proctors = map { ($_,1) } @names; $slot{'proctor'}=join(',',sort(keys(%proctors))); } if ( $helper->{'VARS'}{'allowedsections'} =~/\S/ ) { $slot{'allowedsections'}= join(',',sort(split(/\|\|\|/, $helper->{'VARS'}{'allowedsections'}))); } if ( $helper->{'VARS'}{'allowedusers'} =~/\S/ ) { my @names; # just need the username/domain throw away the other data # that returns foreach my $item (split(/\|\|\|/, $helper->{'VARS'}{'allowedusers'})) { my ($uname,$udomain)=split(/:/,$item); push(@names,"$uname:$udomain"); } # make sure the choices are unique my %users = map { ($_,1) } @names; $slot{'allowedusers'}=join(',',sort(keys(%users))); } my $cname = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $ret = &Apache::lonnet::cput('slots', {$helper->{'VARS'}{'name'} => \%slot}, $cdom,$cname); if ($ret eq 'ok') { &Apache::lonnet::devalidate_slots_cache($cname,$cdom); } $result.="\n ".'Name: '.&HTML::Entities::encode($helper->{'VARS'}{'name'}).''. "\n".'
  • Starts: '.&Apache::lonlocal::locallocaltime($slot{'starttime'}).'
  • '. "\n".'
  • Ends: '.&Apache::lonlocal::locallocaltime($slot{'endtime'}).'
  • '. "\n".'
  • Type: '.$slot{'type'}.'
  • '; my %labels = map {($_->[0],$_->[1])} &Apache::slotrequest::csvupload_fields(); foreach my $which ('ip','description','maxspace','secret','symb', 'allowedsections','allowedusers') { if (exists($slot{$which})) { $result.="\n".'
  • '.$labels{$which}.': '. &HTML::Entities::encode($slot{$which}).'
  • '; } } if (exists($slot{'startreserve'})) { $result.="\n".'
  • '.$labels{'startreserve'}.': '. &Apache::lonlocal::locallocaltime($slot{'startreserve'}).'
  • '; } if (exists($slot{'endreserve'})) { $result.="\n".'
  • '.$labels{'endreserve'}.': '. &Apache::lonlocal::locallocaltime($slot{'endreserve'}).'
  • '; } if (exists($slot{'reservationmsg'})) { my %options = &Apache::slotrequest::slot_reservationmsg_options(); $result.="\n".'
  • '.$labels{'reservationmsg'}.': '. $options{$slot{'reservationmsg'}}.'
  • '; } if (exists($slot{'proctor'})) { my $proctors = $slot{'proctor'}; $proctors =~ s/,/, /g; $result.="\n".'
  • '.$labels{'proctor'}.': '. &HTML::Entities::encode($proctors).'
  • '; } if (exists($slot{'uniqueperiod'})) { $result.= "\n".'
  • '.$labels{'uniqueperiod'}.': '. &Apache::lonlocal::locallocaltime($slot{'uniqueperiod'}[0]). ', '. &Apache::lonlocal::locallocaltime($slot{'uniqueperiod'}[1]). '
  • '; } return $result;
    /adm/slotrequest?command=showslots