--- loncom/interface/lonrelrequtils.pm	2015/09/13 21:48:05	1.4
+++ loncom/interface/lonrelrequtils.pm	2018/01/02 14:43:17	1.6
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 # The LearningOnline Network
 #
-# $Id: lonrelrequtils.pm,v 1.4 2015/09/13 21:48:05 raeburn Exp $
+# $Id: lonrelrequtils.pm,v 1.6 2018/01/02 14:43:17 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -265,30 +265,37 @@ use LONCAPA qw(:DEFAULT :match);
 
 sub init_global_hashes {
     %Apache::lonrelrequtils::checkparms = ();
-    %Apache::lonrelrequtils::checkparmsmatch = ();
+    %Apache::lonrelrequtils::checkparmvalsmatch = ();
+    %Apache::lonrelrequtils::checkparmnamesmatch = ();
     %Apache::lonrelrequtils::checkresponsetypes = ();
     %Apache::lonrelrequtils::checkcrstypes = ();
     %Apache::lonrelrequtils::anonsurvey = ();
     %Apache::lonrelrequtils::randomizetry = ();
+    %Apache::lonrelrequtils::exttool = ();
 
     foreach my $key (keys(%Apache::lonnet::needsrelease)) {
-        my ($item,$name,$value,$valuematch) = split(/:/,$key);
+        my ($item,$name,$value,$valuematch,$namematch) = split(/:/,$key);
         if ($item eq 'parameter') {
-            if ($value ne '') {
-                if (ref($Apache::lonrelrequtils::checkparms{$name}) eq 'ARRAY') {
-                    unless(grep(/^\Q$name\E$/,@{$Apache::lonrelrequtils::checkparms{$name}})) {
-                        push(@{$Apache::lonrelrequtils::checkparms{$name}},$value);
+            if ($namematch ne '') {
+                $Apache::lonrelrequtils::checkparmnamesmatch{$namematch} = 1;
+            }
+            if ($name ne '') {
+                if ($value ne '') {
+                    if (ref($Apache::lonrelrequtils::checkparms{$name}) eq 'ARRAY') {
+                        unless(grep(/^\Q$name\E$/,@{$Apache::lonrelrequtils::checkparms{$name}})) {
+                            push(@{$Apache::lonrelrequtils::checkparms{$name}},$value);
+                       }
+                    } else {
+                       push(@{$Apache::lonrelrequtils::checkparms{$name}},$value);
                     }
-                } else {
-                    push(@{$Apache::lonrelrequtils::checkparms{$name}},$value);
-                }
-            } elsif ($valuematch ne '') {
-                if (ref($Apache::lonrelrequtils::checkparmsmatch{$name}) eq 'ARRAY') {
-                    unless(grep(/^\Q$name\E$/,@{$Apache::lonrelrequtils::checkparmsmatch{$name}})) {
-                        push(@{$Apache::lonrelrequtils::checkparmsmatch{$name}},$valuematch);
+                } elsif ($valuematch ne '') {
+                    if (ref($Apache::lonrelrequtils::checkparmvalsmatch{$name}) eq 'ARRAY') {
+                        unless(grep(/^\Q$name\E$/,@{$Apache::lonrelrequtils::checkparmvalsmatch{$name}})) {
+                            push(@{$Apache::lonrelrequtils::checkparmvalsmatch{$name}},$valuematch);
+                       }
+                    } else {
+                        push(@{$Apache::lonrelrequtils::checkparmvalsmatch{$name}},$valuematch);
                     }
-                } else {
-                    push(@{$Apache::lonrelrequtils::checkparmsmatch{$name}},$valuematch);
                 }
             }
         } elsif ($item eq 'resourcetag') {
@@ -298,13 +305,18 @@ sub init_global_hashes {
         } elsif ($item eq 'course') {
             if ($name eq 'crstype') {
                 $Apache::lonrelrequtils::checkcrstypes{$value} = $Apache::lonnet::needsrelease{$key};
+            } elsif ($name eq 'courserestype') {
+                if ($value eq 'exttool') {
+                    ($Apache::lonrelrequtils::exttool{major},$Apache::lonrelrequtils::exttool{minor}) =
+                    split(/\./,$Apache::lonnet::needsrelease{$key});
+                }
             }
         }
     }
     ($Apache::lonrelrequtils::anonsurvey{major},$Apache::lonrelrequtils::anonsurvey{minor}) =
-        split(/\./,$Apache::lonnet::needsrelease{'parameter:type:anonsurvey:'});
+        split(/\./,$Apache::lonnet::needsrelease{'parameter:type:anonsurvey::'});
     ($Apache::lonrelrequtils::randomizetry{major},$Apache::lonrelrequtils::randomizetry{minor}) =
-        split(/\./,$Apache::lonnet::needsrelease{'parameter:type:randomizetry:'});
+        split(/\./,$Apache::lonnet::needsrelease{'parameter:type:randomizetry::'});
     return;
 }
 
@@ -362,18 +374,18 @@ sub parameter_constraints {
                         }
                         if (grep(/^\Q$value\E$/,@{$Apache::lonrelrequtils::checkparms{$item}})) {
                             my ($major,$minor) = 
-                                split(/\./,$Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value.':'});
+                                split(/\./,$Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value.'::'});
                             ($reqdmajor,$reqdminor) =
                                 &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
                         }
                     }
                 }
             }
