--- loncom/interface/slotrequest.pm 2017/12/22 02:00:46 1.136
+++ loncom/interface/slotrequest.pm 2019/06/22 19:07:58 1.140
@@ -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.136 2017/12/22 02:00:46 raeburn Exp $
+# $Id: slotrequest.pm,v 1.140 2019/06/22 19:07:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -465,7 +465,7 @@ sub get_consumed_uniqueperiods {
return 'error: Unable to determine current status';
}
my @problems = $navmap->retrieveResources(undef,
- sub { $_[0]->is_gradable() },1,0);
+ sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0);
my %used_slots;
foreach my $problem (@problems) {
my $symb = $problem->symb();
@@ -805,7 +805,7 @@ sub release_reservation {
if ($passed_resource->is_map()) {
my ($a_resource) =
$navmap->retrieveResources($passed_resource,
- sub {$_[0]->is_gradable()},0,1);
+ sub {$_[0]->is_problem() || $_[0]->is_tool() },0,1);
$symb = $a_resource->symb();
}
} else {
@@ -826,13 +826,39 @@ sub release_reservation {
}
my $new_param = join(':',@new_slots);
+ # 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,$udom,$uname);
+ &Apache::lonxml::debug("use_slots is $use_slots
");
+
+ if (&Apache::lonnet::error($use_slots)) {
+ return (0,'error: Unable to determine current status');
+ }
+
+ my $parm_level = 1;
+ my $parm_symb = $passed_resource->symb();
+ if ($use_slots eq 'map' || $use_slots eq 'map_map') {
+ $parm_level = 2;
+ unless ($passed_resource->is_map()) {
+ my ($map) = &Apache::lonnet::decode_symb($parm_symb);
+ $parm_symb = &Apache::lonnet::symbread($map);
+ }
+ }
+
my ($cnum,$cdom)=&get_course();
- # get slot reservations, check if user has one, if so remove reservation
+ # get slot reservations, check if user has one for the
+ # correct symb, and if so, remove the 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) ) {
+ if (($consumed{$entry}->{'name'} eq $uname.':'.$udom) &&
+ ($consumed{$entry}->{'symb'} eq $parm_symb)) {
&Apache::lonnet::del('slot_reservations',[$entry],
$cdom,$cnum);
my %storehash = (
@@ -841,25 +867,13 @@ sub release_reservation {
action => 'release',
context => $env{'form.context'},
);
- &Apache::lonnet::write_log('slotreservationslog',\%storehash,
- 1,$uname,$udom,$cnum,$cdom);
- &Apache::lonnet::write_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
- 1,$uname,$udom,$uname,$udom);
+ &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);
}
}
- 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 (0,'error: Unable to determine current status');
- }
-
- my $parm_level = 1;
- if ($use_slots eq 'map' || $use_slots eq 'map_map') {
- $parm_level = 2;
- }
# store new parameter string
my $result=&Apache::lonparmset::storeparm_by_symb($symb,
'0_availablestudent',
@@ -938,9 +952,15 @@ sub get_slot {
if ($slot_name && $slot_name ne $conflictable_slot) {
my %slot=&Apache::lonnet::get_slot($slot_name);
my $description1=&get_description($slot_name,\%slot);
+ my $slottype1=$slot{'type'};
%slot=&Apache::lonnet::get_slot($env{'form.slotname'});
my $description2=&get_description($env{'form.slotname'},\%slot);
- if ($slot_name ne $env{'form.slotname'}) {
+ if ($slottype1 eq 'preassigned') {
+ $r->print('
'.&mt('You already have a reservation: "[_1]", assigned by your instructor.', + $description1).'
'. + ''.&mt('Your instructor must unassign it before you can make a new reservation.'). + '
'); + } elsif ($slot_name ne $env{'form.slotname'}) { $r->print(<'
.&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.')
@@ -1921,9 +1942,107 @@ sub manage_reservations {
'');
return;
}
- my (%parent,%shownparent,%container,%container_title,%contents);
- my ($depth,$count,$reservable,$lastcontainer,$rownum,$shown) = (0,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 = '
'. @@ -1931,254 +2050,125 @@ sub manage_reservations { '
'. ''.$spacers.'![]() | '."\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 { - $allstatuses{$output{$symb}{'slotstatus'}} = [$symb]; + $row .= ''. + $output{$currmap}{'msg'}. + ' | '; } + $row .= ''."\n"; } - } - } - } - if (keys(%allstatuses) == 1) { - $got_map_slot = 1; - my $repsymb; - my @values = values(%allstatuses); - if (ref($values[0]) eq 'ARRAY') { - if (ref($output{$values[0][0]}) eq 'HASH') { - $repsymb = $values[0][0]; - } - } - if (($mapitem) && ($repsymb)) { - my $formnum = $mapnum.'_'.$output{$repsymb}{'reservable'}; - my $class = 'LC_slotmaptext_'.$mapnum; - if ($output{$repsymb}{'hasaction'}) { - $mapitem .= ' | '. - $output{$repsymb}{'msg'}. - ' | '. - &slot_chooser($repsymb,$class,$formnum,$allavailable,$slots, - $consumed_uniqueperiods). - ' | '; - } else { - $mapitem .= ''. - $output{$repsymb}{'msg'}. - ' | '; + my ($spacers,$icon) = &show_map_row($depth,$location,$currmaptype,$currmaptitle); + $row .= ''.$spacers.$icon.(' ' x6).' | '."\n"; } - } - my $counter = 0; - foreach my $symb (@ordered) { - if (ref($output{$symb}) eq 'HASH') { - $counter ++; - my $bgcolor = $backgrounds[($output{$symb}{'shown'} + $counter) % $numcolors]; - $currmapoutput .= $output{$symb}{'header'}. - ' '."\n"; - } - } - } else { - my $counter = 0; - foreach my $symb (@ordered) { - if (ref($output{$symb}) eq 'HASH') { - $counter ++; - my $bgcolor = $backgrounds[($output{$symb}{'shown'} + $counter) % $numcolors]; - $currmapoutput .= $output{$symb}{'header'}. - ' |
'.join('',@{$maprows[$i]}).' | '. - '||||||||
'.$maprows[$i][0].
- '![]() | '."\n";
- }
- }
- }
- $output{$symb}{'mapnum'} = $mapnum;
- }
$rownum ++;
- $output{$symb}{'rownum'} = $rownum;
- $output{$symb}{'shown'} = $shown;
if (!$shownheader) {
- $output{$symb}{'header'} = $slotheader;
+ $r->print($slotheader);
$shownheader = 1;
}
- $output{$symb}{'info'} = ''; + 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++) {
- $output{$symb}{'info'} .= '![]() | ';
-
- my $hasaction;
- if ($status == $resource->OPEN) {
- if ($get_choices) {
- $hasaction = 1;
- $output{$symb}{'hasaction'} = $hasaction;
- }
+ $r->print('problem.gif" alt="'.&mt('Problem'));
}
+ $r->print('" />'.$title.''.(' ' x6).'');
my $class = 'LC_slottext_'.$mapnum;
- if ($hasaction) {
- $output{$symb}{'data'} = ''.$msg.' | '. - ''. - &slot_chooser($symb,$class,$reservable,$allavailable,$slots, - $consumed_uniqueperiods).' | '; + if ($output{$symb}{'hasaction'}) { + $r->print(''.$output{$symb}{'msg'}.' | '. + ''. + &slot_chooser($symb,$class,$reservable,$allavailable,$slots, + $consumed_uniqueperiods).' | '); } else { - $output{$symb}{'data'} = ''. - ''.$msg.''. - ' | '; + $r->print(''. + ''.$output{$symb}{'msg'}.''. + ' | '); } + $r->print('