--- loncom/interface/lonnavmaps.pm 2015/06/19 15:36:53 1.508
+++ loncom/interface/lonnavmaps.pm 2016/06/02 16:03:57 1.521
@@ -1,8 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.508 2015/06/19 15:36:53 damieng Exp $
-
+# $Id: lonnavmaps.pm,v 1.521 2016/06/02 16:03:57 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -624,44 +623,52 @@ sub getDescription {
if ($status == $res->OPEN_LATER) {
return &mt("Open [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($open,'start'),$res->symb(),'opendate',$part));
}
+ my $slotinfo;
if ($res->simpleStatus($part) == $res->OPEN) {
unless (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) {
my ($slot_status,$slot_time,$slot_name)=$res->check_for_slot($part);
+ my $slotmsg;
if ($slot_status == $res->UNKNOWN) {
- return &mt('Reservation status unknown');
+ $slotmsg = &mt('Reservation status unknown');
} elsif ($slot_status == $res->RESERVED) {
- return &mt('Reserved - ends [_1]',
+ $slotmsg = &mt('Reserved - ends [_1]',
timeToHumanString($slot_time,'end'));
} elsif ($slot_status == $res->RESERVED_LOCATION) {
- return &mt('Reserved - specific location(s) - ends [_1]',
+ $slotmsg = &mt('Reserved - specific location(s) - ends [_1]',
timeToHumanString($slot_time,'end'));
} elsif ($slot_status == $res->RESERVED_LATER) {
- return &mt('Reserved - next open [_1]',
+ $slotmsg = &mt('Reserved - next open [_1]',
timeToHumanString($slot_time,'start'));
} elsif ($slot_status == $res->RESERVABLE) {
- return &mt('Reservable, reservations close [_1]',
+ $slotmsg = &mt('Reservable, reservations close [_1]',
timeToHumanString($slot_time,'end'));
} elsif ($slot_status == $res->RESERVABLE_LATER) {
- return &mt('Reservable, reservations open [_1]',
+ $slotmsg = &mt('Reservable, reservations open [_1]',
timeToHumanString($slot_time,'start'));
} elsif ($slot_status == $res->NOT_IN_A_SLOT) {
- return &mt('Reserve a time/place to work');
+ $slotmsg = &mt('Reserve a time/place to work');
} elsif ($slot_status == $res->NOTRESERVABLE) {
- return &mt('Reservation not available');
+ $slotmsg = &mt('Reservation not available');
} elsif ($slot_status == $res->WAITING_FOR_GRADE) {
- return &mt('Submission in grading queue');
+ $slotmsg = &mt('Submission in grading queue');
+ }
+ if ($slotmsg) {
+ if ($res->is_task() || !$due) {
+ return $slotmsg;
+ }
+ $slotinfo = (' ' x 2).'('.$slotmsg.')';
}
}
}
if ($status == $res->OPEN) {
if ($due) {
if ($res->is_practice()) {
- return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part));
+ return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part)).$slotinfo;
} else {
- return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part));
+ return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)).$slotinfo;
}
} else {
- return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part);
+ return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo;
}
}
if ($status == $res->PAST_DUE_ANSWER_LATER) {
@@ -907,6 +914,9 @@ sub render_resource {
my $nonLinkedText = ''; # stuff after resource title not in link
my $link = $params->{"resourceLink"};
+ if ($resource->ext()) {
+ $link =~ s/\#.+(\?)/$1/g;
+ }
# The URL part is not escaped at this point, but the symb is...
@@ -995,10 +1005,13 @@ sub render_resource {
'';
}
}
- }
-
- if ($resource->randomout()) {
- $nonLinkedText .= ' ('.&mt('hidden').') ';
+ if ($params->{'mapHidden'} || $resource->randomout()) {
+ $nonLinkedText .= ' ('.&mt('hidden').') ';
+ }
+ } else {
+ if ($resource->randomout()) {
+ $nonLinkedText .= ' ('.&mt('hidden').') ';
+ }
}
if (!$resource->condval()) {
$nonLinkedText .= ' ('.&mt('conditionally hidden').') ';
@@ -1573,41 +1586,45 @@ END
$args->{'indentString'} = setDefault($args->{'indentString'}, "
");
$args->{'displayedHereMarker'} = 0;
- # If we're suppressing empty sequences, look for them here. Use DFS for speed,
- # since structure actually doesn't matter, except what map has what resources.
- if ($args->{'suppressEmptySequences'}) {
- my $dfsit = Apache::lonnavmaps::DFSiterator->new($navmap,
- $it->{FIRST_RESOURCE},
- $it->{FINISH_RESOURCE},
- {}, undef, 1);
- my $depth = 0;
- $dfsit->next();
- my $curRes = $dfsit->next();
- while ($depth > -1) {
- if ($curRes == $dfsit->BEGIN_MAP()) { $depth++; }
- if ($curRes == $dfsit->END_MAP()) { $depth--; }
-
- if (ref($curRes)) {
- # Parallel pre-processing: Do sequences have non-filtered-out children?
- if ($curRes->is_map()) {
- $curRes->{DATA}->{HAS_VISIBLE_CHILDREN} = 0;
- # Sequences themselves do not count as visible children,
- # unless those sequences also have visible children.
- # This means if a sequence appears, there's a "promise"
- # that there's something under it if you open it, somewhere.
- } else {
- # Not a sequence: if it's filtered, ignore it, otherwise
- # rise up the stack and mark the sequences as having children
- if (&$filterFunc($curRes)) {
- for my $sequence (@{$dfsit->getStack()}) {
- $sequence->{DATA}->{HAS_VISIBLE_CHILDREN} = 1;
- }
+ # If we're suppressing empty sequences, look for them here.
+ # We also do this even if $args->{'suppressEmptySequences'}
+ # is not true, so we can hide empty sequences for which the
+ # hiddenresource parameter is set to yes (at map level), or
+ # mark as hidden for users who have $userCanSeeHidden.
+ # Use DFS for speed, since structure actually doesn't matter,
+ # except what map has what resources.
+
+ my $dfsit = Apache::lonnavmaps::DFSiterator->new($navmap,
+ $it->{FIRST_RESOURCE},
+ $it->{FINISH_RESOURCE},
+ {}, undef, 1);
+ my $depth = 0;
+ $dfsit->next();
+ my $curRes = $dfsit->next();
+ while ($depth > -1) {
+ if ($curRes == $dfsit->BEGIN_MAP()) { $depth++; }
+ if ($curRes == $dfsit->END_MAP()) { $depth--; }
+
+ if (ref($curRes)) {
+ # Parallel pre-processing: Do sequences have non-filtered-out children?
+ if ($curRes->is_map()) {
+ $curRes->{DATA}->{HAS_VISIBLE_CHILDREN} = 0;
+ # Sequences themselves do not count as visible children,
+ # unless those sequences also have visible children.
+ # This means if a sequence appears, there's a "promise"
+ # that there's something under it if you open it, somewhere.
+ } elsif ($curRes->src()) {
+ # Not a sequence: if it's filtered, ignore it, otherwise
+ # rise up the stack and mark the sequences as having children
+ if (&$filterFunc($curRes)) {
+ for my $sequence (@{$dfsit->getStack()}) {
+ $sequence->{DATA}->{HAS_VISIBLE_CHILDREN} = 1;
}
}
}
- } continue {
- $curRes = $dfsit->next();
}
+ } continue {
+ $curRes = $dfsit->next();
}
my $displayedJumpMarker = 0;
@@ -1700,9 +1717,21 @@ END
}
# If this is an empty sequence and we're filtering them, continue on
- if ($curRes->is_map() && $args->{'suppressEmptySequences'} &&
- !$curRes->{DATA}->{HAS_VISIBLE_CHILDREN}) {
- next;
+ $args->{'mapHidden'} = 0;
+ if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) {
+ if ($args->{'suppressEmptySequences'}) {
+ next;
+ } else {
+ my $mapname = &Apache::lonnet::declutter($curRes->src());
+ $mapname = &Apache::lonnet::deversion($mapname);
+ if (lc($navmap->get_mapparam(undef,$mapname,"0.hiddenresource")) eq 'yes') {
+ if ($userCanSeeHidden) {
+ $args->{'mapHidden'} = 1;
+ } else {
+ next;
+ }
+ }
+ }
}
# If we're suppressing navmaps and this is a navmap, continue on
@@ -2111,7 +2140,7 @@ sub change_user {
- # Now clear the parm cache and reconstruct the parm hash fromt he big_hash
+ # Now clear the parm cache and reconstruct the parm hash from the big_hash
# param.xxxx keys.
$self->{PARM_CACHE} = {};
@@ -2576,6 +2605,7 @@ sub parmval {
return $self->{PARM_CACHE}->{$hashkey};
}
}
+
my $result = $self->parmval_real($what, $symb, $recurse);
$self->{PARM_CACHE}->{$hashkey} = $result;
if (wantarray) {
@@ -2609,29 +2639,35 @@ sub parmval_real {
my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);
$mapname = &Apache::lonnet::deversion($mapname);
+ my ($recursed,@recurseup);
+
# ----------------------------------------------------- Cascading lookup scheme
my $rwhat=$what;
$what=~s/^parameter\_//;
$what=~s/\_/\./;
my $symbparm=$symb.'.'.$what;
+ my $recurseparm=$mapname.'___(rec).'.$what;
my $mapparm=$mapname.'___(all).'.$what;
my $usercourseprefix=$cid;
-
+
my $grplevel=$usercourseprefix.'.['.$cgroup.'].'.$what;
my $grplevelr=$usercourseprefix.'.['.$cgroup.'].'.$symbparm;
+ my $grpleveli=$usercourseprefix.'.['.$cgroup.'].'.$recurseparm;
my $grplevelm=$usercourseprefix.'.['.$cgroup.'].'.$mapparm;
my $seclevel= $usercourseprefix.'.['.$csec.'].'.$what;
my $seclevelr=$usercourseprefix.'.['.$csec.'].'.$symbparm;
+ my $secleveli=$usercourseprefix.'.['.$csec.'].'.$recurseparm;
my $seclevelm=$usercourseprefix.'.['.$csec.'].'.$mapparm;
my $courselevel= $usercourseprefix.'.'.$what;
my $courselevelr=$usercourseprefix.'.'.$symbparm;
+ my $courseleveli=$usercourseprefix.'.'.$recurseparm;
my $courselevelm=$usercourseprefix.'.'.$mapparm;
@@ -2643,6 +2679,17 @@ sub parmval_real {
if ($uname and defined($useropt)) {
if (defined($$useropt{$courselevelr})) { return [$$useropt{$courselevelr},'resource']; }
if (defined($$useropt{$courselevelm})) { return [$$useropt{$courselevelm},'map']; }
+ if (defined($$useropt{$courseleveli})) { return [$$useropt{$courseleveli},'map']; }
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ foreach my $item (@recurseup) {
+ my $norecursechk=$usercourseprefix.'.'.$item.'___(all).'.$what;
+ last if (defined($$useropt{$norecursechk}));
+ my $recursechk=$usercourseprefix.'.'.$item.'___(rec).'.$what;
+ if (defined($$useropt{$recursechk})) { return [$$useropt{$recursechk},'map']; }
+ }
if (defined($$useropt{$courselevel})) { return [$$useropt{$courselevel},'course']; }
}
@@ -2650,12 +2697,34 @@ sub parmval_real {
if ($cgroup ne '' and defined($courseopt)) {
if (defined($$courseopt{$grplevelr})) { return [$$courseopt{$grplevelr},'resource']; }
if (defined($$courseopt{$grplevelm})) { return [$$courseopt{$grplevelm},'map']; }
+ if (defined($$courseopt{$grpleveli})) { return [$$courseopt{$grpleveli},'map']; }
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ foreach my $item (@recurseup) {
+ my $norecursechk=$usercourseprefix.'.['.$cgroup.'].'.$item.'___(all).'.$what;
+ last if (defined($$courseopt{$norecursechk}));
+ my $recursechk=$usercourseprefix.'.['.$cgroup.'].'.$item.'___(rec).'.$what;
+ if (defined($$courseopt{$recursechk})) { return [$$courseopt{$recursechk},'map']; }
+ }
if (defined($$courseopt{$grplevel})) { return [$$courseopt{$grplevel},'course']; }
}
- if ($csec and defined($courseopt)) {
+ if ($csec ne '' and defined($courseopt)) {
if (defined($$courseopt{$seclevelr})) { return [$$courseopt{$seclevelr},'resource']; }
if (defined($$courseopt{$seclevelm})) { return [$$courseopt{$seclevelm},'map']; }
+ if (defined($$courseopt{$secleveli})) { return [$$courseopt{$secleveli},'map']; }
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ foreach my $item (@recurseup) {
+ my $norecursechk=$usercourseprefix.'.['.$csec.'].'.$item.'___(all).'.$what;
+ last if (defined($$courseopt{$norecursechk}));
+ my $recursechk=$usercourseprefix.'.['.$csec.'].'.$item.'___(rec).'.$what;
+ if (defined($$courseopt{$recursechk})) { return [$$courseopt{$recursechk},'map']; }
+ }
if (defined($$courseopt{$seclevel})) { return [$$courseopt{$seclevel},'course']; }
}
@@ -2679,6 +2748,19 @@ sub parmval_real {
# --------------------------------------------------- fifth, check more course
if (defined($courseopt)) {
if (defined($$courseopt{$courselevelm})) { return [$$courseopt{$courselevelm},'map']; }
+ if (defined($$courseopt{$courseleveli})) { return [$$courseopt{$courseleveli},'map']; }
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ foreach my $item (@recurseup) {
+ my $norecursechk=$usercourseprefix.'.'.$item.'___(all).'.$what;
+ last if (defined($$courseopt{$norecursechk}));
+ my $recursechk=$usercourseprefix.'.'.$item.'___(rec).'.$what;
+ if (defined($$courseopt{$recursechk})) {
+ return [$$courseopt{$recursechk},'map'];
+ }
+ }
if (defined($$courseopt{$courselevel})) {
my $ret = [$$courseopt{$courselevel},'course'];
return $ret;
@@ -2701,6 +2783,23 @@ sub parmval_real {
if (defined($pack_def)) { return [$pack_def,'resource']; }
return [''];
}
+
+sub recurseup_maps {
+ my ($self,$mapname) = @_;
+ my @recurseup;
+ if ($mapname) {
+ my $res = $self->getResourceByUrl($mapname);
+ if (ref($res)) {
+ my @pcs = split(/,/,$res->map_hierarchy());
+ shift(@pcs);
+ if (@pcs) {
+ @recurseup = map { &Apache::lonnet::declutter($self->getByMapPc($_)->src()); } reverse(@pcs);
+ }
+ }
+ }
+ return @recurseup;
+}
+
#
# Determines the open/close dates for printing a map that
# encloses a resource.
@@ -2712,15 +2811,15 @@ sub map_printdates {
- my $opendate = $self->get_mapparam($res->symb(), "$part.printstartdate");
- my $closedate= $self->get_mapparam($res->symb(), "$part.printenddate");
+ my $opendate = $self->get_mapparam($res->symb(),'',"$part.printstartdate");
+ my $closedate= $self->get_mapparam($res->symb(),'',"$part.printenddate");
return ($opendate, $closedate);
}
sub get_mapparam {
- my ($self, $symb, $what) = @_;
+ my ($self, $symb, $mapname, $what) = @_;
# Ensure the course option hash is populated:
@@ -2739,14 +2838,18 @@ sub get_mapparam {
my $uname=$self->{USERNAME};
my $udom=$self->{DOMAIN};
- unless ($symb) { return ['']; }
+ unless ($symb || $mapname) { return; }
my $result='';
+ my ($recursed,@recurseup);
# Figure out which map we are in.
- my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);
- $mapname = &Apache::lonnet::deversion($mapname);
+ if ($symb && !$mapname) {
+ my ($id,$fn);
+ ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);
+ $mapname = &Apache::lonnet::deversion($mapname);
+ }
my $rwhat=$what;
@@ -2755,15 +2858,18 @@ sub get_mapparam {
# Build the hash keys for the lookup:
- my $symbparm=$symb.'.'.$what;
my $mapparm=$mapname.'___(all).'.$what;
+ my $recurseparm=$mapname.'___(rec).'.$what;
my $usercourseprefix=$cid;
- my $grplevel = "$usercourseprefix.[$cgroup].$mapparm";
- my $seclevel = "$usercourseprefix.[$csec].$mapparm";
- my $courselevel = "$usercourseprefix.$mapparm";
-
+ my $grplevelm = "$usercourseprefix.[$cgroup].$mapparm";
+ my $seclevelm = "$usercourseprefix.[$csec].$mapparm";
+ my $courselevelm = "$usercourseprefix.$mapparm";
+
+ my $grpleveli = "$usercourseprefix.[$cgroup].$recurseparm";
+ my $secleveli = "$usercourseprefix.[$csec].$recurseparm";
+ my $courseleveli = "$usercourseprefix.$recurseparm";
# Get handy references to the hashes we need in $self:
@@ -2776,9 +2882,24 @@ sub get_mapparam {
if ($uname and defined($useropt)) {
- if (defined($$useropt{$courselevel})) {
- return $$useropt{$courselevel};
+ if (defined($$useropt{$courselevelm})) {
+ return $$useropt{$courselevelm};
}
+ if (defined($$useropt{$courseleveli})) {
+ return $$useropt{$courseleveli};
+ }
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ foreach my $item (@recurseup) {
+ my $norecursechk=$usercourseprefix.'.'.$item.'___(all).'.$what;
+ last if (defined($$useropt{$norecursechk}));
+ my $recursechk=$usercourseprefix.'.'.$item.'___(rec).'.$what;
+ if (defined($$useropt{$recursechk})) {
+ return $$useropt{$recursechk};
+ }
+ }
}
# Check course -- group
@@ -2786,38 +2907,82 @@ sub get_mapparam {
if ($cgroup ne '' and defined ($courseopt)) {
- if (defined($$courseopt{$grplevel})) {
- return $$courseopt{$grplevel};
+ if (defined($$courseopt{$grplevelm})) {
+ return $$courseopt{$grplevelm};
}
+ if (defined($$courseopt{$grpleveli})) {
+ return $$courseopt{$grpleveli};
+ }
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ foreach my $item (@recurseup) {
+ my $norecursechk=$usercourseprefix.'.['.$cgroup.'].'.$item.'___(all).'.$what;
+ last if (defined($$courseopt{$norecursechk}));
+ my $recursechk=$usercourseprefix.'.['.$cgroup.'].'.$item.'___(rec).'.$what;
+ if (defined($$courseopt{$recursechk})) {
+ return $$courseopt{$recursechk};
+ }
+ }
}
# Check course -- section
-
-
-
- if ($csec and defined($courseopt)) {
- if (defined($$courseopt{$seclevel})) {
- return $$courseopt{$seclevel};
+ if ($csec ne '' and defined($courseopt)) {
+ if (defined($$courseopt{$seclevelm})) {
+ return $$courseopt{$seclevelm};
}
+ if (defined($$courseopt{$secleveli})) {
+ return $$courseopt{$secleveli};
+ }
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ foreach my $item (@recurseup) {
+ my $norecursechk=$usercourseprefix.'.['.$csec.'].'.$item.'___(all).'.$what;
+ last if (defined($$courseopt{$norecursechk}));
+ my $recursechk=$usercourseprefix.'.['.$csec.'].'.$item.'___(rec).'.$what;
+ if (defined($$courseopt{$recursechk})) {
+ return $$courseopt{$recursechk};
+ }
+ }
}
# Check the map parameters themselves:
- my $thisparm = $$parmhash{$symbparm};
- if (defined($thisparm)) {
- return $thisparm;
+ if ($symb) {
+ my $symbparm=$symb.'.'.$what;
+ my $thisparm = $$parmhash{$symbparm};
+ if (defined($thisparm)) {
+ return $thisparm;
+ }
}
# Additional course parameters:
if (defined($courseopt)) {
- if (defined($$courseopt{$courselevel})) {
- return $$courseopt{$courselevel};
+ if (defined($$courseopt{$courselevelm})) {
+ return $$courseopt{$courselevelm};
}
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ if (@recurseup) {
+ foreach my $item (@recurseup) {
+ my $norecursechk=$usercourseprefix.'.'.$item.'___(all).'.$what;
+ last if (defined($$courseopt{$norecursechk}));
+ my $recursechk=$usercourseprefix.'.'.$item.'___(rec).'.$what;
+ if (defined($$courseopt{$recursechk})) {
+ return $$courseopt{$recursechk};
+ }
+ }
+ }
}
- return undef; # Unefined if we got here.
+ return undef; # Undefined if we got here.
}
sub course_printdates {
@@ -2859,10 +3024,6 @@ sub getcourseparam {
$what=~s/^parameter\_//;
$what=~s/\_/\./;
-
- my $symbparm = $symb . '.' . $what;
- my $mapparm=$mapname.'___(all).'.$what;
-
# Local refs to the hashes we're going to look at:
my $useropt = $self->{USER_OPT};
@@ -2871,7 +3032,7 @@ sub getcourseparam {
#
# We want the course level stuff from the way
# parmval_real operates
- # TODO: Fator some of this stuff out of
+ # TODO: Factor some of this stuff out of
# both parmval_real and here
#
my $courselevel = $cid . '.' . $what;
@@ -2888,7 +3049,7 @@ sub getcourseparam {
}
# Try for the group's course level option:
- if ($uname ne '' and defined($courseopt)) {
+ if ($cgroup ne '' and defined($courseopt)) {
if (defined($$courseopt{$grplevel})) {
return $$courseopt{$grplevel};
}
@@ -2896,12 +3057,12 @@ sub getcourseparam {
# Try for section level parameters:
- if ($csec and defined($courseopt)) {
+ if ($csec ne '' and defined($courseopt)) {
if (defined($$courseopt{$seclevel})) {
return $$courseopt{$seclevel};
}
}
- # Try for 'additional' course parameterse:
+ # Try for 'additional' course parameters:
if (defined($courseopt)) {
if (defined($$courseopt{$courselevel})) {
@@ -3865,7 +4026,7 @@ sub new {
# This is a speed optimization, to avoid calling symb() too often.
$self->{SYMB} = $self->symb();
-
+
return $self;
}
@@ -4520,11 +4681,12 @@ sub duedate {
my $date;
my @interval=$self->parmval("interval", $part);
my $due_date=$self->parmval("duedate", $part);
- if ($interval[0] =~ /\d+/) {
- my $first_access=&Apache::lonnet::get_first_access($interval[1],
- $self->symb);
+ if ($interval[0] =~ /^(\d+)/) {
+ my $timelimit = $1;
+ my $first_access=&Apache::lonnet::get_first_access($interval[1],
+ $self->{SYMB});
if (defined($first_access)) {
- my $interval = $first_access+$interval[0];
+ my $interval = $first_access+$timelimit;
$date = (!$due_date || $interval < $due_date) ? $interval
: $due_date;
} else {
@@ -4604,7 +4766,7 @@ sub part_display {
my $self= shift(); my $partID = shift();
if (! defined($partID)) { $partID = '0'; }
my $display=&Apache::lonnet::EXT('resource.'.$partID.'.display',
- $self->symb);
+ $self->{SYMB});
if (! defined($display) || $display eq '') {
$display = $partID;
}
@@ -5465,18 +5627,61 @@ sub check_for_slot {
my $reservable = &Apache::lonnet::get_reservable_slots($cnum,$cdom,$env{'user.name'},
$env{'user.domain'});
if (ref($reservable) eq 'HASH') {
+ my ($map) = &Apache::lonnet::decode_symb($symb);
if ((ref($reservable->{'now_order'}) eq 'ARRAY') && (ref($reservable->{'now'}) eq 'HASH')) {
foreach my $slot (reverse (@{$reservable->{'now_order'}})) {
- if (($reservable->{'now'}{$slot}{'symb'} eq '') ||
- ($reservable->{'now'}{$slot}{'symb'} eq $symb)) {
+ my $canuse;
+ if ($reservable->{'now'}{$slot}{'symb'} eq '') {
+ $canuse = 1;
+ } else {
+ my %oksymbs;
+ my @slotsymbs = split(/\s*,\s*/,$reservable->{'now'}{$slot}{'symb'});
+ map { $oksymbs{$_} = 1; } @slotsymbs;
+ if ($oksymbs{$symb}) {
+ $canuse = 1;
+ } else {
+ foreach my $item (@slotsymbs) {
+ if ($item =~ /\.(page|sequence)$/) {
+ (undef,undef, my $sloturl) = &Apache::lonnet::decode_symb($item);
+ if (($map ne '') && ($map eq $sloturl)) {
+ $canuse = 1;
+ last;
+ }
+ }
+ }
+ }
+ }
+ if ($canuse) {
return(RESERVABLE,$reservable->{'now'}{$slot}{'endreserve'});
}
}
}
if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) {
foreach my $slot (@{$reservable->{'future_order'}}) {
- if (($reservable->{'future'}{$slot}{'symb'} eq '') ||
- ($reservable->{'future'}{$slot}{'symb'} eq $symb)) {
+ my $canuse;
+ if ($reservable->{'future'}{$slot}{'symb'} eq '') {
+ $canuse = 1;
+ } elsif ($reservable->{'future'}{$slot}{'symb'} =~ /,/) {
+ my %oksymbs;
+ my @slotsymbs = split(/\s*,\s*/,$reservable->{'future'}{$slot}{'symb'});
+ map { $oksymbs{$_} = 1; } @slotsymbs;
+ if ($oksymbs{$symb}) {
+ $canuse = 1;
+ } else {
+ foreach my $item (@slotsymbs) {
+ if ($item =~ /\.(page|sequence)$/) {
+ (undef,undef, my $sloturl) = &Apache::lonnet::decode_symb($item);
+ if (($map ne '') && ($map eq $sloturl)) {
+ $canuse = 1;
+ last;
+ }
+ }
+ }
+ }
+ } elsif ($reservable->{'future'}{$slot}{'symb'} eq $symb) {
+ $canuse = 1;
+ }
+ if ($canuse) {
return(RESERVABLE_LATER,$reservable->{'future'}{$slot}{'startreserve'});
}
}