-            foreach my $item (keys(%Apache::lonrelrequtils::checkparmsmatch)) { 
+            foreach my $item (keys(%Apache::lonrelrequtils::checkparmvalsmatch)) { 
                 if ($key =~ /(\Q$item\E)$/) {
-                    if (ref($Apache::lonrelrequtils::checkparmsmatch{$item}) eq 'ARRAY') {
+                    if (ref($Apache::lonrelrequtils::checkparmvalsmatch{$item}) eq 'ARRAY') {
                         my $value = $resourcedata->{$key};
-                        foreach my $entry (@{$Apache::lonrelrequtils::checkparmsmatch{$item}}) {
+                        foreach my $entry (@{$Apache::lonrelrequtils::checkparmvalsmatch{$item}}) {
                             my $regexp;
                             if (($item eq 'lenient') && ($entry eq 'weighted')) {
                                 $regexp = '^[\-\.\d]+,[\-\.\d]+,[\-\.\d]+,[\-\.\d]+$';      
@@ -385,7 +397,7 @@ sub parameter_constraints {
                             if ($regexp ne '') {
                                 if ($value =~ /$regexp/) {
                                     my ($major,$minor) =
-                                        split(/\./,$Apache::lonnet::needsrelease{'parameter:'.$item.'::'.$entry});
+                                        split(/\./,$Apache::lonnet::needsrelease{'parameter:'.$item.'::'.$entry.':'});
                                     ($reqdmajor,$reqdminor) =
                                         &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
                                     last;
@@ -395,6 +407,21 @@ sub parameter_constraints {
                     }
                 }
             }
+            foreach my $item (keys(%Apache::lonrelrequtils::checkparmnamesmatch)) {
+                my $regexp;
+                if ($item eq 'maplevelrecurse') {
+                    $regexp = '\.(?:sequence|page)___\(rec\)\.';
+                }
+                if ($regexp ne '') {
+                    if ($key =~ /$regexp/) {
+                        my ($major,$minor) =
+                          split(/\./,$Apache::lonnet::needsrelease{'parameter::::'.$item});
+                          ($reqdmajor,$reqdminor) =
+                              &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
+
+                    }
+                }
+            }
         }
     }
     return ($reqdmajor,$reqdminor);
@@ -417,7 +444,7 @@ sub commblock_constraints {
     if (keys(%comm_blocks) > 0) {
         foreach my $block (keys(%comm_blocks)) {
             if ($block =~ /^firstaccess____(.+)$/) {
-                my ($major,$minor) = split(/\./,$Apache::lonnet::needsrelease{'course:commblock:timer:'});
+                my ($major,$minor) = split(/\./,$Apache::lonnet::needsrelease{'course:commblock:timer'});
                 ($reqdmajor,$reqdminor) = &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
                 last;
             } elsif ($block =~ /^(\d+)____(\d+)$/) {
@@ -428,13 +455,13 @@ sub commblock_constraints {
                 if (ref($comm_blocks{$block}{'blocks'}) eq 'HASH') {
                     if (ref($comm_blocks{$block}{'blocks'}{'docs'}) eq 'HASH') {
                         if (keys(%{$comm_blocks{$block}{'blocks'}{'docs'}}) > 0) {
-                            my ($major,$minor) = split(/\./,$Apache::lonnet::needsrelease{'course:commblock:docs:'});
+                            my ($major,$minor) = split(/\./,$Apache::lonnet::needsrelease{'course:commblock:docs'});
                             ($reqdmajor,$reqdminor) = &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
                             last;
                         }
                     }
                     if ($comm_blocks{$block}{'blocks'}{'printout'} eq 'on') {
-                        my ($major,$minor) = split(/\./,$Apache::lonnet::needsrelease{'course:commblock:printout:'});
+                        my ($major,$minor) = split(/\./,$Apache::lonnet::needsrelease{'course:commblock:printout'});
                         ($reqdmajor,$reqdminor) = &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
                         last;
                     }
@@ -454,8 +481,12 @@ sub coursecontent_constraints {
         my %randomizetrysubm = &Apache::lonnet::dump('nohist_randomizetry',
                                                      $cdom,$cnum);
         my %allresponses;
-        my ($anonsurv_subm,$randbytry_subm);
-        foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) {
+        my ($anonsurv_subm,$randbytry_subm,$exttool);
+        foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0)) {
+            if ($res->is_tool()) {
+                $exttool ++;
+                next;
+            }
             my %responses = $res->responseTypes();
             foreach my $key (keys(%responses)) {
                 next unless(exists($Apache::lonrelrequtils::checkresponsetypes{$key}));
@@ -476,6 +507,10 @@ sub coursecontent_constraints {
             my ($major,$minor) = split(/\./,$Apache::lonrelrequtils::checkresponsetypes{$key});
             ($reqdmajor,$reqdminor) = &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
         }
+        if ($exttool) {
+            ($reqdmajor,$reqdminor) = &update_reqd_loncaparev($Apache::lonrelrequtils::exttool{major},
+                                                              $Apache::lonrelrequtils::exttool{minor}); 
+        }
         if ($anonsurv_subm) {
             ($reqdmajor,$reqdminor) = &update_reqd_loncaparev($Apache::lonrelrequtils::anonsurvey{major},
                                           $Apache::lonrelrequtils::anonsurvey{minor},$reqdmajor,$reqdminor);