--- loncom/interface/slotrequest.pm 2020/04/08 20:06:59 1.125.2.3.4.2
+++ loncom/interface/slotrequest.pm 2018/07/02 20:34:52 1.139
@@ -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.125.2.3.4.2 2020/04/08 20:06:59 raeburn Exp $
+# $Id: slotrequest.pm,v 1.139 2018/07/02 20:34:52 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -260,6 +260,103 @@ function uncheckSlotRadio() {
}
}
}
+
+function toggleSlotMap(maprownum,rownum) {
+ if (document.getElementById('arrow'+maprownum)) {
+ var img = document.getElementById('arrow'+maprownum);
+ var rowdisplay;
+ var celldisplay = '';
+ if (img.src.indexOf('arrow.open.gif')!=-1) {
+ img.src = '/adm/lonIcons/arrow.closed.gif';
+ rowdisplay = 'none';
+ }
+ else {
+ img.src = '/adm/lonIcons/arrow.open.gif';
+ rowdisplay = 'table-row';
+ celldisplay = 'none';
+ }
+ var resrows;
+ var maptext;
+ if (document.getElementsByClassName) {
+ resrows = document.getElementsByClassName('LC_slotresrow_'+maprownum);
+ maptext = document.getElementsByClassName('LC_slotmaptext_'+maprownum);
+ } else {
+ resrows = getElementsByClassName(document.body,'LC_slotresrow_'+maprownum);
+ maptext = getElementsByClassName(document.body,'LC_slotmaptext_'+maprownum);
+ }
+ if (maptext.length) {
+ for (var i=0; i '.&mt($msg).' '.&mt($msg).' $msg '.&mt($msg).' '.&mt($msg).' $msg '.&mt('Slot [_1] marked as deleted.',''.$slot_name.'').' '.&mt('An error occurred when attempting to delete slot: [_1]',''.$slot_name.'')." ($ret) '.&mt('An error occurred when attempting to delete slot: [_1]',''.$slot_name.'')." ($ret) '
+ $r->print(' '
.&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
- .'';
- if (keys(%folders)) {
- $msg .= '
';
- }
- $msg .= '';
- my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
- my $subject = &mt('Reservation change: [_1]',$description);
- my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);
- $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');
- return (1,$msg);
- } else {
- if (keys(%to_delete)) {
- $msg = &mt('Reservation release partially complete for [_1]',$description);
- } else {
- $msg = &mt('No entries found for this user to release for [_1].',$description);
- }
- return (0,$msg);
- }
- } else {
- $msg = &mt('No conflict found; not releasing: [_1].',$description);
- return (0,$msg);
- }
- }
-
- my $map_symb;
- my $parm_symb = $symb;
my $passed_resource = $navmap->getBySymb($symb);
-
- # if the reservation symb is for a map get a resource in that map
- # to check slot parameters on
- my $parm_level = 1;
if (ref($passed_resource)) {
if ($passed_resource->is_map()) {
my ($a_resource) =
$navmap->retrieveResources($passed_resource,
- sub {$_[0]->is_problem()},0,1);
- $parm_symb = $a_resource->symb();
+ sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1);
+ $symb = $a_resource->symb();
}
} else {
unless ($mgr eq 'F') {
@@ -875,132 +814,68 @@ sub release_reservation {
}
}
- # Get value of useslots parameter in effect for this user.
- # If value is map or map_map, then the parm level is 2 (i.e.,
- # non-recursive enclosing map/folder level for specific user)
- # and the symb for this reservation in slot_reservations.db
- # will be the symb of the map itself.
-
- my $use_slots = &Apache::lonnet::EXT('resource.0.useslots',
- $parm_symb,$udom,$uname);
- if (&Apache::lonnet::error($use_slots)) {
- return (0,'error: Unable to determine current status');
- }
- if ($use_slots eq 'map' || $use_slots eq 'map_map') {
- $parm_level = 2;
- if ($passed_resource->is_map()) {
- $map_symb = $passed_resource->symb();
- } else {
- my ($map) = &Apache::lonnet::decode_symb($symb);
- $map_symb = &Apache::lonnet::symbread($map);
- }
- }
-
- #
- # If release is *not* because of a reservation change, i.e., this is a "drop"
- # by a student, or a removal for a single student by an instructor then
- # only remove one entry from slot_reservations.db, where both the user
- # and the symb match the current context. If useslots was set to map or
- # map_map, then the symb to match in slot_reservations.db is the symb of
- # the enclosing map/folder, not the symb of the resource.
- #
+ # get parameter string, check for existence, rebuild string with the slot
+ my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
+ $symb,$udom,$uname);
+ my @slots = split(/:/,$student);
- my ($match,$symb_to_check);
- if ($parm_level == 2) {
- $symb_to_check = $map_symb;
- } else {
- $symb_to_check = $parm_symb;
- }
- foreach my $entry (keys(%consumed)) {
- if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
- if ($consumed{$entry}->{'symb'} eq $symb_to_check) {
- if (&Apache::lonnet::del('slot_reservations',[$entry],
- $cdom,$cnum) eq 'ok') {
- $match = $symb_to_check;
- }
- last;
- }
- }
- }
- if ($match) {
- if (&update_selectable($navmap,$slot_name,$symb,$cdom,
- $cnum,$udom,$uname,$context) =~ /^error/) {
- if ($mgr eq 'F') {
- $msg = &mt('Reservation release partially complete for: [_1]',"$uname:$udom").'';
- foreach my $key (sort { $container{$b}{'title'} cmp $container{$a}{'title'} } (keys(%container))) {
- if (ref($container{$key}{'resources'}) eq 'HASH') {
- $msg .= '
'.
- &mt('Update of availablestudent parameter for [_1] was not completed.',"$uname:$udom");
- } else {
- $msg = &mt('Release partially complete for: [_1]',$description);
- }
- return (0,$msg);
- } else {
- if ($mgr eq 'F') {
- $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
- } else {
- $msg = ''.&mt('Released reservation: [_1]',$description).'
';
- my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
- my $subject = &mt('Reservation change: [_1]',$description);
- my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);
- $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');
- }
- return (1,$msg);
- }
- } else {
- $msg = &mt('Release failed for: [_1]',$description);
- return (0,$msg);
+ my @new_slots;
+ foreach my $exist_slot (@slots) {
+ if ($exist_slot eq $slot_name) { next; }
+ push(@new_slots,$exist_slot);
}
-}
+ my $new_param = join(':',@new_slots);
-sub update_selectable {
- my ($navmap,$slot_name,$symb,$cdom,$cnum,$udom,$uname,$context) = @_;
- return 'error: ' unless (ref($navmap));
- my $symb_for_parm = $symb;
- my $passed_resource = $navmap->getBySymb($symb);
- return 'error: invalid symb' unless (ref($passed_resource));
+ my ($cnum,$cdom)=&get_course();
- # if the reservation symb is for a map get a resource in that map
- # to check slot parameters on
- if ($passed_resource->is_map()) {
- my ($a_resource) =
- $navmap->retrieveResources($passed_resource,
- sub {$_[0]->is_problem()},0,1);
- $symb_for_parm = $a_resource->symb();
+ # get slot reservations, check if user has one, if so remove reservation
+ my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
+ "^$slot_name\0");
+ foreach my $entry (keys(%consumed)) {
+ if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
+ &Apache::lonnet::del('slot_reservations',[$entry],
+ $cdom,$cnum);
+ my %storehash = (
+ symb => $symb,
+ slot => $slot_name,
+ action => 'release',
+ context => $env{'form.context'},
+ );
+ &Apache::lonnet::write_log('course','slotreservationslog',
+ \%storehash,1,$uname,$udom,$cnum,$cdom);
+ &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',
+ \%storehash,1,$uname,$udom,$uname,$udom);
+ }
}
- # get parameter string, check for existence, rebuild string with the slot
- my $student = &Apache::lonnet::EXT('resource.0.availablestudent',
- $symb_for_parm,$udom,$uname);
-
- # Get value of useslots parameter in effect for this user.
- # If value is map or map_map, then the parm level is 2 (i.e.,
- # non-recursive enclosing map/folder level for specific user)
- # and the symb for this reservation in slot_reservations.db
- # will be the symb of the map itself.
- my $use_slots = &Apache::lonnet::EXT('resource.0.useslots',
- $symb_for_parm,$udom,$uname);
+ my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",
+ $symb,$udom,$uname);
&Apache::lonxml::debug("use_slots is $use_slots
");
- if (&Apache::lonnet::error($use_slots)) {
- return 'error: Unable to determine current status';
+ if (&Apache::lonnet::error($use_slots)) {
+ return (0,'error: Unable to determine current status');
}
my $parm_level = 1;
if ($use_slots eq 'map' || $use_slots eq 'map_map') {
- $parm_level = 2;
+ $parm_level = 2;
}
-
- my @slots = split(/:/,$student);
-
- my @new_slots;
- foreach my $exist_slot (@slots) {
- next if ($exist_slot eq $slot_name);
- push(@new_slots,$exist_slot);
+ # store new parameter string
+ my $result=&Apache::lonparmset::storeparm_by_symb($symb,
+ '0_availablestudent',
+ $parm_level, $new_param,
+ 'string', $uname, $udom);
+ my $msg;
+ if ($mgr eq 'F') {
+ $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
+ } else {
+ $msg = ''.&mt('Released reservation: [_1]',$description).'
';
+ my $person = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
+ my $subject = &mt('Reservation change: [_1]',$description);
+ my $msgbody = &mt('Reservation released by [_1] for [_2].',$person,$description);
+ $msg .= &slot_change_messaging($slot{'reservationmsg'},$subject,$msgbody,'release');
}
- my $new_value = join(':',@new_slots);
-
- my $result = &store_slot_parm($symb_for_parm,$symb,$slot_name,$parm_level,
- $new_value,$cnum,$cdom,$uname,$udom,'release',
- $context,1);
- return $result;
+ return (1,$msg);
}
sub delete_slot {
@@ -1022,7 +897,7 @@ sub delete_slot {
if ($ret eq 'ok') {
$r->print('
' + $r->print('
' .&mt('An error occurred while attempting to make a reservation. ([_1])',$1) - .'
'); + .''); } elsif ($reserved > -1) { $r->print(''.&mt('Successfully signed up: [_1]',$description).'
'); $retvalue = 1; @@ -1243,10 +1118,32 @@ sub allowed_slot { return 0 if (!$userallowed); # not allowed for this resource - if (defined($slot->{'symb'}) - && $slot->{'symb'} ne $symb) { - unless ((ref($toskip) eq 'HASH') && ($toskip->{'symb'})) { - return 0; + if (defined($slot->{'symb'})) { + my $exclude = 1; + 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; + } + } + if ($exclude) { + unless ((ref($toskip) eq 'HASH') && ($toskip->{'symb'})) { + return 0; + } } } @@ -1275,7 +1172,7 @@ sub get_description { } sub show_choices { - my ($r,$symb,$formname,$num,$slots,$consumed_uniqueperiods,$available,$got_slots)=@_; + my ($symb,$formname,$num,$class,$slots,$consumed_uniqueperiods,$available,$got_slots)=@_; my $output; &Apache::lonxml::debug("Checking Slots"); if (!ref($available) eq 'ARRAY') { @@ -1287,8 +1184,11 @@ sub show_choices { $output .= ' '. &mt('Return to last resource').''; } - $r->print($output); - return; + if ($class) { + return ''
.&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.')
@@ -2005,179 +1928,233 @@ sub manage_reservations {
'');
return;
}
- my (%parent,%shownparent,%container,%container_title,%contents);
- my ($depth,$count,$reservable,$lastcontainer,$rownum) = (0,0,0,0,0);
- my @backgrounds = ("LC_odd_row","LC_even_row");
+ my (%output,%slotinfo,%statusbymap,%repsymbs,%shownmaps);
+ my @possibles = $navmap->retrieveResources(undef,
+ sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0);
+
+ foreach my $resource (@possibles) {
+ my ($useslots) = $resource->slot_control();
+ next if (($useslots eq '') || ($useslots =~ /^\s*no\s*$/i));
+ my $symb = $resource->symb();
+ my ($slot_status,$date,$slot_name) = $resource->check_for_slot('0');
+ my ($msg,$get_choices,$slotdescription);
+ my $status = $resource->simpleStatus('0');
+ my ($msg,$get_choices,$slotdescription);
+ if ($slot_name ne '') {
+ my %slot=&Apache::lonnet::get_slot($slot_name);
+ $slotdescription=&get_description($slot_name,\%slot);
+ }
+ if ($slot_status == $resource->NOT_IN_A_SLOT) {
+ $msg=&mt('No current reservation.');
+ $get_choices = 1;
+ } elsif ($slot_status == $resource->NEEDS_CHECKIN) {
+ $msg=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &mt('Access requires proctor validation.');
+ } elsif ($slot_status == $resource->WAITING_FOR_GRADE) {
+ $msg=&mt('Submitted and currently in grading queue.');
+ } elsif ($slot_status == $resource->CORRECT) {
+ $msg=&mt('Problem is unavailable.');
+ } elsif ($slot_status == $resource->RESERVED) {
+ $msg=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &mt('Problem is currently available.');
+ } elsif ($slot_status == $resource->RESERVED_LOCATION) {
+ $msg=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &mt('Problem is available at a different location.');
+ $get_choices = 1;
+ } elsif ($slot_status == $resource->RESERVED_LATER) {
+ $msg=''.&mt('Reserved:').
+ ' '.$slotdescription.'
'.
+ &mt('Problem will be available later.');
+ $get_choices = 1;
+ } elsif ($slot_status == $resource->RESERVABLE) {
+ $msg=&mt('Reservation needed');
+ $get_choices = 1;
+ } elsif ($slot_status == $resource->RESERVABLE_LATER) {
+ $msg=&mt('Reservation needed: will be reservable later.');
+ } elsif ($slot_status == $resource->NOTRESERVABLE) {
+ $msg=&mt('Reservation needed: none available.');
+ } elsif ($slot_status == $resource->UNKNOWN) {
+ $msg=&mt('Unable to determine status due to network problems.');
+ } else {
+ if ($status != $resource->OPEN) {
+ $msg = &Apache::lonnavmaps::getDescription($resource,'0');
+ }
+ }
+ $output{$symb}{'msg'} = $msg;
+ if (($status == $resource->OPEN) && ($get_choices)) {
+ $output{$symb}{'hasaction'} = 1;
+ }
+ my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb);
+ $mapurl = &Apache::lonnet::clutter($mapurl);
+ unless ($mapurl =~ /default\.sequence$/) {
+ $shownmaps{$mapurl} = 1;
+ my $map = $navmap->getResourceByUrl($mapurl);
+ if (ref($map)) {
+ my @pcs = split(/,/,$map->map_hierarchy());
+ shift(@pcs);
+ shift(@pcs);
+ if (@pcs) {
+ map { $shownmaps{$navmap->getByMapPc($_)->src()} = 1; } reverse(@pcs);
+ }
+ }
+ }
+ if (($useslots eq 'map_map') || ($useslots eq 'map')) {
+ if ($slot_status ne '') {
+ if (ref($statusbymap{$mapurl}{$slot_status}) eq 'ARRAY') {
+ push(@{$statusbymap{$mapurl}{$slot_status}},$symb);
+ } else {
+ $statusbymap{$mapurl}{$slot_status} = [$symb];
+ }
+ }
+ }
+ }
+
+ foreach my $mapurl (keys(%statusbymap)) {
+ if (ref($statusbymap{$mapurl}) eq 'HASH') {
+ if (keys(%{$statusbymap{$mapurl}}) == 1) {
+ my @values = values(%{$statusbymap{$mapurl}});
+ my $repsymb = $values[0][0];
+ if (ref($output{$repsymb}) eq 'HASH') {
+ $output{$mapurl}{'msg'} = $output{$repsymb}{'msg'};
+ $output{$mapurl}{'hasaction'} = $output{$repsymb}{'hasaction'};
+ }
+ $repsymbs{$mapurl} = $repsymb;
+ }
+ }
+ }
+
+ my (%parent,%container,%container_title);
+ my ($depth,$count,$reservable,$currcontainer,$rownum,$mapnum,$shown) = (0,0,0,0,0,0,0);
+ my @backgrounds = ("LC_even_row","LC_odd_row");
my $numcolors = scalar(@backgrounds);
my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif");
my $slotheader = '
'. &mt('Your reservation status for any such assignments is listed below:'). '
'. - ''.$spacers.''. + $icon.(' ' x6).' | '."\n"; + if (ref($output{$currmap}) eq 'HASH') { + my $formnum = $mapnum.'_'.$reservable+1; + my $class = 'LC_slotmaptext_'.$mapnum; + if ($output{$currmap}{'hasaction'}) { + $row .= ''. + $output{$currmap}{'msg'}. + ' | '. + &slot_chooser($repsymbs{$currmap},$class,$formnum, + $allavailable,$slots,$consumed_uniqueperiods). + ' | '; + } else { + $row .= ''. + $output{$currmap}{'msg'}. + ' | '; + } + $row .= ''."\n"; } - $r->print(' | ||||
'.$spacers.$icon.(' ' x6).' | '."\n"; } + $r->print($row); } + } + } elsif ($resource == $it->END_MAP()) { + $depth--; + $currcontainer = $parent{$depth}; + } elsif (ref($resource)) { + my $symb = $resource->symb(); + next if (!$resource->is_problem() && !$resource->is_tool() && + !$resource->is_sequence() && !$resource->is_page()); + $count ++; + if (($resource->is_sequence()) || ($resource->is_page())) { + $currcontainer = $count; + $container{$currcontainer} = $resource; + $container_title{$currcontainer} = $resource->compTitle(); + } + if (($resource->is_problem() || $resource->is_tool)) { + next unless (exists($output{$symb})); + $reservable ++; $rownum ++; - my $bgcolor = $backgrounds[$rownum % $numcolors]; if (!$shownheader) { $r->print($slotheader); $shownheader = 1; } - $r->print(' | |||||||
'."\n"); + my $style; + if (exists($output{$currmap})) { + $style = 'none'; + } else { + $style = 'table-row'; + $shown ++; + } + my $title = $resource->compTitle(); + my $bgcolor = $backgrounds[$shown % $numcolors]; + $r->print(' | ||||||||
'); for (my $i=0; $i<$depth; $i++) { $r->print(''); } - my $result = ''. - 'src().'?symb='.$symb.'">'. + ''.$title.''.(' ' x6).' | '; - my $hasaction; - if ($status == $resource->OPEN) { - if ($get_choices) { - $hasaction = 1; - } + $r->print('problem.gif" alt="'.&mt('Problem')); } - if ($hasaction) { - $result .= ''.$msg.' | '. - ''; + $r->print('" />'.$title.''.(' ' x6).' | '); + my $class = 'LC_slottext_'.$mapnum; + if ($output{$symb}{'hasaction'}) { + $r->print(''.$output{$symb}{'msg'}.' | '. + ''. + &slot_chooser($symb,$class,$reservable,$allavailable,$slots, + $consumed_uniqueperiods).' | '); } else { - $result .= ''.$msg.' | '; - } - $r->print($result); - if ($hasaction) { - my @got_slots=&check_for_reservation($symb,'allslots'); - if ($got_slots[0] =~ /^error: /) { - $r->print(''. - &mt('An error occurred determining slot availability.'). - ''); - } else { - my $formname = 'manageres_'.$reservable; - if (ref($allavailable) eq 'ARRAY') { - my @available; - if (ref($slots) eq 'HASH') { - 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; - } - } - push(@available,$slot); - } - } - &show_choices($r,$symb,$formname,$reservable,$slots,$consumed_uniqueperiods, - \@available,\@got_slots); - } - } - $r->print(''); + $r->print(''. + ''.$output{$symb}{'msg'}.''. + ' | '); } - $r->print(''; + my ($depth,$location,$type,$title) = @_; + my $spacers; for (my $i=0; $i<$depth-1; $i++) { - $output .= ''; + $spacers .= ''; } + my $icon; if ($type eq 'page') { - $output .= ' '."\n"; + $icon = ' '."\n"; } else { - $output .= ' '."\n"; + $icon = ' '."\n"; } - $output .= $title.' | '."\n"; - unshift (@{$maprows},$output); - return; + $icon .= $title; + return ($spacers,$icon); +} + +sub slot_chooser { + my ($symb,$class,$formnum,$allavailable,$slots,$consumed_uniqueperiods) = @_; + my $output; + my @got_slots=&check_for_reservation($symb,'allslots'); + if ($got_slots[0] =~ /^error: /) { + $output = ''. + &mt('An error occurred determining slot availability.'). + ''; + } else { + my $formname = 'manageres_'.$formnum; + if (ref($allavailable) eq 'ARRAY') { + my @available; + if (ref($slots) eq 'HASH') { + foreach my $slot (@{$allavailable}) { + # not allowed for this resource + if (ref($slots->{$slot}) eq 'HASH') { + 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); + } + } + $output .= &show_choices($symb,$formname,$formnum,$class, + $slots,$consumed_uniqueperiods, + \@available,\@got_slots); + } + } + return $output; } sub show_reservations { @@ -2222,8 +2248,7 @@ sub show_reservations { $udom = $env{'user.domain'}; } my $formname = 'slotlog'; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my ($cnum,$cdom)=&get_course(); my $crstype = &Apache::loncommon::course_type(); my %log=&Apache::lonnet::dump('nohist_'.$cdom.'_'.$cnum.'_slotlog',$udom,$uname); if ($env{'form.origin'} eq 'aboutme') { @@ -2398,8 +2423,7 @@ sub show_reservations_log { return; } my $formname = 'reservationslog'; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my ($cnum,$cdom)=&get_course(); my %slotlog=&Apache::lonnet::dump('nohist_slotreservationslog',$cdom,$cnum); if ((keys(%slotlog))[0]=~/^error\:/) { undef(%slotlog); } @@ -2894,8 +2918,10 @@ sub csv_upload_map { if (!$env{'form.datatoken'}) { $datatoken=&Apache::loncommon::upfile_store($r); } else { - $datatoken=$env{'form.datatoken'}; - &Apache::loncommon::load_tmp_file($r); + $datatoken=&Apache::loncommon::valid_datatoken($env{'form.datatoken'}); + if ($datatoken ne '') { + &Apache::loncommon::load_tmp_file($r,$datatoken); + } } my @records=&Apache::loncommon::upfile_record_sep(); if ($env{'form.noFirstLine'}) { shift(@records); } @@ -2932,10 +2958,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 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'], @@ -2945,7 +2972,10 @@ sub csvupload_fields { sub csv_upload_assign { my ($r,$mgr)= @_; - &Apache::loncommon::load_tmp_file($r); + my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'}); + if ($datatoken ne '') { + &Apache::loncommon::load_tmp_file($r,$datatoken); + } my @slotdata = &Apache::loncommon::upfile_record_sep(); if ($env{'form.noFirstLine'}) { shift(@slotdata); } my %fields=&Apache::grades::get_fields(); @@ -3050,6 +3080,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+$//; @@ -3274,13 +3309,14 @@ 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; } if ($env{'form.requestattempt'}) { $r->print(' |