Diff for /rat/lonuserstate.pm between versions 1.48 and 1.72

version 1.48, 2002/12/12 18:00:24 version 1.72, 2004/04/05 18:25:08
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (Server for RAT Maps  
 #  
 # (Edit Handler for RAT Maps  
 # (TeX Content Handler  
 #  
 # YEAR=2000  
 # 05/29/00,05/30 Gerd Kortemeyer)  
 # 7/1 Gerd Kortemeyer)  
 # 7/1,7/3,7/4,7/7,7/8,7/10 Gerd Kortemeyer)  
 #  
 # 7/15,7/17,7/18,8/1,8/2,8/4,8/5,8/21,8/22,8/23,8/30,  
 # 9/2,9/4,9/29,9/30,10/2,10/11,10/30,10/31,  
 # 11/1,11/2,11/14,11/16,11/22,12/28,  
 # YEAR=2001  
 # 07/05/01,08/30,08/31 Gerd Kortemeyer  
 # 12/16 Scott Harrison  
 #  
 ###  ###
   
 package Apache::lonuserstate;  package Apache::lonuserstate;
Line 68  my @cond;    # Array with all of the con Line 51  my @cond;    # Array with all of the con
 my $errtext; # variable with all errors  my $errtext; # variable with all errors
 my $retfurl; # variable with the very first URL in the course  my $retfurl; # variable with the very first URL in the course
 my %randompick; # randomly picked resources  my %randompick; # randomly picked resources
 my %actualversion; # version of resource as loaded now  my %randompickseed; # optional seed for randomly picking resources
 my %setversion; # forced version of resource  
 my %lastversion; # version when CC came in last  # ----------------------------------- Remove version from URL and store in hash
 my $versionmode; # how versioning is handled in this course  
   sub versiontrack {
       my $uri=shift;
       if ($uri=~/\.(\d+)\.\w+$/) {
    my $version=$1;
    $uri=~s/\.\d+\.(\w+)$/\.$1/;
           unless ($hash{'version_'.$uri}) {
       $hash{'version_'.$uri}=$version;
    }
       }
       return $uri;
   }
   
   # -------------------------------------------------------------- Put in version
   
   sub putinversion {
       my $uri=shift;
       if ($hash{'version_'.$uri}) {
    my $version=$hash{'version_'.$uri};
    if ($version eq 'mostrecent') { return $uri; }
    if ($version eq &Apache::lonnet::getversion(
    &Apache::lonnet::filelocation('',$uri))) 
                { return $uri; }
    $uri=~s/\.(\w+)$/\.$version\.$1/;
       }
       return $uri;
   }
   
   # ----------------------------------------- Processing versions file for course
   
   sub processversionfile {
       my %cenv=@_;
       my %versions=&Apache::lonnet::dump('resourceversions',
          $cenv{'domain'},
          $cenv{'num'});
       foreach (keys %versions) {
    if ($_=~/^error\:/) { return; }
    $hash{'version_'.$_}=$versions{$_};
       }
   }
   
 # --------------------------------------------------------- Loads map from disk  # --------------------------------------------------------- Loads map from disk
   
Line 85  sub loadmap { Line 107  sub loadmap {
     $hash{'map_id_'.$lpc}=$uri;      $hash{'map_id_'.$lpc}=$uri;
   
 # Determine and check filename  # Determine and check filename
     my $fn=&Apache::lonnet::filelocation('',$uri);      my $fn=&Apache::lonnet::filelocation('',&putinversion($uri));
   
     my $ispage=($fn=~/\.page$/);      my $ispage=($fn=~/\.page$/);
   
Line 97  sub loadmap { Line 119  sub loadmap {
   
     my $instr=&Apache::lonnet::getfile($fn);      my $instr=&Apache::lonnet::getfile($fn);
   
     unless ($instr == -1) {      unless ($instr eq -1) {
   
 # Successfully got file, parse it  # Successfully got file, parse it
   
Line 119  sub loadmap { Line 141  sub loadmap {
   
                     $hash{'kind_'.$rid}='res';                      $hash{'kind_'.$rid}='res';
                     $hash{'title_'.$rid}=$token->[2]->{'title'};                      $hash{'title_'.$rid}=$token->[2]->{'title'};
                     my $turi=$token->[2]->{'src'};                      my $turi=&versiontrack($token->[2]->{'src'});
                     $Apache::lonnet::titlecache{                      if ($token->[2]->{'version'}) {
      &Apache::lonnet::symbclean(   unless ($hash{'version_'.$turi}) {
                       &Apache::lonnet::declutter($uri).'___'.      $hash{'version_'.$turi}=$1;
                       $token->[2]->{'id'}.'___'.   }
       &Apache::lonnet::declutter($turi))}=      }
                           $token->[2]->{'title'};      &Apache::lonnet::do_cache(\%Apache::lonnet::titlecache,
          &Apache::lonnet::encode_symb($uri,$token->[2]->{'id'},
       $turi),
         $token->[2]->{'title'},'title');
                     unless ($ispage) {                      unless ($ispage) {
                         $turi=~/\.(\w+)$/;                          $turi=~/\.(\w+)$/;
                         my $embstyle=&Apache::loncommon::fileembstyle($1);                          my $embstyle=&Apache::loncommon::fileembstyle($1);
Line 134  sub loadmap { Line 159  sub loadmap {
                         } elsif ($turi=~/^\/*uploaded\//) { # uploaded                          } elsif ($turi=~/^\/*uploaded\//) { # uploaded
     if (($embstyle eq 'img') || ($embstyle eq 'emb')      if (($embstyle eq 'img') || ($embstyle eq 'emb')
                              || ($embstyle eq 'ssi')) {                               || ($embstyle eq 'ssi')) {
                                 $turi='/adm/wrapper'.$turi;                                  unless ($turi =~/\.page$/) {
                                       $turi='/adm/wrapper'.$turi;
                                   }
                             } elsif ($turi!~/\.(sequence|page)$/) {                              } elsif ($turi!~/\.(sequence|page)$/) {
  $turi='/adm/coursedocs/showdoc'.$turi;   $turi='/adm/coursedocs/showdoc'.$turi;
                             }                              }
                         } else { # normal internal resource                          } elsif ($turi=~/\S/) { # normal non-empty internal resource
                            if (($embstyle eq 'img') || ($embstyle eq 'emb')      my $mapdir=$uri;
              || ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/)) {      $mapdir=~s/[^\/]+$//;
        $turi='/adm/wrapper'.$turi;      $turi=&Apache::lonnet::hreflocation($mapdir,$turi);
                            }      if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
    $turi='/adm/wrapper'.$turi;
       }
                         }                          }
     }      }
                     $hash{'src_'.$rid}=$turi;  # Store reverse lookup, remove query string
       my $idsuri=$turi;
                     if (defined($hash{'ids_'.$turi})) {      $idsuri=~s/\?.+$//;
                         $hash{'ids_'.$turi}.=','.$rid;                      if (defined($hash{'ids_'.$idsuri})) {
                           $hash{'ids_'.$idsuri}.=','.$rid;
                     } else {                      } else {
                         $hash{'ids_'.$turi}=''.$rid;                          $hash{'ids_'.$idsuri}=''.$rid;
                     }                      }
                  
                       if
           ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) {
    $turi.='?register=1';
       }
   
                       $hash{'src_'.$rid}=$turi;
   
                     if ($token->[2]->{'external'} eq 'true') {                      if ($token->[2]->{'external'} eq 'true') {
                         $hash{'ext_'.$rid}='true:';                          $hash{'ext_'.$rid}='true:';
Line 222  sub loadmap { Line 259  sub loadmap {
 # ------------------------------------------------------------------- Parameter  # ------------------------------------------------------------------- Parameter
   
                     my $referid=$lpc.'.'.$token->[2]->{'to'};                      my $referid=$lpc.'.'.$token->[2]->{'to'};
                     my $part=$token->[2]->{'part'};      my $name=$token->[2]->{'name'};
                     unless ($part) { $part=0; }      my $part;
       if ($name=~/^parameter_(.*)_/) {
    $part=$1;
       } else {
    $part=0;
       }
       $name=~s/^.*_([^_]*)$/$1/;
                     my $newparam=                      my $newparam=
  &Apache::lonnet::escape($token->[2]->{'type'}).':'.   &Apache::lonnet::escape($token->[2]->{'type'}).':'.
  &Apache::lonnet::escape($part.'.'.   &Apache::lonnet::escape($part.'.'.$name).'='.
                          $token->[2]->{'name'}).'='.  
  &Apache::lonnet::escape($token->[2]->{'value'});   &Apache::lonnet::escape($token->[2]->{'value'});
                     if (defined($hash{'param_'.$referid})) {                      if (defined($hash{'param_'.$referid})) {
                         $hash{'param_'.$referid}.='&'.$newparam;                          $hash{'param_'.$referid}.='&'.$newparam;
Line 240  sub loadmap { Line 282  sub loadmap {
                     if ($token->[2]->{'name'} eq 'parameter_randompick') {                      if ($token->[2]->{'name'} eq 'parameter_randompick') {
  $randompick{$referid}=$token->[2]->{'value'};   $randompick{$referid}=$token->[2]->{'value'};
                     }                      }
                       if ($token->[2]->{'name'} eq 'parameter_randompickseed') {
    $randompick{$referid}=$token->[2]->{'value'};
                       }
                 }                   } 
   
             }              }
Line 369  sub accinit { Line 414  sub accinit {
     my $resid=$_;      my $resid=$_;
             my $uri=$hash{'src_'.$resid};              my $uri=$hash{'src_'.$resid};
             $uri=~s/^\/adm\/wrapper//;              $uri=~s/^\/adm\/wrapper//;
               $uri=&Apache::lonnet::declutter($uri);
             my @uriparts=split(/\//,$uri);              my @uriparts=split(/\//,$uri);
             my $urifile=$uriparts[$#uriparts];              my $urifile=$uriparts[$#uriparts];
             $#uriparts--;              $#uriparts--;
             my $uripath=join('/',@uriparts);              my $uripath=join('/',@uriparts);
             $uripath=~s/^\/res\///;  
            if ($uripath) {             if ($uripath) {
             my $uricond='0';              my $uricond='0';
             if (defined($hash{'conditions_'.$resid})) {              if (defined($hash{'conditions_'.$resid})) {
Line 381  sub accinit { Line 426  sub accinit {
             }              }
             if (defined($acchash{'acc.res.'.$short.'.'.$uripath})) {              if (defined($acchash{'acc.res.'.$short.'.'.$uripath})) {
                 if ($acchash{'acc.res.'.$short.'.'.$uripath}=~                  if ($acchash{'acc.res.'.$short.'.'.$uripath}=~
                    /(\&$urifile\:[^\&]*)/) {                     /(\&\Q$urifile\E\:[^\&]*)/) {
     my $replace=$1;      my $replace=$1;
                     my $regexp=$replace;                      my $regexp=$replace;
                     $regexp=~s/\|/\\\|/g;                      $regexp=~s/\|/\\\|/g;
Line 418  sub pickrandom { Line 463  sub pickrandom {
         my $mpc=$hash{'map_pc_'.$hash{'src_'.$rid}};          my $mpc=$hash{'map_pc_'.$hash{'src_'.$rid}};
 # ------------------------------------------- put existing resources into array  # ------------------------------------------- put existing resources into array
         my @currentrids=();          my @currentrids=();
         foreach (keys %hash) {          foreach (sort(keys(%hash))) {
     if ($_=~/^src_($mpc\.\d+)/) {      if ($_=~/^src_($mpc\.\d+)/) {
  if ($hash{'src_'.$1}) { push @currentrids, $1; }   if ($hash{'src_'.$1}) { push @currentrids, $1; }
             }              }
         }          }
    # rids are number.number and we want to numercially sort on 
           # the second number
    @currentrids=sort {
       my (undef,$aid)=split(/\./,$a);
       my (undef,$bid)=split(/\./,$b);
       $aid <=> $bid;
    } @currentrids;
         next if ($#currentrids<$rndpick);          next if ($#currentrids<$rndpick);
 # -------------------------------- randomly eliminate the ones that should stay  # -------------------------------- randomly eliminate the ones that should stay
  srand(&Apache::lonnet::rndseed($rid)); # use rid instead of symb   my (undef,$id)=split(/\./,$rid);
         for (my $i=1;$i<=$rndpick;$i++) {          if ($randompickseed{$rid}) { $id=$randompickseed{$rid}; }
             while (1) {   my $rndseed=&Apache::lonnet::rndseed($id); # use id instead of symb
  my $randomidx=int(rand($#currentrids+1));   &Apache::lonnet::setup_random_from_rndseed($rndseed);
                 if ($currentrids[$randomidx]) {   my @whichids=&Math::Random::random_permuted_index($#currentrids+1);
     $currentrids[$randomidx]='';          for (my $i=1;$i<=$rndpick;$i++) { $currentrids[$whichids[$i]]=''; }
                     last;   #&Apache::lonnet::logthis("$id,$rndseed,".join(':',@whichids));
                 }  
             }  
         }  
 # -------------------------------------------------------- delete the leftovers  # -------------------------------------------------------- delete the leftovers
         for (my $k=0; $k<=$#currentrids; $k++) {          for (my $k=0; $k<=$#currentrids; $k++) {
             if ($currentrids[$k]) {              if ($currentrids[$k]) {
Line 481  sub readmap { Line 530  sub readmap {
     %parmhash=();      %parmhash=();
     $errtext='';      $errtext='';
     $pc=0;      $pc=0;
       &processversionfile(%cenv);
     my $furi=&Apache::lonnet::clutter($uri);      my $furi=&Apache::lonnet::clutter($uri);
     $hash{'src_0.0'}=$furi;      $hash{'src_0.0'}=&versiontrack($furi);
     $hash{'title_0.0'}=&Apache::lonnet::metadata($uri,'title');      $hash{'title_0.0'}=&Apache::lonnet::metadata($uri,'title');
     $hash{'ids_'.$furi}='0.0';      $hash{'ids_'.$furi}='0.0';
     $hash{'is_map_0.0'}=1;      $hash{'is_map_0.0'}=1;
Line 492  sub readmap { Line 542  sub readmap {
         &accinit($uri,$short,$fn);          &accinit($uri,$short,$fn);
         &pickrandom();          &pickrandom();
     }      }
 # ------------------------------------------------------------ Version tracking  # ------------------------------------------------------- Put versions into src
 #    if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {      foreach (keys %hash) {
 # &Apache::lonnet::logthis('Will be version tracking');   if ($_=~/^src\_/) {
 #    }      $hash{$_}=&putinversion($hash{$_});
    }
       }
     unless ((untie(%hash)) && (untie(%parmhash))) {      unless ((untie(%hash)) && (untie(%parmhash))) {
       &Apache::lonnet::logthis("<font color=blue>WARNING: ".        &Apache::lonnet::logthis("<font color=blue>WARNING: ".
                        "Could not untie coursemap $fn for $uri.</font>");                          "Could not untie coursemap $fn for $uri.</font>"); 

Removed from v.1.48  
changed lines
  Added in v.1.72


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.