--- loncom/interface/lonnavmaps.pm 2022/10/06 16:32:04 1.509.2.14.2.4
+++ loncom/interface/lonnavmaps.pm 2016/03/02 00:51:15 1.513
@@ -1,8 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.509.2.14.2.4 2022/10/06 16:32:04 raeburn Exp $
-
+# $Id: lonnavmaps.pm,v 1.513 2016/03/02 00:51:15 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,31 +937,8 @@ sub render_resource {
# links to open and close the folder
my $whitespace = $location.'/whitespace_21.gif';
- my ($nomodal,$linkopen,$linkclose);
- unless ($resource->is_map() || $params->{'resource_nolink'}) {
- $linkopen = "";
- $linkclose = "";
- 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
my $icon = "
";
@@ -997,12 +966,8 @@ sub render_resource {
if ($it->{CONDITION}) {
$nowOpen = !$nowOpen;
}
- my $folderType;
- if (&advancedUser() && $resource->is_missing_map()) {
- $folderType = 'none';
- } else {
- $folderType = $resource->is_sequence() ? 'folder' : 'page';
- }
+
+ my $folderType = $resource->is_sequence() ? 'folder' : 'page';
my $title=$resource->title;
$title=~s/\"/\&qout;/g;
if (!$params->{'resource_no_folder_link'}) {
@@ -1021,21 +986,16 @@ sub render_resource {
'&jump=' .
&escape($resource->symb()) .
"&folderManip=1\">";
- $linkclose = '';
+
} else {
# Don't allow users to manipulate folder
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif';
$icon = "
"."
";
- if ($params->{'caller'} eq 'sequence') {
- $linkopen = "";
- $linkclose = '';
- } 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';
@@ -1045,33 +1005,10 @@ sub render_resource {
'';
}
}
- if ($params->{'mapHidden'} || $resource->randomout()) {
- $nonLinkedText .= ' ('.&mt('hidden').') ';
- } elsif ($params->{'mapUnlisted'}) {
- $nonLinkedText .= ' ('.&mt('unlisted').') ';
- } elsif ($params->{'mapHiddenDeepLink'} || $resource->deeplinkout()) {
- $nonLinkedText .= ' ('.&mt('not shown').') ';
- }
- } else {
- if ($resource->randomout()) {
- $nonLinkedText .= ' ('.&mt('hidden').') ';
- } elsif ($resource->deeplinkout()) {
- $nonLinkedText .= ' ('.&mt('not shown').') ';
- } else {
- my $deeplink = $resource->deeplink($params->{caller});
- if ((($deeplink eq 'absent') || ($deeplink eq 'grades')) &&
- &advancedUser()) {
- $nonLinkedText .= ' ('.&mt('unlisted').') ';
- } elsif (($deeplink) && ($deeplink) ne 'full') {
- if (&advancedUser()) {
- $nonLinkedText .= ' ('.&mt('deep-link access').
- ') ';
- } else {
- $nonLinkedText .= ' ('.&mt('access via external site').
- ') ';
- }
- }
- }
+ }
+
+ if ($resource->randomout()) {
+ $nonLinkedText .= ' ('.&mt('hidden').') ';
}
if (!$resource->condval()) {
$nonLinkedText .= ' ('.&mt('conditionally hidden').') ';
@@ -1121,19 +1058,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;
}
@@ -1395,46 +1323,12 @@ sub render {
# an infinite loop
my $oldFilterFunc = $filterFunc;
$filterFunc = sub { my $res = shift; return !$res->randomout() &&
- ($res->deeplink($args->{'caller'}) ne 'absent') &&
- ($res->deeplink($args->{'caller'}) ne 'grades') &&
- !$res->deeplinkout() &&
&$oldFilterFunc($res);};
}
my $condition = 0;
if ($env{'form.condition'}) {
$condition = 1;
- } elsif (($env{'request.deeplink.login'}) && ($env{'request.course.id'}) && (!$userCanSeeHidden)) {
- if (!defined($navmap)) {
- $navmap = Apache::lonnavmaps::navmap->new();
- }
- if (defined($navmap)) {
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $symb = &Apache::loncommon::symb_from_tinyurl($env{'request.deeplink.login'},$cnum,$cdom);
- if ($symb) {
- my $deeplink;
- my $res = $navmap->getBySymb($symb);
- if ($res->is_map()) {
- my $mapname = &Apache::lonnet::declutter($res->src());
- $mapname = &Apache::lonnet::deversion($mapname);
- $deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink");
- } else {
- $deeplink = $res->deeplink();
- }
- if ($deeplink ne '') {
- if ((split(/,/,$deeplink))[1] eq 'hide') {
- if ($res->is_map()) {
- map { $filterHash->{$_} = 1 if $_ } split(/,/,$res->map_hierarchy());
- } else {
- my $mapurl = (&Apache::lonnet::decode_symb($symb))[0];
- my $map = $navmap->getResourceByUrl($mapurl);
- map { $filterHash->{$_} = 1 if $_ } split(/,/,$map->map_hierarchy());
- }
- }
- }
- }
- }
}
if (!$env{'form.folderManip'} && !defined($args->{'iterator'})) {
@@ -1458,11 +1352,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)) {
@@ -1522,13 +1415,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'});
}
@@ -1647,8 +1537,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
@@ -1694,46 +1583,41 @@ END
$args->{'indentString'} = setDefault($args->{'indentString'}, "
");
$args->{'displayedHereMarker'} = 0;
- # 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;
+ # 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;
+ }
}
}
}
+ } continue {
+ $curRes = $dfsit->next();
}
- } continue {
- $curRes = $dfsit->next();
}
my $displayedJumpMarker = 0;
@@ -1791,28 +1675,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'}) {
@@ -1848,39 +1710,9 @@ END
}
# If this is an empty sequence and we're filtering them, continue on
- $args->{'mapHidden'} = 0;
- $args->{'mapUnlisted'} = 0;
- $args->{'mapHiddenDeepLink'} = 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;
- }
- } elsif ($curRes->deeplinkout) {
- if ($userCanSeeHidden) {
- $args->{'mapHiddenDeepLink'} = 1;
- } else {
- next;
- }
- } else {
- my $deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink");
- my ($state,$others,$listed) = split(/,/,$deeplink);
- if (($listed eq 'absent') || ($listed eq 'grades')) {
- if ($userCanSeeHidden) {
- $args->{'mapUnlisted'} = 1;
- } else {
- next;
- }
- }
- }
- }
+ if ($curRes->is_map() && $args->{'suppressEmptySequences'} &&
+ !$curRes->{DATA}->{HAS_VISIBLE_CHILDREN}) {
+ next;
}
# If we're suppressing navmaps and this is a navmap, continue on
@@ -1941,16 +1773,7 @@ END
$args->{'condensed'} = 1;
}
}
- }
- # If deep-link parameter is set (and is not set to full) suppress link
- # unless privileged user, tinyurl used for login resolved to a map, and
- # the resource is within the map.
- if ((!$curRes->deeplink($args->{'caller'})) ||
- ($curRes->deeplink($args->{'caller'}) eq 'full') || &advancedUser()) {
- $args->{'resource_nolink'} = 0;
- } else {
- $args->{'resource_nolink'} = 1;
- }
+ }
# If the multipart problem was condensed, "forget" it was multipart
if (scalar(@parts) == 1) {
@@ -1973,35 +1796,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()) || (&Apache::lonnet::waf_allssl($hostname))) {
- 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()) || (&Apache::lonnet::waf_allssl($hostname))) {
- 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.
@@ -2029,7 +1828,7 @@ END
$currentJumpDelta) {
# Jam the anchor after the