--- loncom/html/adm/helper/newslot.helper 2005/10/14 22:17:33 1.3
+++ loncom/html/adm/helper/newslot.helper 2019/03/02 16:25:52 1.30.6.1
@@ -1,154 +1,497 @@
-
-
-
- Name:
-
+
+
+ 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=~/\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:
+
Start time:
-
+
+
+ return &{$helper->{DATA}{origslot}}('starttime');
+
+
-
End time:
+
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:
+
Type:
- Instructor asssignable.
- Student selectable.
+ Instructor assignable.
+ Student selectable.
- return 'preassigned';
+ return &{$helper->{DATA}{origslot}}('type','preassigned');
-
-
-
- Description:
-
-
-
+
+
-
-
Time students can start reserving:
-
+
Description:
-
- 'anytime'
-
+
+
+ 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'});
+ delete($helper->{'VARS'}{'startunique'});
+ delete($helper->{'VARS'}{'endunique'});
+
+
+
-
-
Maxium number of students allowed in this slot:
-
+
Proctored access:
-
-
- if ($val ne '' && $val=~/\D/) { return 'Must be numeric.'; }
- return undef;
-
-
+
+ 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:
-
+
Secret word proctors use to checkin users:
return undef;
+
+ return &{$helper->{DATA}{origslot}}('secret');
+
-
-
Period of time in which this slot is can only be uniquely chosen:
Start:
-
-
-
- 'anytime'
-
-
End:
-
- 'anytime'
-
-
-
-
Slot is:
-
+
Slot is:
+
+
- usable for any resource.
+ usable for any resource.
restricted to a specific resource.
- 'any'
+
+ 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:
-
+
IP restrictions -- deny from all except:
-
+
+
return undef;
+
+ return &{$helper->{DATA}{origslot}}('ipallow');
+
-
+
+
+
+
+ PROCTOR
+
return $res->is_problem()
return $res->symb()
- FINISH
+
+ return &{$helper->{DATA}{origslot}}('symb');
+
-
- Created Slot
+
+
+
+
+
+ $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 ('ip','proctor','description','maxspace',
- 'secret','symb') {
+
+ 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);
- $result.="\n".' Name: '.&HTML::Entities::encode($slot{name}).''.
- "\n".' Starts: '.&Apache::lonlocal::locallocaltime($slot{start}).''.
- "\n".' Ends: '.&Apache::lonlocal::locallocaltime($slot{end}).''.
+ 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','proctor','description','maxspace',
- 'secret','symb') {
+ 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'}.': '.
@@ -159,7 +502,7 @@
}
return $result;
- /adm/flip?postdata=return:
+ /adm/slotrequest?command=showslots