--- loncom/interface/lonrelrequtils.pm 2014/06/07 19:13:42 1.1 +++ loncom/interface/lonrelrequtils.pm 2016/03/04 21:43:16 1.5 @@ -1,7 +1,7 @@ #!/usr/bin/perl # The LearningOnline Network # -# $Id: lonrelrequtils.pm,v 1.1 2014/06/07 19:13:42 raeburn Exp $ +# $Id: lonrelrequtils.pm,v 1.5 2016/03/04 21:43:16 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -84,7 +84,7 @@ Inputs: 5 Returns major version and minor version requirements for a course, based on parameters in use in the course. (Parameters which have -version requirements are listed in /home/httpd/lonTabs/releaseslist.xml +version requirements are listed in /home/httpd/lonTabs/releaseslist.xml). Inputs: 2 @@ -265,20 +265,37 @@ use LONCAPA qw(:DEFAULT :match); sub init_global_hashes { %Apache::lonrelrequtils::checkparms = (); + %Apache::lonrelrequtils::checkparmvalsmatch = (); + %Apache::lonrelrequtils::checkparmnamesmatch = (); %Apache::lonrelrequtils::checkresponsetypes = (); %Apache::lonrelrequtils::checkcrstypes = (); %Apache::lonrelrequtils::anonsurvey = (); %Apache::lonrelrequtils::randomizetry = (); foreach my $key (keys(%Apache::lonnet::needsrelease)) { - my ($item,$name,$value) = split(/:/,$key); + my ($item,$name,$value,$valuematch,$namematch) = split(/:/,$key); if ($item eq 'parameter') { - 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); + } + } 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::checkparms{$name}},$value); } } elsif ($item eq 'resourcetag') { if ($name eq 'responsetype') { @@ -291,9 +308,9 @@ sub init_global_hashes { } } ($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; } @@ -323,6 +340,7 @@ sub parameter_constraints { my ($cnum,$cdom) = @_; my ($reqdmajor,$reqdminor); my $resourcedata=&read_paramdata($cnum,$cdom); + my $now = time; if (ref($resourcedata) eq 'HASH') { foreach my $key (keys(%{$resourcedata})) { foreach my $item (keys(%Apache::lonrelrequtils::checkparms)) { @@ -335,15 +353,69 @@ sub parameter_constraints { } else { $value = ''; } + } elsif ($item eq 'printstartdate') { + if ($value =~ /^\d+$/) { + if ($value > $now) { + $value = 'future'; + } + } + } elsif ($item eq 'printenddate') { + if ($value =~ /^\d+$/) { + if ($value < $now) { + $value = 'past'; + } + } } if (grep(/^\Q$value\E$/,@{$Apache::lonrelrequtils::checkparms{$item}})) { - my ($major,$minor) = split(/\./,$Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value}); + my ($major,$minor) = + split(/\./,$Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value.'::'}); ($reqdmajor,$reqdminor) = &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor); } } } } + foreach my $item (keys(%Apache::lonrelrequtils::checkparmvalsmatch)) { + if ($key =~ /(\Q$item\E)$/) { + if (ref($Apache::lonrelrequtils::checkparmvalsmatch{$item}) eq 'ARRAY') { + my $value = $resourcedata->{$key}; + foreach my $entry (@{$Apache::lonrelrequtils::checkparmvalsmatch{$item}}) { + my $regexp; + if (($item eq 'lenient') && ($entry eq 'weighted')) { + $regexp = '^[\-\.\d]+,[\-\.\d]+,[\-\.\d]+,[\-\.\d]+$'; + } elsif (($item eq 'acc') && ($entry eq '_denyfrom_')) { + $regexp = '\!'; + } elsif (($item eq 'interval') && ($entry eq 'done')) { + $regexp = '^\d+_done$'; + } + if ($regexp ne '') { + if ($value =~ /$regexp/) { + my ($major,$minor) = + split(/\./,$Apache::lonnet::needsrelease{'parameter:'.$item.'::'.$entry.':'}); + ($reqdmajor,$reqdminor) = + &update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor); + last; + } + } + } + } + } + } + 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);