Diff for /rat/lonsequence.pm between versions 1.1 and 1.14

version 1.1, 2000/10/16 20:47:39 version 1.14, 2002/08/31 00:43:13
Line 2 Line 2
 #  #
 # Sequence Handler  # Sequence Handler
 #  #
   # $Id$
   #
   # Copyright Michigan State University Board of Trustees
   #
   # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
 # (Handler to resolve ambiguous file locations  # (Handler to resolve ambiguous file locations
 #  #
 # (TeX Content Handler  # (TeX Content Handler
Line 12 Line 36
 #  #
 # 10/16 Gerd Kortemeyer  # 10/16 Gerd Kortemeyer
   
 package Apache::lonambiguous;  package Apache::lonsequence;
   
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::Constants qw(:common REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
 use GDBM_File;  use GDBM_File;
   use Apache::lonratedt;
   use Apache::lonratsrv;
   use Apache::lonpageflip;
   use Apache::loncommon;
   
   my %selhash;
   my $successtied;
   
   # ----------------------------------------- Attempt to read from resource space
   
   sub attemptread {
       my $fn=shift;
       &Apache::lonnet::repcopy($fn);
       if (-e $fn) {
    return &Apache::lonratedt::attemptread($fn);
       } else {
           return ();
       }
   }
   
   # ---------------------------------------------------------------- View Handler
   
   sub viewmap {
       my ($r,$url)=@_;
       $r->print('<html>');
       if ($ENV{'form.forceselect'}) { $r->print(<<ENDSCRIPT);
   <script>
   
 # ----------------------------------------------------------- Could not resolve  function select_group() {
       window.location="/adm/groupsort?catalogmode=groupsec&mode=rat&acts="+document.forms.fileattr.acts.value;
   }
   
 sub getlost {  function queue(val) {
     my ($r,$errmsg)=@_;      if (eval("document.forms."+val+".filelink.checked")) {
     $r->content_type('text/html');   var l=val.length;
     $r->send_http_header;   var v=val.substring(4,l);
     $r->print(   document.forms.fileattr.acts.value+='1a'+v+'b';
  '<head><title>Unknown Error</title></head><body bgcolor="#FFFFFF"><h1>'.      }
  'LON-CAPA</h1>Could not handle ambiguous resource reference.<p>'.$errmsg.      else {
  '</body></html>');   var l=val.length;
    var v=val.substring(4,l);
    document.forms.fileattr.acts.value+='0a'+v+'b';
       }
 }  }
   
   </script>
   ENDSCRIPT
       }
       $r->print(&Apache::loncommon::bodytag('Map Contents').'<h1>'.$url.'</h1>');
   # ------------------ This is trying to select. Provide buttons and tie %selhash
       if ($ENV{'form.forceselect'}) { $r->print(<<ENDSELECT);
   <form name=fileattr><input type=hidden name=acts value=''>
   <input type="button" name="close" value='CLOSE' onClick="self.close()">
   <input type="button" name="groupimport" value='GROUP IMPORT'
   onClick="javascript:select_group()">
   </form>   
   ENDSELECT
       my $diropendb = 
       "/home/httpd/perl/tmp/$ENV{'user.domain'}\_$ENV{'user.name'}_groupsec.db";
           if (tie(%selhash,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {
       if ($ENV{'form.launch'} eq '1') {
          &start_fresh_session();
       }
               $successtied=1;
   
   # - Evaluate actions from previous page (both cumulatively and chronologically)
           if ($ENV{'form.catalogmode'} eq 'groupimport') {
       my $acts=$ENV{'form.acts'};
       my @Acts=split(/b/,$acts);
       my %ahash;
       my %achash;
       my $ac=0;
       # some initial hashes for working with data
       foreach (@Acts) {
    my ($state,$ref)=split(/a/);
    $ahash{$ref}=$state;
    $achash{$ref}=$ac;
    $ac++;
       }
       # sorting through the actions and changing the tied database hash
       foreach (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) {
    my $key=$_;
    if ($ahash{$key} eq '1') {
       $selhash{'store_'.$selhash{'pre_'.$key.'_link'}}=
    $selhash{'pre_'.$key.'_title'};
       $selhash{'storectr_'.$selhash{'pre_'.$key.'_link'}}=
    $selhash{'storectr'}+0;
       $selhash{'storectr'}++;
    }
    if ($ahash{$key} eq '0') {
       if ($selhash{'store_'.$selhash{'pre_'.$key.'_link'}}) {
          delete $selhash{'store_'.$selhash{'pre_'.$key.'_link'}};
       }
    }
       }
       # deleting the previously cached listing
       foreach (keys %selhash) {
    if ($_ =~ /^pre_/ && $_ =~/link$/) {
       my $key = $_;
       $key =~ s/^pre_//;
       $key =~ s/_[^_]*$//;
       delete $selhash{'pre_'.$key.'_title'};
       delete $selhash{'pre_'.$key.'_link'};
    }
       }
    }
   # -
           }
       }
   # ----------------------------- successtied is now '1' if in working selectmode
       my $idx=0;
       foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {
    if (defined($_)) {
               $idx++;
               if ($successtied) { 
    $r->print('<form name="form'.$idx.'">');
               }
       my ($title,$url)=split(/\:/,$_);
               $title=~s/\&colon\;/\:/g;
               $url=~s/\&colon\;/\:/g;
               unless ($title) { $title=(split(/\//,$url))[-1] };
               unless ($title) { $title='<i>Empty</i>'; }
               if ($url) {
    if ($successtied) {
       my $checked='';
              if ($selhash{'store_'.$url}) {
               $checked=" checked";
              }
              $selhash{"pre_${idx}_link"}=$url;
              $selhash{"pre_${idx}_title"}=$title;
   
       $r->print(<<ENDCHECKBOX);
   <input type='checkbox' name='filelink' 
   value='$url' onClick='javascript:queue("form$idx")'$checked>
   <input type='hidden' name='title' value='$title'>
   ENDCHECKBOX
                   }
    $r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">');
               }
               $r->print(&Apache::lonratsrv::qtescape($title));
               if ($url) { $r->print('</a>'); }
               if ($successtied) {
    $r->print('</form>');
               } else {
    $r->print('<br>');
               }
           }
       }
       $r->print('</body></html>');
       if ($successtied) {
    untie %selhash;
       }
   }
   
   # ----------------------------------------------------------- Clean out selhash
   sub start_fresh_session {
       foreach (keys %selhash) {
    if ($_ =~ /^pre_/) {
       delete $selhash{$_};
    }
    if ($_ =~ /^store/) {
       delete $selhash{$_};
    }
       }
   }
   
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
Line 42  sub handler { Line 219  sub handler {
       $r->send_http_header;        $r->send_http_header;
       return OK;        return OK;
    }     }
    
      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['forceselect','launch']);
   
      my %hash;
    my %bighash;     my %bighash;
 # ----------------------------------------------------------------- Tie db file     my $requrl=$r->uri;
   if ($ENV{'request.course.fn'}) {  
        my $envkey;     $successtied=0;
        if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',  # ------------------------------------------------------------ Tie symb db file
                     &GDBM_READER,0640)) {    my $disurl='';
           foreach $envkey (keys %ENV) {    my $dismapid='';
              if ($envkey=~/^form\.(\d+)\.(\d+)$/) {  
          my $mapid=$1;    if (($ENV{'request.course.fn'}) && (!$ENV{'form.forceselect'})) {
                  my $resid=$2;         my $last;
                  my $resurl=$bighash{'src_'.$mapid.'.'.$resid};         if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',
                  &Apache::lonnet::symblist($bighash{'map_id_'.$mapid},                      &GDBM_READER(),0640)) {
            $resurl => $resid);     $last=$hash{'last_direction'};
                  $r->header_out(Location =>              untie(%hash);
                                 'http://'.$ENV{'HTTP_HOST'}.$resurl);  
                  return REDIRECT;  
              }  
   }  
           untie(%bighash);  
        } else {  
           &getlost($r,'Could not access course structure.');  
           return OK;  
        }         }
    } else {         my $direction='';
       $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";         my $prevmap='';
       return HTTP_NOT_ACCEPTABLE;          if ($last) {
    }    ($prevmap,$direction)=(split(/\_\_\_/,$last));
          }
   # ------------------------------------------------------------- Tie big db file
          if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
                       &GDBM_READER(),0640)) {
      my $disid='';
   
    return OK;             if ($direction eq 'back') {
          $disid=$bighash{'map_finish_'.$requrl};
              } else {
                  $disid=$bighash{'map_start_'.$requrl};
              } 
              if ($disid) {
          $disurl=$bighash{'src_'.$disid};
                  $dismapid=(split(/\./,$disid))[1];
              }
   # ------------------------- If this is an empty one, skip to next non-empty one
              if ((!$disurl) && ($disid)) {
          $direction=($direction?$direction:'forward');
                  ($disid,$requrl)=
                            &Apache::lonpageflip::fullmove($disid,
                              &Apache::lonnet::declutter($requrl),$direction);
                  if ($disid) {
              $disurl=$bighash{'src_'.$disid};
                      $dismapid=(split(/\./,$disid))[1];
                  }
       }
   
 # ================================================================= TRASH BELOW  # --------------------------------------- Untie hash, make sure to come by here
              untie(%bighash);
          }
      }
   
 # ---------------------------------------------------------- Do we have a case?  # now either disurl is set (going to first page), or we need another display
   
    my $thisfn;     if ($disurl) {
    unless (($thisfn=$ENV{'request.ambiguous'})&&($ENV{'request.course.fn'})) {  # -------------------------------------------------- Has first or last resource
        &getlost($r,'Could not find information on resource.');        &Apache::lonnet::symblist($requrl,$disurl => $dismapid,
                      'last_known' => &Apache::lonnet::declutter($disurl)); 
         $r->content_type('text/html');
         $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$disurl);
         return REDIRECT;
      } else {
          $r->content_type('text/html');
          $r->send_http_header;
          &viewmap($r,$requrl);
        return OK;         return OK;
    }     }
         
 # ---------------------------------- Should this file have been part of a page?  
   
     $thisfn=&Apache::lonnet::declutter($thisfn);  
     my %hash;  
     my $syval='';  
       
     if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',  
                   &GDBM_READER,0640)) {  
        $syval=$hash{$thisfn};  
        untie(%hash);  
     }  
   
 # ---------------------------------------------------------- There was an entry  
   
     if ($syval) {  
   
        if ($syval=~/\_$/) {  
 # ----------------------------------- Okay, this should have appeared on a page  
    $syval=~s/\_\_\_$//;  
     $r->content_type('text/html');  
            $r->header_out(Location =>   
                 'http://'.$ENV{'HTTP_HOST'}.'/res/'.$syval);  
            return REDIRECT;  
        } else {  
 #  There is not really a problem (???), but cannot go back without endless loop  
            &getlost($r,'The nature of the problem is unclear');  
            return OK;  
        }  
     }  
   
 # ------------------------------------------------ Would be standalone resource  
   
    if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',  
                     &GDBM_READER,0640)) {  
 # ---------------------------------------------- Get ID(s) for current resource  
       my $ids=$bighash{'ids_/res/'.$thisfn};  
       if ($ids) {  
 # ------------------------------------------------------------------- Has ID(s)  
          my @possibilities=split(/\,/,$ids);  
          my $couldbe='';  
          map {  
              if (&Apache::lonnet::allowed('bre',$bighash{'src_'.$_})) {  
          if ($couldbe) {  
      $couldbe.=','.$_;  
                  } else {  
                      $couldbe=$_;  
                  }  
              }  
  } @possibilities;  
          if ($couldbe) {  
             @possibilities=split(/\,/,$couldbe);  
             if ($#possibilities>0) {  
 # ----------------------------------------------- Okay, really multiple choices  
                $r->content_type('text/html');  
                $r->send_http_header;  
                $r->print(<<ENDSTART);  
 <head><title>Choose Location</title></head>  
 <body bgcolor="#FFFFFF">  
 <h1>LON-CAPA</h1>  
 The resource you had been accessing appears more than once in this course,  
 and LON-CAPA has insufficient session information to determine which instance  
 of the resource you meant.  
 <p>  
 Please click on the instance of the resource you intended to access:  
 <p>  
 <form action="/adm/ambiguous" method=post>  
 <input type=hidden name=orgurl value="$thisfn">  
 <input type=hidden name=selecturl value=1>  
 <table border=2>  
 <tr><th>&nbsp;</th><th>Title</th><th>Type</th><th>Part of ...</th></tr>  
 ENDSTART  
                map {  
                    my $mapurl=$bighash{'map_id_'.(split(/\./,$_))[0]};  
                    $r->print('<tr><td><input type=submit value=Select name="'.  
                               $_.'"></td><td>'.$bighash{'title_'.$_}.  
                               '</td><td>'.$bighash{'type_'.$_}.  
                               '</td><td><a href="'.$mapurl.'">'.$mapurl.  
       '</a></td></tr>');  
                } @possibilities;  
                $r->print('</table></form></body></html>');  
        untie(%bighash);  
                return OK;  
             }  
          }  
       }  
       untie(%bighash);  
   }  
   
 # ------------------------------------ This handler should not have been called  
    &getlost($r,'Invalid call of handler');  
    return OK;  
 }  }
   
 1;  1;

Removed from v.1.1  
changed lines
  Added in v.1.14


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>