--- loncom/interface/lonrelrequtils.pm 2015/09/13 21:48:05 1.4 +++ loncom/interface/lonrelrequtils.pm 2018/01/03 04:20:54 1.7 @@ -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.7 2018/01/03 04:20:54 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); @@ -485,6 +520,14 @@ sub coursecontent_constraints { $Apache::lonrelrequtils::randomizetry{minor},$reqdmajor,$reqdminor); } } + my $suppmap = 'supplemental.sequence'; + my ($suppcount,$suppexttools,$errors) = (0,0,0); + ($suppcount,$suppexttools,$errors) = + &Apache::loncommon::recurse_supplemental($cnum,$cdom,$suppmap,$suppcount,$suppexttools,$errors); + if ($suppexttools) { + ($reqdmajor,$reqdminor) = &update_reqd_loncaparev($Apache::lonrelrequtils::exttool{major}, + $Apache::lonrelrequtils::exttool{minor}); + } return ($reqdmajor,$reqdminor); }