--- loncom/interface/lonnavmaps.pm 2020/07/19 15:48:18 1.509.2.11.2.2
+++ loncom/interface/lonnavmaps.pm 2016/04/04 00:34:37 1.519
@@ -1,8 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.509.2.11.2.2 2020/07/19 15:48:18 raeburn Exp $
-
+# $Id: lonnavmaps.pm,v 1.519 2016/04/04 00:34:37 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -486,7 +485,7 @@ use Apache::lonlocal;
use Apache::lonnet;
use Apache::lonmap;
-use POSIX qw (ceil floor strftime);
+use POSIX qw (floor strftime);
use Time::HiRes qw( gettimeofday tv_interval );
use LONCAPA;
use DateTime();
@@ -577,11 +576,7 @@ sub getLinkForResource {
my $anchor;
if ($res->is_page()) {
foreach my $item (@$stack) { if (defined($item)) { $anchor = $item; } }
- if ($anchor->encrypted() && !&advancedUser()) {
- $anchor='LC_'.$anchor->id();
- } else {
- $anchor=&escape($anchor->shown_symb());
- }
+ $anchor=&escape($anchor->shown_symb());
return ($res->link(),$res->shown_symb(),$anchor);
}
# in case folder was skipped over as "only sequence"
@@ -647,9 +642,6 @@ sub getDescription {
} elsif ($slot_status == $res->RESERVABLE) {
$slotmsg = &mt('Reservable, reservations close [_1]',
timeToHumanString($slot_time,'end'));
- } elsif ($slot_status == $res->NEEDS_CHECKIN) {
- $slotmsg = &mt('Reserved, check-in needed - ends [_1]',
- timeToHumanString($slot_time,'end'));
} elsif ($slot_status == $res->RESERVABLE_LATER) {
$slotmsg = &mt('Reservable, reservations open [_1]',
timeToHumanString($slot_time,'start'));
@@ -945,28 +937,7 @@ sub render_resource {
# links to open and close the folder
my $whitespace = $location.'/whitespace_21.gif';
- my $linkopen = "";
- my $nomodal;
- if (($params->{'modalLink'}) && (!$resource->is_sequence())) {
- if ($link =~m{^(?:|/adm/wrapper)/ext/([^#]+)}) {
- my $exturl = $1;
- if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {
- $nomodal = 1;
- }
- } elsif (($link eq "/public/$LONCAPA::match_domain/$LONCAPA::match_courseid/syllabus") &&
- ($env{'request.course.id'}) && ($ENV{'SERVER_PORT'} == 443) &&
- ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
- $nomodal = 1;
- }
- my $esclink = &js_escape($link);
- if ($nomodal) {
- $linkopen .= "";
- } else {
- $linkopen .= "";
- }
- } else {
- $linkopen .= "";
- }
+ my $linkopen = ""."";
my $linkclose = "";
# Default icon: unknown page
@@ -1020,15 +991,11 @@ sub render_resource {
# Don't allow users to manipulate folder
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif';
$icon = ""."";
- if ($params->{'caller'} eq 'sequence') {
- $linkopen = "";
- } else {
- $linkopen = "";
- $linkclose = "";
- }
+
+ $linkopen = "";
+ $linkclose = "";
}
- if (((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) ||
- (&Apache::lonnet::allowed('cev',$env{'request.course.id'}))) &&
+ if ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) &&
($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/)) {
if (!$params->{'map_no_edit_link'}) {
my $icon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png';
@@ -1094,19 +1061,10 @@ sub render_resource {
}
if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) {
- $linkclose = '';
- if ($params->{'modalLink'}) {
- my $esclink = &js_escape($link);
- if ($nomodal) {
- $linkopen = "";
- } else {
- $linkopen = "";
- }
- } else {
- $linkopen = "";
- }
+ $result .= "$curMarkerBegin$title$partLabel$curMarkerEnd$editmapLink$nonLinkedText";
+ } else {
+ $result .= "$curMarkerBegin$linkopen$title$partLabel$curMarkerEnd$editmapLink$nonLinkedText";
}
- $result .= "$curMarkerBegin$linkopen$title$partLabel$linkclose$curMarkerEnd$editmapLink$nonLinkedText";
return $result;
}
@@ -1397,11 +1355,10 @@ sub render {
my $currenturl = $env{'form.postdata'};
#$currenturl=~s/^http\:\/\///;
#$currenturl=~s/^[^\/]+//;
- unless ($args->{'caller'} eq 'sequence') {
- $here = $jump = &Apache::lonnet::symbread($currenturl);
- }
+
+ $here = $jump = &Apache::lonnet::symbread($currenturl);
}
- if (($here eq '') && ($args->{'caller'} ne 'sequence')) {
+ if ($here eq '') {
my $last;
if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
&GDBM_READER(),0640)) {
@@ -1461,13 +1418,10 @@ sub render {
if ($args->{'iterator_map'}) {
my $map = $args->{'iterator_map'};
$map = $navmap->getResourceByUrl($map);
- if (ref($map)) {
- my $firstResource = $map->map_start();
- my $finishResource = $map->map_finish();
- $args->{'iterator'} = $it = $navmap->getIterator($firstResource, $finishResource, $filterHash, $condition);
- } else {
- return;
- }
+ my $firstResource = $map->map_start();
+ my $finishResource = $map->map_finish();
+
+ $args->{'iterator'} = $it = $navmap->getIterator($firstResource, $finishResource, $filterHash, $condition);
} else {
$args->{'iterator'} = $it = $navmap->getIterator(undef, undef, $filterHash, $condition,undef,$args->{'include_top_level_map'});
}
@@ -1586,8 +1540,7 @@ END
$result.='';
}
if (($args->{'caller'} eq 'navmapsdisplay') &&
- ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) ||
- (&Apache::lonnet::allowed('cev',$env{'request.course.id'})))) {
+ (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
if ($env{'course.'.$env{'request.course.id'}.'.url'} eq
@@ -1637,7 +1590,7 @@ END
# 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.
+ # mark as hidden for users who have $userCanSeeHidden.
# Use DFS for speed, since structure actually doesn't matter,
# except what map has what resources.
@@ -1645,7 +1598,6 @@ END
$it->{FIRST_RESOURCE},
$it->{FINISH_RESOURCE},
{}, undef, 1);
-
my $depth = 0;
$dfsit->next();
my $curRes = $dfsit->next();
@@ -1653,7 +1605,7 @@ END
if ($curRes == $dfsit->BEGIN_MAP()) { $depth++; }
if ($curRes == $dfsit->END_MAP()) { $depth--; }
- if (ref($curRes)) {
+ if (ref($curRes)) {
# Parallel pre-processing: Do sequences have non-filtered-out children?
if ($curRes->is_map()) {
$curRes->{DATA}->{HAS_VISIBLE_CHILDREN} = 0;
@@ -1730,28 +1682,6 @@ END
undef($args->{'sort'});
}
- # Determine if page will be served with https in case
- # it contains a syllabus which uses an external URL
- # which points at an http site.
-
- my ($is_ssl,$cdom,$cnum,$hostname);
- if ($ENV{'SERVER_PORT'} == 443) {
- $is_ssl = 1;
- if ($r) {
- $hostname = $r->hostname();
- } else {
- $hostname = $ENV{'SERVER_NAME'};
- }
- }
- if ($env{'request.course.id'}) {
- $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- }
-
- my $inhibitmenu;
- if ($args->{'modalLink'}) {
- $inhibitmenu = '&inhibitmenu=yes';
- }
while (1) {
if ($args->{'sort'}) {
@@ -1793,7 +1723,7 @@ END
next;
} else {
my $mapname = &Apache::lonnet::declutter($curRes->src());
- $mapname = &Apache::lonnet::deversion($mapname);
+ $mapname = &Apache::lonnet::deversion($mapname);
if (lc($navmap->get_mapparam(undef,$mapname,"0.hiddenresource")) eq 'yes') {
if ($userCanSeeHidden) {
$args->{'mapHidden'} = 1;
@@ -1885,35 +1815,11 @@ END
$stack=$it->getStack();
}
($src,$symb,$anchor)=getLinkForResource($stack);
- my $srcHasQuestion = $src =~ /\?/;
- if ($env{'request.course.id'}) {
- if (($is_ssl) && ($src =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) &&
- ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
- unless (&Apache::lonnet::uses_sts()) {
- if ($hostname ne '') {
- $src = 'http://'.$hostname.$src;
- }
- $src .= ($srcHasQuestion? '&' : '?') . 'usehttp=1';
- $srcHasQuestion = 1;
- }
- } elsif (($is_ssl) && ($src =~ m{^\Q/adm/wrapper/ext/\E(?!https:)})) {
- unless (&Apache::lonnet::uses_sts()) {
- if ($hostname ne '') {
- $src = 'http://'.$hostname.$src;
- }
- $src .= ($srcHasQuestion? '&' : '?') . 'usehttp=1';
- $srcHasQuestion = 1;
- }
- }
- }
if (defined($anchor)) { $anchor='#'.$anchor; }
- if (($args->{'caller'} eq 'sequence') && ($curRes->is_map())) {
- $args->{"resourceLink"} = $src.($srcHasQuestion?'&':'?') .'navmap=1';
- } else {
- $args->{"resourceLink"} = $src.
- ($srcHasQuestion?'&':'?') .
- 'symb=' . &escape($symb).$inhibitmenu.$anchor;
- }
+ my $srcHasQuestion = $src =~ /\?/;
+ $args->{"resourceLink"} = $src.
+ ($srcHasQuestion?'&':'?') .
+ 'symb=' . &escape($symb).$anchor;
}
# Now, we've decided what parts to show. Loop through them and
# show them.
@@ -1941,7 +1847,7 @@ END
$currentJumpDelta) {
# Jam the anchor after the
tag;
# necessary for valid HTML (which Mozilla requires)
- $colHTML =~ s/\>/\>\\<\/a\>/;
+ $colHTML =~ s/\>/\>\/;
$displayedJumpMarker = 1;
}
$result .= $colHTML . "\n";
@@ -2234,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} = {};
@@ -2327,7 +2233,7 @@ sub generate_email_discuss_status {
foreach my $msgid (@keys) {
if ((!$emailstatus{$msgid}) || ($emailstatus{$msgid} eq 'new')) {
my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid,
- $symb,$error) = &Apache::lonmsg::unpackmsgid(&LONCAPA::escape($msgid));
+ $symb,$error) = &Apache::lonmsg::unpackmsgid($msgid);
&Apache::lonenc::check_decrypt(\$symb);
if (($fromcid ne '') && ($fromcid ne $cid)) {
next;
@@ -2699,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) {
@@ -2732,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;
@@ -2766,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']; }
}
@@ -2773,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']; }
}
@@ -2802,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;
@@ -2833,6 +2792,7 @@ sub recurseup_maps {
if (ref($res)) {
my @pcs = split(/,/,$res->map_hierarchy());
shift(@pcs);
+ pop(@pcs);
if (@pcs) {
@recurseup = map { &Apache::lonnet::declutter($self->getByMapPc($_)->src()); } reverse(@pcs);
}
@@ -2841,91 +2801,6 @@ sub recurseup_maps {
return @recurseup;
}
-sub recursed_crumbs {
- my ($self,$mapurl,$restitle) = @_;
- my (@revmapinfo,@revmapres);
- my $mapres = $self->getResourceByUrl($mapurl);
- if (ref($mapres)) {
- @revmapres = map { $self->getByMapPc($_); } split(/,/,$mapres->map_breadcrumbs());
- shift(@revmapres);
- }
- my $allowedlength = 60;
- my $minlength = 5;
- my $allowedtitle = 30;
- if (($env{'environment.icons'} eq 'iconsonly') && (!$env{'browser.mobile'})) {
- $allowedlength = 100;
- $allowedtitle = 70;
- }
- if (length($restitle) > $allowedtitle) {
- $restitle = &truncate_crumb_text($restitle,$allowedtitle);
- }
- my $totallength = length($restitle);
- my @links;
-
- foreach my $map (@revmapres) {
- my $pc = $map->map_pc();
- next if ((!$pc) || ($pc == 1));
- push(@links,$map);
- push(@revmapinfo,{'href' => $env{'request.use_absolute'}.$map->link().'?navmap=1','text' => $map->title(),'no_mt' => 1,});
- $totallength += length($map->title());
- }
- my $numlinks = scalar(@links);
- if ($numlinks) {
- if ($totallength - $allowedlength > 0) {
- my $available = $allowedlength - length($restitle);
- my $avg = POSIX::ceil($available/$numlinks);
- if ($avg < $minlength) {
- $avg = $minlength;
- }
- @revmapinfo = ();
- foreach my $map (@links) {
- my $showntitle = &truncate_crumb_text($map->title(),$avg);
- if ($showntitle ne '') {
- push(@revmapinfo,{'href' => $env{'request.use_absolute'}.$map->link().'?navmap=1','text' => $showntitle,'no_mt' => 1,});
- }
- }
- }
- }
- if ($restitle ne '') {
- push(@revmapinfo,{'text' => $restitle, 'no_mt' => 1});
- }
- return @revmapinfo;
-}
-
-sub truncate_crumb_text {
- my ($title,$limit) = @_;
- my $showntitle = '';
- if (length($title) > $limit) {
- my @words = split(/\b\s*/,$title);
- if (@words == 1) {
- $showntitle = substr($title,0,$limit).' ...';
- } else {
- my $linklength = 0;
- my $num = 0;
- foreach my $word (@words) {
- $linklength += 1+length($word);
- if ($word eq '-') {
- $showntitle =~ s/ $//;
- $showntitle .= $word;
- } elsif ($linklength > $limit) {
- if ($num < @words) {
- $showntitle .= $word.' ...';
- last;
- } else {
- $showntitle .= $word;
- }
- } else {
- $showntitle .= $word.' ';
- }
- }
- $showntitle =~ s/ $//;
- }
- return $showntitle;
- } else {
- return $title;
- }
-}
-
#
# Determines the open/close dates for printing a map that
# encloses a resource.
@@ -2938,7 +2813,7 @@ sub map_printdates {
my $opendate = $self->get_mapparam($res->symb(),'',"$part.printstartdate");
- my $closedate= $self->get_mapparam($res->symb(),'', "$part.printenddate");
+ my $closedate= $self->get_mapparam($res->symb(),'',"$part.printenddate");
return ($opendate, $closedate);
@@ -2968,6 +2843,7 @@ sub get_mapparam {
my $result='';
my ($recursed,@recurseup);
+
# Figure out which map we are in.
if ($symb && !$mapname) {
@@ -2976,21 +2852,25 @@ sub get_mapparam {
$mapname = &Apache::lonnet::deversion($mapname);
}
+
my $rwhat=$what;
$what=~s/^parameter\_//;
$what=~s/\_/\./;
# 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:
@@ -3003,21 +2883,22 @@ sub get_mapparam {
if ($uname and defined($useropt)) {
- if (defined($$useropt{$courselevel})) {
- return $$useropt{$courselevel};
+ if (defined($$useropt{$courselevelm})) {
+ return $$useropt{$courselevelm};
}
- if ($what =~ /\.(encrypturl|hiddenresource)$/) {
- unless ($recursed) {
- @recurseup = $self->recurseup_maps($mapname);
- $recursed = 1;
- }
- foreach my $item (@recurseup) {
- my $norecursechk=$usercourseprefix.'.'.$item.'___(all).'.$what;
- if (defined($$useropt{$norecursechk})) {
- if ($what =~ /\.(encrypturl|hiddenresource)$/) {
- return $$useropt{$norecursechk};
- }
- }
+ 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};
}
}
}
@@ -3027,21 +2908,22 @@ sub get_mapparam {
if ($cgroup ne '' and defined ($courseopt)) {
- if (defined($$courseopt{$grplevel})) {
- return $$courseopt{$grplevel};
+ if (defined($$courseopt{$grplevelm})) {
+ return $$courseopt{$grplevelm};
}
- if ($what =~ /\.(encrypturl|hiddenresource)$/) {
- unless ($recursed) {
- @recurseup = $self->recurseup_maps($mapname);
- $recursed = 1;
- }
- foreach my $item (@recurseup) {
- my $norecursechk=$usercourseprefix.'.['.$cgroup.'].'.$item.'___(all).'.$what;
- if (defined($$courseopt{$norecursechk})) {
- if ($what =~ /\.(encrypturl|hiddenresource)$/) {
- return $$courseopt{$norecursechk};
- }
- }
+ 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};
}
}
}
@@ -3049,25 +2931,23 @@ sub get_mapparam {
# 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 ($what =~ /\.(encrypturl|hiddenresource)$/) {
- unless ($recursed) {
- @recurseup = $self->recurseup_maps($mapname);
- $recursed = 1;
- }
- foreach my $item (@recurseup) {
- my $norecursechk=$usercourseprefix.'.['.$csec.'].'.$item.'___(all).'.$what;
- if (defined($$courseopt{$norecursechk})) {
- if ($what =~ /\.(encrypturl|hiddenresource)$/) {
- return $$courseopt{$norecursechk};
- }
- }
+ 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};
}
}
}
@@ -3077,7 +2957,7 @@ sub get_mapparam {
my $symbparm=$symb.'.'.$what;
my $thisparm = $$parmhash{$symbparm};
if (defined($thisparm)) {
- return $thisparm;
+ return $thisparm;
}
}
@@ -3085,25 +2965,25 @@ sub get_mapparam {
# Additional course parameters:
if (defined($courseopt)) {
- if (defined($$courseopt{$courselevel})) {
- return $$courseopt{$courselevel};
+ if (defined($$courseopt{$courselevelm})) {
+ return $$courseopt{$courselevelm};
}
- if ($what =~ /\.(encrypturl|hiddenresource)$/) {
- unless ($recursed) {
- @recurseup = $self->recurseup_maps($mapname);
- $recursed = 1;
- }
+ unless ($recursed) {
+ @recurseup = $self->recurseup_maps($mapname);
+ $recursed = 1;
+ }
+ if (@recurseup) {
foreach my $item (@recurseup) {
my $norecursechk=$usercourseprefix.'.'.$item.'___(all).'.$what;
- if (defined($$courseopt{$norecursechk})) {
- if ($what =~ /\.(encrypturl|hiddenresource)$/) {
- return $$courseopt{$norecursechk};
- }
+ 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 {
@@ -3145,10 +3025,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};
@@ -3799,8 +3675,7 @@ sub next {
# That ends the main iterator logic. Now, do we want to recurse
# down this map (if this resource is a map)?
if ( ($self->{HERE}->is_sequence() || (!$closeAllPages && $self->{HERE}->is_page())) &&
- (defined($self->{FILTER}->{$self->{HERE}->map_pc()}) xor $self->{CONDITION}) &&
- ($env{'request.role.adv'} || !$self->{HERE}->randomout())) {
+ (defined($self->{FILTER}->{$self->{HERE}->map_pc()}) xor $self->{CONDITION})) {
$self->{RECURSIVE_ITERATOR_FLAG} = 1;
my $firstResource = $self->{HERE}->map_start();
my $finishResource = $self->{HERE}->map_finish();
@@ -4152,7 +4027,7 @@ sub new {
# This is a speed optimization, to avoid calling symb() too often.
$self->{SYMB} = $self->symb();
-
+
return $self;
}
@@ -4278,7 +4153,6 @@ sub enclosing_map_src {
}
sub symb {
my $self=shift;
- if (defined($self->{SYMB})) { return $self->{SYMB}; }
(my $first, my $second) = $self->{ID} =~ /(\d+).(\d+)/;
my $symbSrc = &Apache::lonnet::declutter($self->src());
my $symb = &Apache::lonnet::declutter($self->navHash('map_id_'.$first))
@@ -4549,12 +4423,6 @@ Returns a string with a comma-separated
for the hierarchy of maps containing a map, with the top level
map first, then descending to deeper levels, with the enclosing map last.
-=item * B:
-
-Same as map_hierarchy, except maps containing only a single itemm if
-it's a map, or containing no items are omitted, unless it's the top
-level map (map_pc = 1), which is always included.
-
=back
=cut
@@ -4590,11 +4458,6 @@ sub map_hierarchy {
my $pc = $self->map_pc();
return $self->navHash("map_hierarchy_$pc", 0);
}
-sub map_breadcrumbs {
- my $self = shift;
- my $pc = $self->map_pc();
- return $self->navHash("map_breadcrumbs_$pc", 0);
-}
#####
# Property queries
@@ -4819,12 +4682,11 @@ sub duedate {
my $date;
my @interval=$self->parmval("interval", $part);
my $due_date=$self->parmval("duedate", $part);
- if ($interval[0] =~ /^(\d+)/) {
- my $timelimit = $1;
- my $first_access=&Apache::lonnet::get_first_access($interval[1],
- $self->{SYMB});
+ if ($interval[0] =~ /\d+/) {
+ my $first_access=&Apache::lonnet::get_first_access($interval[1],
+ $self->{SYMB});
if (defined($first_access)) {
- my $interval = $first_access+$timelimit;
+ my $interval = $first_access+$interval[0];
$date = (!$due_date || $interval < $due_date) ? $interval
: $due_date;
} else {
@@ -5700,13 +5562,13 @@ sub check_for_slot {
my $cnum=$env{'course.'.$cid.'.num'};
my $now = time;
my $num_usable_slots = 0;
- my ($checkedin,$checkedinslot,%consumed_uniq,%slots);
if (@slots > 0) {
- %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum);
+ my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum);
if (&Apache::lonnet::error(%slots)) {
return (UNKNOWN);
}
my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime');
+ my ($checkedin,$checkedinslot);
foreach my $slot_name (@sorted_slots) {
next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name}));
my $end = $slots{$slot_name}->{'endtime'};
@@ -5730,7 +5592,7 @@ sub check_for_slot {
($checkedin,$checkedinslot) = $self->checkedin();
unless ((grep(/^\Q$checkedin\E/,@proctors)) &&
($checkedinslot eq $slot_name)) {
- return (NEEDS_CHECKIN,$end,$slot_name);
+ return (NEEDS_CHECKIN,undef,$slot_name);
}
}
return (RESERVED,$end,$slot_name);
@@ -5740,30 +5602,19 @@ sub check_for_slot {
$num_usable_slots ++;
}
}
- my ($is_correct,$wait_for_grade);
+ my ($is_correct,$got_grade);
if ($self->is_task()) {
my $taskstatus = $self->taskstatus();
$is_correct = (($taskstatus eq 'pass') ||
($self->solved() =~ /^correct_/));
- unless ($taskstatus =~ /^(?:pass|fail)$/) {
- $wait_for_grade = 1;
- }
+ $got_grade = ($taskstatus =~ /^(?:pass|fail)$/);
} else {
- unless ($self->completable()) {
- $wait_for_grade = 1;
- }
- unless (($self->problemstatus($part) eq 'no') ||
- ($self->problemstatus($part) eq 'no_feedback_ever')) {
- $is_correct = ($self->solved($part) =~ /^correct_/);
- $wait_for_grade = 0;
- }
+ $got_grade = 1;
+ $is_correct = ($self->solved() =~ /^correct_/);
}
($checkedin,$checkedinslot) = $self->checkedin();
if ($checkedin) {
- if (ref($slots{$checkedinslot}) eq 'HASH') {
- $consumed_uniq{$checkedinslot} = $slots{$checkedinslot}{'uniqueperiod'};
- }
- if ($wait_for_grade) {
+ if (!$got_grade) {
return (WAITING_FOR_GRADE);
} elsif ($is_correct) {
return (CORRECT);
@@ -5776,25 +5627,31 @@ 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'}})) {
my $canuse;
- if (($reservable->{'now'}{$slot}{'symb'} eq '') ||
- ($reservable->{'now'}{$slot}{'symb'} eq $symb)) {
+ if ($reservable->{'now'}{$slot}{'symb'} eq '') {
$canuse = 1;
- }
- if ($canuse) {
- if ($checkedin) {
- if (ref($consumed_uniq{$checkedinslot}) eq 'ARRAY') {
- my ($uniqstart,$uniqend)=@{$consumed_uniq{$checkedinslot}};
- if ($reservable->{'now'}{$slot}{'uniqueperiod'} =~ /^(\d+),(\d+)$/) {
- my ($new_uniq_start,$new_uniq_end) = ($1,$2);
- next if (!
- ($uniqstart < $new_uniq_start && $uniqend < $new_uniq_start) ||
- ($uniqstart > $new_uniq_end && $uniqend > $new_uniq_end ));
+ } 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'});
}
}
@@ -5802,22 +5659,29 @@ sub check_for_slot {
if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) {
foreach my $slot (@{$reservable->{'future_order'}}) {
my $canuse;
- if (($reservable->{'future'}{$slot}{'symb'} eq '') ||
- ($reservable->{'future'}{$slot}{'symb'} eq $symb)) {
+ if ($reservable->{'future'}{$slot}{'symb'} eq '') {
$canuse = 1;
- }
- if ($canuse) {
- if ($checkedin) {
- if (ref($consumed_uniq{$checkedinslot}) eq 'ARRAY') {
- my ($uniqstart,$uniqend)=@{$consumed_uniq{$checkedinslot}};
- if ($reservable->{'future'}{$slot}{'uniqueperiod'} =~ /^(\d+),(\d+)$/) {
- my ($new_uniq_start,$new_uniq_end) = ($1,$2);
- next if (!
- ($uniqstart < $new_uniq_start && $uniqend < $new_uniq_start) ||
- ($uniqstart > $new_uniq_end && $uniqend > $new_uniq_end ));
+ } 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'});
}
}
|