--- rat/lonuserstate.pm 2021/12/14 22:52:33 1.149.2.5 +++ rat/lonuserstate.pm 2016/01/26 14:30:40 1.150 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construct and maintain state and binary representation of course for user # -# $Id: lonuserstate.pm,v 1.149.2.5 2021/12/14 22:52:33 raeburn Exp $ +# $Id: lonuserstate.pm,v 1.150 2016/01/26 14:30:40 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ use Safe::Hole; use Opcode; use Apache::lonenc; use Fcntl qw(:flock); -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); use File::Basename; @@ -62,8 +62,6 @@ my %randomorder; # maps to order content my %randomizationcode; # code used to grade folder for bubblesheet exam my %encurl; # URLs in this folder are supposed to be encrypted my %hiddenurl; # this URL (or complete folder) is supposed to be hidden -my %rescount; # count of unhidden items in each map -my %mapcount; # count of unhidden maps in each map # ----------------------------------- Remove version from URL and store in hash @@ -242,8 +240,6 @@ sub loadmap { my @map_ids; my $codechecked; - $rescount{$lpc} = 0; - $mapcount{$lpc} = 0; while (my $token = $parser->get_token) { next if ($token->[0] ne 'S'); @@ -253,13 +249,6 @@ sub loadmap { my $resource_id = &parse_resource($token,$lpc,$ispage,$uri,$courseid); if (defined $resource_id) { push(@map_ids, $resource_id); - if ($hash{'src_'.$lpc.'.'.$resource_id}) { - $rescount{$lpc} ++; - if (($hash{'src_'.$lpc.'.'.$resource_id}=~/\.sequence$/) || - ($hash{'src_'.$lpc.'.'.$resource_id}=~/\.page$/)) { - $mapcount{$lpc} ++; - } - } unless ($codechecked) { my $startsymb = &Apache::lonnet::encode_symb($hash{'map_id_'.$lpc},$resource_id, @@ -289,10 +278,19 @@ sub loadmap { } undef($codechecked); + # Handle randomization and random selection if ($randomize) { - unless (&is_advanced($courseid)) { + my $advanced; + if ($env{'request.course.id'}) { + $advanced = (&Apache::lonnet::allowed('adv') eq 'F'); + } else { + $env{'request.course.id'} = $courseid; + $advanced = (&Apache::lonnet::allowed('adv') eq 'F'); + $env{'request.course.id'} = ''; + } + unless ($advanced) { # Order of resources is not randomized if user has and advanced role in the course. my $seed; @@ -340,6 +338,7 @@ sub loadmap { @map_ids=&Math::Random::random_permutation(@map_ids); } + my $from = shift(@map_ids); my $from_rid = $lpc.'.'.$from; $hash{'map_start_'.$uri} = $from_rid; @@ -364,7 +363,7 @@ sub loadmap { $parser = HTML::TokeParser->new(\$instr); $parser->attr_encoded(1); - # last parse out the mapalias params. These provide mnemonic + # last parse out the mapalias params. Thes provide mnemonic # tags to resources that can be used in conditions while (my $token = $parser->get_token) { @@ -375,18 +374,6 @@ sub loadmap { } } -sub is_advanced { - my ($courseid) = @_; - my $advanced; - if ($env{'request.course.id'}) { - $advanced = (&Apache::lonnet::allowed('adv') eq 'F'); - } else { - $env{'request.course.id'} = $courseid; - $advanced = (&Apache::lonnet::allowed('adv') eq 'F'); - $env{'request.course.id'} = ''; - } - return $advanced; -} # -------------------------------------------------------------------- Resource # @@ -473,11 +460,7 @@ sub parse_resource { # is not a page. If the resource is a page then it must be # assembled (at fetch time?). - if ($ispage) { - if ($token->[2]->{'external'} eq 'true') { # external - $turi=~s{^http\://}{/ext/}; - } - } else { + unless ($ispage) { $turi=~/\.(\w+)$/; my $embstyle=&Apache::loncommon::fileembstyle($1); if ($token->[2]->{'external'} eq 'true') { # external @@ -492,6 +475,8 @@ sub parse_resource { } elsif ($turi!~/\.(sequence|page)$/) { $turi='/adm/coursedocs/showdoc'.$turi; } + } elsif ($turi=~ m{^/adm/$match_domain/$match_courseid/\d+/exttools?$}) { + $turi='/adm/wrapper'.$turi; } elsif ($turi=~/\S/) { # normal non-empty internal resource my $mapdir=$uri; $mapdir=~s/[^\/]+$//; @@ -567,9 +552,7 @@ sub parse_resource { if (($turi=~/\.sequence$/) || ($turi=~/\.page$/)) { $hash{'is_map_'.$rid}=1; - if ((!$hiddenurl{$rid}) || (&is_advanced($courseid))) { - &loadmap($turi,$rid,$courseid); - } + &loadmap($turi,$rid,$courseid); } return $token->[2]->{'id'}; } @@ -725,7 +708,7 @@ sub parse_condition { # Typical attributes: # to=n - Number of the resource the parameter applies to. # type=xx - Type of parameter value (e.g. string_yesno or int_pos). -# name=xxx - Name of parameter (e.g. parameter_randompick or parameter_randomorder). +# name=xxx - Name ofr parameter (e.g. parameter_randompick or parameter_randomorder). # value=xxx - value of the parameter. sub parse_param { @@ -1133,14 +1116,6 @@ sub hiddenurls { if ($currentrids[$k]) { $hash{'randomout_'.$currentrids[$k]}=1; my ($mapid,$resid)=split(/\./,$currentrids[$k]); - if ($rescount{$mapid}) { - $rescount{$mapid} --; - } - if ($hash{'is_map_'.$currentrids[$k]}) { - if ($mapcount{$mapid}) { - $mapcount{$mapid} --; - } - } $randomoutentry.='&'. &Apache::lonnet::encode_symb($hash{'map_id_'.$mapid}, $resid, @@ -1153,14 +1128,6 @@ sub hiddenurls { foreach my $rid (keys(%hiddenurl)) { $hash{'randomout_'.$rid}=1; my ($mapid,$resid)=split(/\./,$rid); - if ($rescount{$mapid}) { - $rescount{$mapid} --; - } - if ($hash{'is_map_'.$rid}) { - if ($mapcount{$mapid}) { - $mapcount{$mapid} --; - } - } $randomoutentry.='&'. &Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid, $hash{'src_'.$rid}).'&'; @@ -1171,36 +1138,10 @@ sub hiddenurls { } } -# -------------------------------------- populate big hash with map breadcrumbs - -# Create map_breadcrumbs_$pc from map_hierarchy_$pc by omitting intermediate -# maps not shown in Course Contents table. - -sub mapcrumbs { - foreach my $key (keys(%rescount)) { - if ($hash{'map_hierarchy_'.$key}) { - my $skipnext = 0; - foreach my $id (split(/,/,$hash{'map_hierarchy_'.$key}),$key) { - unless ($skipnext) { - $hash{'map_breadcrumbs_'.$key} .= "$id,"; - } - unless (($id == 0) || ($id == 1)) { - if ((!$rescount{$id}) || ($rescount{$id} == 1 && $mapcount{$id} == 1)) { - $skipnext = 1; - } else { - $skipnext = 0; - } - } - } - $hash{'map_breadcrumbs_'.$key} =~ s/,$//; - } - } -} - # ---------------------------------------------------- Read map and all submaps sub readmap { - my ($short,$critmsg_check) = @_; + my $short=shift; $short=~s/^\///; # TODO: Hidden dependency on current user: @@ -1217,7 +1158,7 @@ sub readmap { } @cond=('true:normal'); - unless (open(LOCKFILE,">","$fn.db.lock")) { + unless (open(LOCKFILE,">$fn.db.lock")) { # # Most likely a permissions problem on the lockfile or its directory. # @@ -1235,13 +1176,8 @@ sub readmap { &unlink_tmpfiles($fn); } undef %randompick; - undef %randompickseed; - undef %randomorder; - undef %randomizationcode; undef %hiddenurl; undef %encurl; - undef %rescount; - undef %mapcount; $retfrid=''; $errtext=''; my ($untiedhash,$untiedparmhash,$tiedhash,$tiedparmhash); # More state flags. @@ -1383,13 +1319,8 @@ sub readmap { $lock=1; } undef %randompick; - undef %randompickseed; - undef %randomorder; - undef %randomizationcode; undef %hiddenurl; undef %encurl; - undef %rescount; - undef %mapcount; $errtext=''; $retfrid=''; # @@ -1437,18 +1368,14 @@ sub readmap { # Depends on user must parameterize this as well..or separate as this is: # more part of determining what someone sees on entering a course? -# When lonuserstate::readmap() is called from lonroles.pm, i.e., -# after selecting a role in a course, critical_redirect will be called, -# unless the course has a blocking event in effect, which suppresses -# critical message checking (users without evb priv). -# - if ($critmsg_check) { - my ($redirect,$url) = &Apache::loncommon::critical_redirect(); - if ($redirect) { - $retfurl = $url; + my @what=&Apache::lonnet::dump('critical',$env{'user.domain'}, + $env{'user.name'}); + if ($what[0]) { + if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) { + $retfurl='/adm/email?critical=display'; } - } + } return ($retfurl,$errtext); } @@ -1512,7 +1439,6 @@ sub build_tmp_hashes { &traceroute('0',$hash{'map_start_'.$uri},'&'); &accinit($uri,$short,$fn); &hiddenurls(); - &mapcrumbs(); } $errtext .= &get_mapalias_errors(); # ------------------------------------------------------- Put versions into src @@ -1544,7 +1470,7 @@ sub build_tmp_hashes { # ---------------------------------------------------- Store away initial state { my $cfh; - if (open($cfh,">","$fn.state")) { + if (open($cfh,">$fn.state")) { print $cfh join("\n",@cond); $gotstate = 1; } else { @@ -1581,7 +1507,7 @@ sub evalstate { if (-e $fn) { my @conditions=(); { - open(my $fh,"<",$fn); + open(my $fh,"<$fn"); @conditions=<$fh>; close($fh); }