--- loncom/html/adm/helper/newslot.helper 2005/10/11 21:12:48 1.2 +++ loncom/html/adm/helper/newslot.helper 2018/06/24 04:11:12 1.35 @@ -1,105 +1,620 @@ - - - - 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:
    - +

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

Time students can start reserving:
    - +

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

Maxium number of students allowed in this slot:
    - +

Secret word proctors use to checkin users:
    - + - if ($val ne '' && $val=~/\D/) { return 'Must be numeric.'; } 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. - restricted to a specific resource. - 'any' + usable for any resource. + restricted to resources in specific folder(s)/composite page(s). + restricted to specific resource(s). + + my $default=&{$helper->{DATA}{origslot}}('symb'); + if ($default) { + my @symbs; + if ($default =~ /,/) { + @symbs = split(/\s*,\s*/,$default); + } else { + @symbs = ($default); + } + if (grep(/\.(page|sequence)$/,@symbs)) { + return 'map'; + } else { + return 'resource'; + } + } else { + return 'any'; + } + + - -

IP restrictions:
    - +

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'); + + + + +

Does each student need to use a unique IP address to access a resource with this slot?

+
+ + No. The student's IP address is not tied for later access to the same resource. + Yes. The IP address on a student's first access to a resource is tied for later access. + Yes. The IP address on a student's first access to a resource is tied for later access (including post-answer date). + + my $default=&{$helper->{DATA}{origslot}}('iptied'); + if ($default eq 'yes') { return 'yes'; } + if ($default eq 'answer') { return 'answer'; } + return 'no'; + + +

+ + - - return $res->is_problem() + + PROCTOR + + + return $res->is_map() || $res->is_problem() + return $res->is_problem() return $res->symb() - FINISH + + my @defaults; + my $default=&{$helper->{DATA}{origslot}}('symb'); + if ($default) { + @defaults=(split(/\s*,\s*/,$default)); + } + return @defaults; + - - fin + + + + PROCTOR + + + return $res->is_map() + return $res->symb() + + my @defaults; + my $default=&{$helper->{DATA}{origslot}}('symb'); + if ($default) { + @defaults=(split(/\s*,\s*/,$default)); + } + return @defaults; + + + + + + + + $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') { + 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'}{'restricttosymb'} =~ /^(map|resource)$/) && + ($helper->{'VARS'}{'symb'} =~ /\S/)) { + my @symbs; + foreach my $symb (split(/\|\|\|/, $helper->{'VARS'}{'symb'})) { + push(@symbs,$symb); + } + # make sure the symbs are unique + my %symbs = map { ($_,1) } @symbs; + $slot{'symb'}=join(',',sort(keys(%symbs))); + } + + 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'}{'iptied'} =~ /^(yes|answer)$/ ) { + $slot{'iptied'} = lc($helper->{'VARS'}{'iptied'}); + } + + 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 usernames 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', + 'allowedsections','allowedusers') { + if (exists($slot{$which})) { + $result.="\n".'
  • '.$labels{$which}.': '. + &HTML::Entities::encode($slot{$which}).'
  • '; + } + } + if (exists($slot{'iptied'})) { + $result.="\n".'
  • '.$labels{'iptied'}.': '; + if ($slot{'iptied'} eq 'yes') { + $result.=&Apache::lonlocal::mt('yes'); + } elsif ($slot{'iptied'} eq 'answer') { + $result.=&Apache::lonlocal::mt('yes, including post-answer date'); + } + $result.='
  • '; + } + if (exists($slot{'symb'})) { + $result.="\n".'
  • '.$labels{'symb'}.': '; + if ($slot{'symb'} =~ /,/) { + $result.='
      '; + foreach my $symb (split(/\s*,\s*/,$slot{'symb'})) { + $result.='
    • '.&HTML::Entities::encode($symb).'
    • '; + } + $result.='
    '; + } else { + $result.=&HTML::Entities::encode($slot{'symb'}); + } + $result.='
  • '; + } + 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 +