--- loncom/interface/lonnavmaps.pm 2022/07/08 16:10:35 1.509.2.14.2.3 +++ loncom/interface/lonnavmaps.pm 2022/03/25 22:12:52 1.509.2.14.4.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.509.2.14.2.3 2022/07/08 16:10:35 raeburn Exp $ +# $Id: lonnavmaps.pm,v 1.509.2.14.4.1 2022/03/25 22:12:52 raeburn Exp $ # # Copyright Michigan State University Board of Trustees @@ -945,31 +945,29 @@ 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://})) { + 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; } - my $esclink = &js_escape($link); - if ($nomodal) { - $linkopen .= ""; - } else { - $linkopen .= ""; - } + } 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 .= ""; + $linkopen .= ""; } + } else { + $linkopen .= ""; } + my $linkclose = ""; # Default icon: unknown page my $icon = ""; @@ -1017,14 +1015,13 @@ 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 = ""; @@ -1043,30 +1040,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()) { @@ -1391,46 +1368,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'})) { @@ -1845,8 +1788,6 @@ 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; @@ -1859,22 +1800,6 @@ END } 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; - } - } } } } @@ -1937,16 +1862,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) { @@ -2512,7 +2428,7 @@ sub getIterator { my $self = shift; my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift, shift, undef, shift, - shift, shift, shift); + shift, shift); return $iterator; } @@ -3478,7 +3394,7 @@ getIterator behaves as follows: =over 4 -=item * B(firstResource, finishResource, filterHash, condition, forceTop, returnTopMap, $deeplinklisted): +=item * B(firstResource, finishResource, filterHash, condition, forceTop, returnTopMap): All parameters are optional. firstResource is a resource reference corresponding to where the iterator should start. It defaults to @@ -3495,10 +3411,7 @@ that is not just a single, 'redirecting' will return all information, starting with the top-level map, regardless of content. returnTopMap, if true (default false), will cause the iterator to return the top-level map object (resource 0.0) -before anything else. deeplinklisted if true (default false), will -check "listed" status of a resource with a deeplink, and unless "absent" -will exclude deeplink checking when retrieving the browsePriv from -lonnet::allowed(). +before anything else. Thus, by default, only top-level resources will be shown. Change the condition to a 1 without changing the hash, and all resources will be @@ -3635,10 +3548,6 @@ sub new { # have we done that yet? $self->{HAVE_RETURNED_0} = 0; - # Do we want to check the "listed" status for a resource for which - # deeplinking applies. - $self->{DEEPLINKLISTED} = shift; - # Now, we need to pre-process the map, by walking forward and backward # over the parts of the map we're going to look at. @@ -3730,8 +3639,7 @@ sub new { $finishResource, $self->{FILTER}, $self->{ALREADY_SEEN}, $self->{CONDITION}, - $self->{FORCE_TOP}, - undef,$self->{DEEPLINKLISTED}); + $self->{FORCE_TOP}); } # Set up some bookkeeping information. @@ -3901,14 +3809,13 @@ sub next { $finishResource, $self->{FILTER}, $self->{ALREADY_SEEN}, $self->{CONDITION}, - $self->{FORCE_TOP}, - undef,$self->{DEEPLINKLISTED}); + $self->{FORCE_TOP}); } # If this is a blank resource, don't actually return it. # Should you ever find you need it, make sure to add an option to the code # that you can use; other things depend on this behavior. - my $browsePriv = $self->{HERE}->browsePriv($noblockcheck,$self->{DEEPLINKLISTED}); + my $browsePriv = $self->{HERE}->browsePriv($noblockcheck); if (!$self->{HERE}->src() || (!($browsePriv eq 'F') && !($browsePriv eq '2')) ) { return $self->next($closeAllPages); @@ -4336,7 +4243,6 @@ sub from { my $self=shift; return $self- sub goesto { my $self=shift; return $self->navHash("goesto_", 1); } sub kind { my $self=shift; return $self->navHash("kind_", 1); } sub randomout { my $self=shift; return $self->navHash("randomout_", 1); } -sub deeplinkout { my $self=shift; return $self->navHash("deeplinkout_", 1); } sub randompick { my $self = shift; my $randompick = $self->parmval('randompick'); @@ -4592,6 +4498,7 @@ sub is_task { sub is_empty_sequence { my $self=shift; + my $src = $self->src(); return !$self->is_page() && $self->navHash("is_map_", 1) && !$self->navHash("map_type_" . $self->map_pc()); } @@ -4912,10 +4819,10 @@ sub duedate { my $date; my @interval=$self->parmval("interval", $part); my $due_date=$self->parmval("duedate", $part); - if ($interval[0] =~ /(\d+)/) { + if ($interval[0] =~ /^(\d+)/) { my $timelimit = $1; my $first_access=&Apache::lonnet::get_first_access($interval[1], - $self->{SYMB}); + $self->{SYMB}); if (defined($first_access)) { my $interval = $first_access+$timelimit; $date = (!$due_date || $interval < $due_date) ? $interval @@ -5011,46 +4918,6 @@ sub slot_control { my $available = $self->parmval("available", $part); return ($useslots,$availablestudent,$available); } -sub deeplink { - my ($self,$caller,$action) = @_; - my $deeplink = $self->parmval("deeplink"); - if ($deeplink) { - my ($state,$others,$listed,$scope) = split(/,/,$deeplink); - if ($action eq 'getlisted') { - return $listed; - } - if ($env{'request.deeplink.login'}) { - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom); - if ($deeplink_symb) { - my ($loginmap,$mapname); - if ($deeplink_symb =~ /\.(page|sequence)$/) { - $mapname = $self->enclosing_map_src(); - $loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[2]); - return if ($mapname eq $loginmap); - } else { - return if ($deeplink_symb eq $self->symb()); - if (($scope eq 'map') || ($scope eq 'rec')) { - $mapname = $self->enclosing_map_src(); - $loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[0]); - return if ($mapname eq $loginmap); - } - } - if ($scope eq 'rec') { - my $map_pc = $self->navHash('map_pc_'.$mapname); - my @recurseup = split(/,/,$self->navHash('map_hierarchy_'.$map_pc)); - my $login_pc = $self->navHash('map_pc_'.$loginmap); - return if (grep(/^\Q$login_pc\E$/,@recurseup)); - } - } - } - unless (($caller eq 'sequence') || ($state eq 'both')) { - return $listed; - } - } - return; -} # Multiple things need this sub getReturnHash { @@ -6182,23 +6049,13 @@ sub getPrevious { sub browsePriv { my $self = shift; my $noblockcheck = shift; - my $deeplinklisted = shift; if (defined($self->{BROWSE_PRIV})) { return $self->{BROWSE_PRIV}; } - my ($nodeeplinkcheck,$nodeeplinkout); - if ($deeplinklisted) { - my $deeplink = $self->deeplink(undef,'getlisted'); - if (($deeplink) && ($deeplink ne 'absent')) { - $nodeeplinkcheck = 1; - } - $nodeeplinkout = 1; - } + $self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(), $self->{SYMB},undef, - undef,$noblockcheck, - undef,$nodeeplinkcheck, - $nodeeplinkout); + undef,$noblockcheck); } =pod