--- loncom/interface/lonnavmaps.pm 2023/01/18 00:53:39 1.509.2.14.2.5 +++ 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.509.2.14.2.5 2023/01/18 00:53:39 raeburn Exp $ - +# $Id: lonnavmaps.pm,v 1.521 2016/06/02 16:03:57 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 = ""."\"".($nowOpen"; - 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'; @@ -1047,30 +1007,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->condval()) { @@ -1121,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; } @@ -1395,49 +1326,15 @@ 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'}) && !$args->{'nocurrloc'}) { + if (!$env{'form.folderManip'} && !defined($args->{'iterator'})) { # Step 1: Check to see if we have a navmap if (!defined($navmap)) { $navmap = Apache::lonnavmaps::navmap->new(); @@ -1458,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)) { @@ -1522,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'}); } @@ -1646,22 +1539,15 @@ END } $result.=''; } - if (($args->{'caller'} eq 'navmapsdisplay') && ($env{'request.course.id'})) { + if (($args->{'caller'} eq 'navmapsdisplay') && + (&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 + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq "uploaded/$cdom/$cnum/default.sequence") { - if ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) || - (&Apache::lonnet::allowed('cev',$env{'request.course.id'}))) { - &add_linkitem($args->{'linkitems'},'edittoplevel', - "javascript:gocmd('/adm/coursedocs','editdocs');", - 'Content Editor'); - } - if ($counter) { - &add_linkitem($args->{'linkitems'},'printout', - "javascript:gopost('/adm/printout','/adm/navmaps');", - 'Prepare a printable document'); - } + &add_linkitem($args->{'linkitems'},'edittoplevel', + "javascript:gocmd('/adm/coursedocs','editdocs');", + 'Content Editor'); } } @@ -1704,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. @@ -1712,7 +1598,6 @@ END $it->{FIRST_RESOURCE}, $it->{FINISH_RESOURCE}, {}, undef, 1); - my $depth = 0; $dfsit->next(); my $curRes = $dfsit->next(); @@ -1720,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; @@ -1797,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'}) { @@ -1855,36 +1718,18 @@ 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); + $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; - } - } } } } @@ -1947,16 +1792,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) { @@ -1979,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()) || (&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. @@ -2035,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"; @@ -2109,7 +1921,7 @@ sub show_linkitems_toolbar { $result .= ''."\n". '