--- loncom/interface/slotrequest.pm 2015/09/27 14:21:48 1.129
+++ loncom/interface/slotrequest.pm 2016/05/21 21:13:58 1.132
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler for requesting to have slots added to a students record
#
-# $Id: slotrequest.pm,v 1.129 2015/09/27 14:21:48 raeburn Exp $
+# $Id: slotrequest.pm,v 1.132 2016/05/21 21:13:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -1114,14 +1114,25 @@ sub allowed_slot {
# not allowed for this resource
if (defined($slot->{'symb'})) {
my $exclude = 1;
- my ($slotmap,$slotid,$sloturl) = &Apache::lonnet::decode_symb($slot->{'symb'});
- if ($sloturl=~/\.(page|sequence)$/) {
- my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb);
- if (($map ne '') && ($map eq $slotmap)) {
+ my @symbs;
+ if ($slot->{'symb'} =~ /,/) {
+ @symbs = split(/\s*,\s*/,$slot->{'symb'});
+ } else {
+ @symbs = ($slot->{'symb'});
+ }
+ my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb);
+ foreach my $reqsymb (@symbs) {
+ next if ($reqsymb eq '');
+ my ($slotmap,$slotid,$sloturl) = &Apache::lonnet::decode_symb($reqsymb);
+ if ($sloturl=~/\.(page|sequence)$/) {
+ if (($map ne '') && ($map eq $sloturl)) {
+ $exclude = 0;
+ last;
+ }
+ } elsif ($reqsymb eq $symb) {
$exclude = 0;
+ last;
}
- } elsif ($slot->{'symb'} eq $symb) {
- $exclude = 0;
}
if ($exclude) {
unless ((ref($toskip) eq 'HASH') && ($toskip->{'symb'})) {
@@ -1478,12 +1489,13 @@ sub show_table {
'secret' => 'Secret Word',
'space' => '# of students/max',
'ip' => 'IP or DNS restrictions',
- 'symb' => 'Resource/Map slot is restricted to.',
+ 'symb' => 'Resource(s)/Map(s) slot is restricted to.',
'allowedsections' => 'Sections slot is restricted to.',
'allowedusers' => 'Users slot is restricted to.',
'uniqueperiod' => 'Period of time slot is unique',
'scheduled' => 'Scheduled Students',
- 'proctor' => 'List of proctors');
+ 'proctor' => 'List of proctors',
+ 'iptied' => 'Unique IP each student',);
if ($crstype eq 'Community') {
$show_fields{'startreserve'} = &mt('Time members can start reserving');
$show_fields{'endreserve'} = &mt('Time members can no longer reserve');
@@ -1491,7 +1503,7 @@ sub show_table {
}
my @show_order=('name','description','type','starttime','endtime',
'startreserve','endreserve','reservationmsg','secret','space',
- 'ip','symb','allowedsections','allowedusers','uniqueperiod',
+ 'ip','iptied','symb','allowedsections','allowedusers','uniqueperiod',
'scheduled','proctor');
my @show =
(exists($env{'form.show'})) ? &Apache::loncommon::get_env_multiple('form.show')
@@ -1693,13 +1705,21 @@ sub show_table {
localtime($slots{$slot}{'uniqueperiod'}[1]);
}
- my $title;
+ my @titles;
if (exists($slots{$slot}{'symb'})) {
- my (undef,undef,$res)=
- &Apache::lonnet::decode_symb($slots{$slot}{'symb'});
- $res = &Apache::lonnet::clutter($res);
- $title = &Apache::lonnet::gettitle($slots{$slot}{'symb'});
- $title=''.$title.'';
+ my @symbs;
+ if ($slots{$slot}{'symb'} =~ /,/) {
+ @symbs = split(/\s*,\s*/,$slots{$slot}{'symb'});
+ } else {
+ @symbs = ($slots{$slot}{'symb'});
+ }
+ foreach my $reqsymb (@symbs) {
+ my (undef,undef,$res) =
+ &Apache::lonnet::decode_symb($reqsymb);
+ $res = &Apache::lonnet::clutter($res);
+ my $title = &Apache::lonnet::gettitle($reqsymb);
+ push(@titles,''.$title.'');
+ }
}
my $allowedsections;
@@ -1815,8 +1835,18 @@ LOGLINK
if (exists($show{'ip'})) {
$colspan++;$r->print("
$slots{$slot}{'ip'} | \n");
}
+ if (exists($show{'iptied'})) {
+ $colspan++;
+ if ($slots{$slot}{'iptied'} eq 'yes') {
+ $r->print(''.&mt('Yes')." | \n");
+ } elsif ($slots{$slot}{'iptied'} eq 'answer') {
+ $r->print(''.&mt('Yes, including post-answer date')." | \n");
+ } else {
+ $r->print(''.&mt('No')." | \n");
+ }
+ }
if (exists($show{'symb'})) {
- $colspan++;$r->print("$title | \n");
+ $colspan++;$r->print("".join(' ',@titles)." | \n");
}
if (exists($show{'allowedsections'})) {
$colspan++;$r->print("$allowedsections | \n");
@@ -2186,9 +2216,26 @@ sub slot_chooser {
foreach my $slot (@{$allavailable}) {
# not allowed for this resource
if (ref($slots->{$slot}) eq 'HASH') {
- if ((defined($slots->{$slot}->{'symb'})) &&
- ($slots->{$slot}->{'symb'} ne $symb)) {
- next;
+ if ($slots->{$slot}->{'symb'} ne '') {
+ my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb);
+ my $exclude = 1;
+ my @reqsymbs = split(/\s*,\s*/,$slots->{$slot}->{'symb'});
+ if (@reqsymbs) {
+ if (grep(/^\Q$symb\E$/,@reqsymbs)) {
+ $exclude = 0;
+ } else {
+ foreach my $reqsymb (@reqsymbs) {
+ my (undef,undef,$sloturl) = &Apache::lonnet::decode_symb($reqsymb);
+ if ($sloturl=~/\.(page|sequence)$/) {
+ if (($map ne '') && ($map eq $sloturl)) {
+ $exclude = 0;
+ last;
+ }
+ }
+ }
+ }
+ next if ($exclude);
+ }
}
}
push(@available,$slot);
@@ -2916,10 +2963,11 @@ sub csvupload_fields {
['endreserve','Reservation End Time'],
['reservationmsg','Message when reservation changed'],
['ip','IP or DNS restriction'],
+ ['iptied','Unique IP each student'],
['proctor','List of proctor ids'],
['description','Slot Description'],
['maxspace','Maximum number of reservations'],
- ['symb','Resource/Map Restriction'],
+ ['symb','Resource(s)/Map(s) Restriction'],
['uniqueperiod','Date range of slot exclusion'],
['secret','Secret word proctor uses to validate'],
['allowedsections','Sections slot is restricted to'],
@@ -2987,8 +3035,12 @@ sub csv_upload_assign {
}
if ($entries{$fields{'startreserve'}}) {
- $slot{'startreserve'}=
- &UnixDate($entries{$fields{'startreserve'}},"%s");
+ my $date = &UnixDate($entries{$fields{'startreserve'}},"%s");
+ if ($date eq '') {
+ push(@errors,"$name -- No reservation start time set for slot -- value provided had invalid format");
+ } else {
+ $slot{'startreserve'} = $date;
+ }
}
if (defined($slot{'startreserve'})
&& $slot{'startreserve'} > $slot{'starttime'}) {
@@ -2997,8 +3049,12 @@ sub csv_upload_assign {
}
if ($entries{$fields{'endreserve'}}) {
- $slot{'endreserve'}=
- &UnixDate($entries{$fields{'endreserve'}},"%s");
+ my $date = &UnixDate($entries{$fields{'endreserve'}},"%s");
+ if ($date eq '') {
+ push(@errors,"$name -- No reservation end time set for slot -- value provided had invalid format");
+ } else {
+ $slot{'endreserve'} = $date;
+ }
}
if (defined($slot{'endreserve'})
&& $slot{'endreserve'} > $slot{'starttime'}) {
@@ -3026,6 +3082,11 @@ sub csv_upload_assign {
$slot{$key}=$entries{$fields{$key}};
}
}
+ if ($entries{$fields{'iptied'}} =~ /^\s*(yes|1)\s*$/i) {
+ $slot{'iptied'}='yes';
+ } elsif ($entries{$fields{'iptied'}} =~ /^\s*answer\s*$/i) {
+ $slot{'iptied'}='answer';
+ }
if ($entries{$fields{'allowedusers'}}) {
$entries{$fields{'allowedusers'}} =~ s/^\s+//;
$entries{$fields{'allowedusers'}} =~ s/\s+$//;
@@ -3058,12 +3119,14 @@ sub csv_upload_assign {
}
}
if ($entries{$fields{'uniqueperiod'}}) {
- my ($start,$end)=split(',',$entries{$fields{'uniqueperiod'}});
- my @times=(&UnixDate($start,"%s"),
- &UnixDate($end,"%s"));
- $slot{'uniqueperiod'}=\@times;
+ my ($start,$end)= map { &UnixDate($_,"%s"); } split(',',$entries{$fields{'uniqueperiod'}});
+ if (($start ne '') && ($end ne '')) {
+ $slot{'uniqueperiod'}=[$start,$end];
+ } else {
+ push(@errors,"$name -- Slot's unique period ignored -- one or both of the comma separated values for start and end had an invalid format");
+ }
}
- if (defined($slot{'uniqueperiod'})
+ if (ref($slot{'uniqueperiod'}) eq 'ARRAY'
&& $slot{'uniqueperiod'}[0] > $slot{'uniqueperiod'}[1]) {
push(@errors,"$name not created -- Slot's unique period start time is later than the unique period's end time.");
next;
@@ -3248,7 +3311,8 @@ sub handler {
my ($status) = &Apache::lonhomework::check_slot_access('0',$type);
if ($status eq 'CAN_ANSWER' ||
$status eq 'NEEDS_CHECKIN' ||
- $status eq 'WAITING_FOR_GRADE') {
+ $status eq 'WAITING_FOR_GRADE' ||
+ $status eq 'NEED_DIFFERENT_IP') {
&fail($r,'not_allowed');
return OK;
}