[LON-CAPA-cvs] cvs: loncom /interface lonnavmaps.pm

raeburn raeburn at source.lon-capa.org
Mon Mar 28 08:39:44 EDT 2016


raeburn		Mon Mar 28 12:39:44 2016 EDT

  Modified files:              
    /loncom/interface	lonnavmaps.pm 
  Log:
  - Bug 4394. Hide a folder from students for whom hiddenresource parameter
    is set at map level, if nothing accessible within it (or in subfolders).
    Course Coordinators etc. see folder, with (Hidden)
    - Adds about 0.02s to rendering of Course Contents.
  
  
Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.517 loncom/interface/lonnavmaps.pm:1.518
--- loncom/interface/lonnavmaps.pm:1.517	Thu Mar 17 13:20:35 2016
+++ loncom/interface/lonnavmaps.pm	Mon Mar 28 12:39:43 2016
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Navigate Maps Handler
 #
-# $Id: lonnavmaps.pm,v 1.517 2016/03/17 13:20:35 raeburn Exp $
+# $Id: lonnavmaps.pm,v 1.518 2016/03/28 12:39:43 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1005,10 +1005,13 @@
                          '</a>';
             }
         }
-    }
-
-    if ($resource->randomout()) {
-        $nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> ';
+        if ($params->{'mapHidden'} || $resource->randomout()) {
+            $nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> ';
+        }
+    } else {
+        if ($resource->randomout()) {
+            $nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> ';
+        }
     }
     if (!$resource->condval()) {
         $nonLinkedText .= ' <span class="LC_info">('.&mt('conditionally hidden').')</span> ';
@@ -1583,41 +1586,45 @@
     $args->{'indentString'} = setDefault($args->{'indentString'}, "<img src='$location' alt='' />");
     $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;
@@ -1710,9 +1717,21 @@
         } 
 
         # 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
@@ -2790,15 +2809,15 @@
 
 
 
-    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:
 
@@ -2817,15 +2836,18 @@
     my $uname=$self->{USERNAME};
     my $udom=$self->{DOMAIN};
 
-    unless ($symb) { return ['']; }
+    unless ($symb || $mapname) { return; }
     my $result='';
     my ($recursed, at 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;
@@ -2834,7 +2856,6 @@
 
     # Build the hash keys for the lookup:
 
-    my $symbparm=$symb.'.'.$what;
     my $mapparm=$mapname.'___(all).'.$what;
     my $recurseparm=$mapname.'___(rec).'.$what; 
     my $usercourseprefix=$cid;
@@ -2929,9 +2950,12 @@
     }
     # 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;
+        }
     }
 
 




More information about the LON-CAPA-cvs mailing list